Skip to content

Client library and related utils to interface with KND (Nitrogen Logic's depth data server) from Ruby

License

Notifications You must be signed in to change notification settings

nitrogenlogic/nl-knd_client

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NL::KndClient

Client library for interacting with the Nitrogen Logic KND (Kinematic Network Daemon) server, which provides zone-based data from a Kinect.

There are two clients provided:

  • NL::KndClient::EMKndClient – a complex, older, but full-featured asynchronous client based on EventMachine. This is only available if the EventMachine gem is already present in your application's dependencies.
  • NL::KndClient::SimpleKndClient – a simple, newer, quick-and-dirty Thread-based client that is easier to use, but does not support all KND features.

Some data decoding functions are also provided as a C extension in NL::KndClient::Kinutils.

License

NL::KndClient is ©2011-2020 Mike Bourgeous.

NL::KndClient is licensed under the Affero GPL version 3 (AGPLv3). Feel free to get in touch if you would like to discuss more permissive terms.

Installation

This gem depends on the Nitrogen Logic C utility library, nlutils.

After installing nlutils, add this line to your application's Gemfile:

gem 'nl-knd_client', git: '[email protected]:nitrogenlogic/nl-knd_client.git'

And then execute:

$ bundle install

Usage

TODO: Write usage instructions here

Quick and dirty ASCII/ANSI art

knd = NL::KndClient::SimpleKndClient.new
knd.open

d11 = knd.get_depth
d16 = NL::KndClient::Kinutils.unpack11_to_16_lut(d11)

knd.close

# img will contain full 3D coordinates after this, but we'll only use Z here.
# img[y][x] will return the voxel at (x, y) in the 640x480 data.
img = d16.unpack('S*').map { |v|
  NL::KndClient::Kinutils::DEPTH_LUT[v]
}.each_slice(640).map.with_index { |row, y|
  row.map.with_index { |zw, x|
    if zw > 4000
      {x: 0, y: 0, z: -1}
    else
      {
        x: NL::KndClient::Kinutils.xworld(x, zw),
        y: NL::KndClient::Kinutils.yworld(y, zw),
        z: zw
      }
    end
  }
}

puts img.each_slice(15).map(&:first).map { |z| z.each_slice(11).map(&:first) }.map { |z| z.map { |v| [0, v[:z] - 200].max / 450 } }.map { |z| z.map { |v| [".", '-', "\e[1m-\e[0m", 'o', "\e[1mo\e[0m", 'O', "\e[1mO\e[0m"].reverse[v] }.join }
-----------.......................---------------O--------O
-----------.....................--------------------------O
-----------.......OOOO.O........--------------------------O
-----O-----.......OOoooo........--------------------------O
-----------......OOOoooo.o......-OOoooo-------------------O
----O------......OOOOooooo.....OOoooooooo-----------------O
-----------.......OOoOooo......Oooooooooo-------------OOOOO
-----------.......OOOOOo.......Ooooooooo-------------OOOOOO
-----------........OOooo.......Ooooooooo-------------OOOOOO
-----------....--..OOooo........Oooooooo-------------OOOOOO
-----------...---...OOooo.......Ooooooo--------------OOOOOO
-----------...----..OOooo....Oooooooooo--------------OOOOOO
-----------.........OOooo.Oooooooooooooooooo---------OOOOOO
-----------.........OOooooOOoooooooooooooooooooo--OO-OOOOOO
-----------.........OOOoooooooooooooooooooooooooooooooOOOOO
-----------.........OOOooooooooooooooooooo-oo-oooooooooOOOO
-----------.........OOOooooooooooooooooooo--------OOOOOOOOO
-----------.---.O...OOOOooooOoooooooooooooo-----OOooOOOOOOO
----------------------------OOooooooooooooooo--OOOOOOOOOOOO
oo---------------------------OooooooooooooooOOOOOOOOOOOOOOO
ooo--------------------------OoooooooooooooOOOOOOOOOOOOOOOO
oooo--------------------------OooooooooOOOOOOOOOOOOOOOOOOOO
ooooo-----------------OOO-O--OOoooooooOOOOOOOOOOOOOOOOOOOOO
ooooo---------OO-oo-----O-----OooooOOOOOOOOOOOOOOOOOOOOOOOO
ooooo----OOOooooooo-----OOO--OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
oooOOOOooooooooooooo--O-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
oOooooooooooooooooo---O-OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
oooooooooooooooo-----OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
oooooooooooooo----OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
ooooooooooo---OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
ooooooo-----OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
ooooo----OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO

Standalone command-line processing

There is a Makefile in the ext/ directory that will build standalone tools for unpacking and projecting raw depth data.

cd ext/
make

cat depth11.raw | ./unpack -i | ./overhead | convert -size 500x500 -depth 8 GRAY:- /tmp/overhead.png

About

Client library and related utils to interface with KND (Nitrogen Logic's depth data server) from Ruby

Resources

License

Stars

Watchers

Forks

Packages

No packages published