昨日、Amazon で中古で売ってあったMicrosoft Xbox 360 Kinect センサーが届いたので、早速 Linux で使ってみました。
環境
OS は Linux Mint の Debian Edition です(略して LMDE )。 Ubuntu などの Debian 系の Linux なら同じ手順でいけるかもしれません。
使いそうなものをインストール
とりあえず APT の公式リポジトリで freenect
(オープンソース版の Kinect ライブラリ)で検索すると libfreenect-bin
というパッケージがあったのでインストール。
sudo aptitude install libfreenect-bin
コマンドがいくつか追加されました。
$ sudo dpkg -L libfreenect-bin
--- snip ---
/usr/bin/freenect-cppview
/usr/bin/freenect-glpclview
/usr/bin/freenect-glview
/usr/bin/fakenect
/usr/bin/fakenect-record
--- snip ---
Kinect を接続
Kinect の電源を入れて、USB でホストと接続します。 dmesg
の様子は次のとおり。
$ dmesg
[1969221.943934] usb 1-7.2.2: new full-speed USB device number 98 using xhci_hcd
[1969222.056332] usb 1-7.2.2: New USB device found, idVendor=045e, idProduct=02b0
[1969222.056334] usb 1-7.2.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[1969222.056336] usb 1-7.2.2: Product: Xbox NUI Motor
[1969222.056337] usb 1-7.2.2: Manufacturer: Microsoft
[1969261.058907] usb 1-7.2.1: new high-speed USB device number 99 using xhci_hcd
[1969261.164501] usb 1-7.2.1: New USB device found, idVendor=045e, idProduct=02ad
[1969261.164503] usb 1-7.2.1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[1969261.164504] usb 1-7.2.1: Product: Xbox Kinect Audio, © 2011 Microsoft Corporation. All rights reserved.
[1969261.164505] usb 1-7.2.1: Manufacturer: Microsoft
[1969261.164505] usb 1-7.2.1: SerialNumber: ****************
[1969262.592523] usb 1-7.2.3: new high-speed USB device number 100 using xhci_hcd
[1969262.699765] usb 1-7.2.3: New USB device found, idVendor=045e, idProduct=02ae
[1969262.699766] usb 1-7.2.3: New USB device strings: Mfr=2, Product=1, SerialNumber=3
[1969262.699768] usb 1-7.2.3: Product: Xbox NUI Camera
[1969262.699768] usb 1-7.2.3: Manufacturer: Microsoft
[1969262.699769] usb 1-7.2.3: SerialNumber: ****************
[1969263.711841] gspca_main: v2.14.0 registered
[1969263.712338] gspca_main: kinect-2.14.0 probing 045e:02ae
[1969263.712389] usbcore: registered new interface driver kinect
[1969716.950137] gspca_main: kinect-2.14.0 probing 045e:02ae
freenect コマンドを実行
なんだかそのまま認識しているみたいですね!追加されたコマンドを実行してみます。
freenect-glview
ウィンドウが表示され、左に深度マップ、右に可視光線カメラ映像が表示されます。
上は左の部分だけのキャプチャです。意外にもすんなりと深度が出てますね! さすがにハードウェアで処理していることもあり、動きも滑らかです。
次に PCL (Point Cloud Library) を使ってるっぽいコマンドを実行してみます。
freenect-glpclview
リアルタイムに点群化されたものが見れました。これは楽しい…。
2016年までの記事では ROS 関係のパッケージを入れている方が多いようですが、今はなくてもいいのかな。
RTAB-Map を導入
ここまで拍子抜けするほど順調だったので、調子に乗って部屋のスキャンをしてみるべく、RTAB-Map を導入しようとしました。流れとしては
- RTAB-Map は Debian (というかLMDE) の公式リポジトリにないのでソースコードからビルド
- Kinect が認識されない、メニューから選べない。→ freenect2 (v2 ベースのライブラリ)が必要。
- freenect2 もリポジトリにないのでソースコードからビルド → いろいろとライブラリを追加してみるが
cmake .
で LibUSB_LIBRARY がないとかで失敗。
- どうも libusb のバージョンが公式リポにある最新の 1.0.19 ではなく 1.0.20 以降が必要な模様。
- freenect の作者?の人が PPA に deb な libusb v1.0.20 置いてるよー/(^o^)\ → Ubuntu じゃねえええ \(^o^)/
- Debian 環境(LMDEだってば)で PPA リポを追加するも 404 Not found…Dockerまわりもあるので source.list 汚したくないので深追いは禁物。
- もうこうなると libusb の 1.0.20 をコードからビルドするか…!
- sudo aptitude purge libusb-1.0-0-dev → sudo aptitude install libudev-dev → ./configure → make → sudo make install。/usr/local/lib に入っていった…、まあいいや。
- freenect2 の cmake . が通らない!調べたら libGL.so のリンク切れしてる場合があるらしい→切れてた→ ln し直し。
- ビルド通った!もう面倒なのでついでに freenect2.so も sudo make install。これも /usr/local/lib に…まあいいか。
- RTAB-Map の再ビルド。freenect2 が YES になってる!ビルド通った…!
- わくてかしながら bin/rtabmap を実行→freenect2 が有効になってる!キャプチャ開始…………
CameraFreenect2: no device connected or failure opening the default one! Note that rtabmap should link on libusb of libfreenect2. Tip, before starting rtabmap: "$ export LD_LIBRARY_PATH=~/libfreenect2/depends/libusb/lib:$LD_LIBRARY_PATH"
と出てカメラ初期化失敗。
- あかん(あかん) ldconfig -p してもちゃんと freenect2.so は見えてるし、これは何なんだー。
/usr/lib/x86_64-linux-gnu/
配下に(多分)古い libusb と思われるものを発見、移動したのち sudo ldconfig
。
- RTAB-Map を
cmake
からやり直し、状況変わらず。
ていうかそもそもハードが v2 に対応してないパターンじゃ…よ、よし寝よう (:3っ )っ
freenect2 が入っていった場所
$ sudo make install
[ 3%] Built target generate_resources_tool
[ 89%] Built target freenect2
[100%] Built target Protonect
Linking CXX shared library CMakeFiles/CMakeRelink.dir/libfreenect2.so
Install the project...
-- Install configuration: "RelWithDebInfo"
-- Installing: /usr/local/lib/libfreenect2.so.0.2.0
-- Installing: /usr/local/lib/libfreenect2.so.0.2
-- Installing: /usr/local/lib/libfreenect2.so
-- Installing: /usr/local/include/libfreenect2
-- Installing: /usr/local/include/libfreenect2/frame_listener_impl.h
-- Installing: /usr/local/include/libfreenect2/frame_listener.hpp
-- Installing: /usr/local/include/libfreenect2/registration.h
-- Installing: /usr/local/include/libfreenect2/logger.h
-- Installing: /usr/local/include/libfreenect2/packet_pipeline.h
-- Installing: /usr/local/include/libfreenect2/libfreenect2.hpp
-- Installing: /usr/local/include/libfreenect2
-- Installing: /usr/local/include/libfreenect2/export.h
-- Installing: /usr/local/include/libfreenect2/config.h
-- Installing: /usr/local/lib/cmake/freenect2/freenect2Config.cmake
-- Installing: /usr/local/lib/pkgconfig/freenect2.pc
自前ビルドの libusb が入っていった場所
$ sudo make install
Making install in libusb
make[1]: Entering directory '/tmp/libusb-1.0.20/libusb'
make[2]: Entering directory '/tmp/libusb-1.0.20/libusb'
make[3]: Entering directory '/tmp/libusb-1.0.20/libusb'
/bin/mkdir -p '/usr/local/lib'
/bin/bash ../libtool --mode=install /usr/bin/install -c libusb-1.0.la '/usr/local/lib'
libtool: install: /usr/bin/install -c .libs/libusb-1.0.so.0.1.0 /usr/local/lib/libusb-1.0.so.0.1.0
libtool: install: (cd /usr/local/lib && { ln -s -f libusb-1.0.so.0.1.0 libusb-1.0.so.0 || { rm -f libusb-1.0.so.0 && ln -s libusb-1.0.so.0.1.0 libusb-1.0.so.0; }; })
libtool: install: (cd /usr/local/lib && { ln -s -f libusb-1.0.so.0.1.0 libusb-1.0.so || { rm -f libusb-1.0.so && ln -s libusb-1.0.so.0.1.0 libusb-1.0.so; }; })
libtool: install: /usr/bin/install -c .libs/libusb-1.0.lai /usr/local/lib/libusb-1.0.la
libtool: install: /usr/bin/install -c .libs/libusb-1.0.a /usr/local/lib/libusb-1.0.a
libtool: install: chmod 644 /usr/local/lib/libusb-1.0.a
libtool: install: ranlib /usr/local/lib/libusb-1.0.a
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
/usr/local/lib
If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the `-LLIBDIR'
flag during linking and do at least one of the following:
- add LIBDIR to the `LD_LIBRARY_PATH' environment variable
during execution
- add LIBDIR to the `LD_RUN_PATH' environment variable
during linking
- use the `-Wl,-rpath -Wl,LIBDIR' linker flag
- have your system administrator add LIBDIR to `/etc/ld.so.conf'
See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
/bin/mkdir -p '/usr/local/include/libusb-1.0'
/usr/bin/install -c -m 644 libusb.h '/usr/local/include/libusb-1.0'
make[3]: Leaving directory '/tmp/libusb-1.0.20/libusb'
make[2]: Leaving directory '/tmp/libusb-1.0.20/libusb'
make[1]: Leaving directory '/tmp/libusb-1.0.20/libusb'
Making install in doc
make[1]: Entering directory '/tmp/libusb-1.0.20/doc'
make[2]: Entering directory '/tmp/libusb-1.0.20/doc'
make[2]: Nothing to be done for 'install-exec-am'.
make[2]: Nothing to be done for 'install-data-am'.
make[2]: Leaving directory '/tmp/libusb-1.0.20/doc'
make[1]: Leaving directory '/tmp/libusb-1.0.20/doc'
make[1]: Entering directory '/tmp/libusb-1.0.20'
make[2]: Entering directory '/tmp/libusb-1.0.20'
make[2]: Nothing to be done for 'install-exec-am'.
/bin/mkdir -p '/usr/local/lib/pkgconfig'
/usr/bin/install -c -m 644 libusb-1.0.pc '/usr/local/lib/pkgconfig'
make[2]: Leaving directory '/tmp/libusb-1.0.20'
make[1]: Leaving directory '/tmp/libusb-1.0.20'
参考