Linux で Microsoft Xbox 360 Kinect センサーを使ってみました

昨日、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 を導入しようとしました。流れとしては

  1. RTAB-Map は Debian (というかLMDE) の公式リポジトリにないのでソースコードからビルド
  2. Kinect が認識されない、メニューから選べない。→ freenect2 (v2 ベースのライブラリ)が必要。
  3. freenect2 もリポジトリにないのでソースコードからビルド → いろいろとライブラリを追加してみるが cmake . で LibUSB_LIBRARY がないとかで失敗。
  4. どうも libusb のバージョンが公式リポにある最新の 1.0.19 ではなく 1.0.20 以降が必要な模様。
  5. freenect の作者?の人が PPA に deb な libusb v1.0.20 置いてるよー/(^o^)\ → Ubuntu じゃねえええ \(^o^)/
  6. Debian 環境(LMDEだってば)で PPA リポを追加するも 404 Not found…Dockerまわりもあるので source.list 汚したくないので深追いは禁物。
  7. もうこうなると libusb の 1.0.20 をコードからビルドするか…!
  8. sudo aptitude purge libusb-1.0-0-dev → sudo aptitude install libudev-dev → ./configure → make → sudo make install。/usr/local/lib に入っていった…、まあいいや。
  9. freenect2 の cmake . が通らない!調べたら libGL.so のリンク切れしてる場合があるらしい→切れてた→ ln し直し。
  10. ビルド通った!もう面倒なのでついでに freenect2.so も sudo make install。これも /usr/local/lib に…まあいいか。
  11. RTAB-Map の再ビルド。freenect2 が YES になってる!ビルド通った…!
  12. わくてかしながら bin/rtabmap を実行→freenect2 が有効になってる!キャプチャ開始…………
  13. 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" と出てカメラ初期化失敗。
  14. あかん(あかん) ldconfig -p してもちゃんと freenect2.so は見えてるし、これは何なんだー。
  15. /usr/lib/x86_64-linux-gnu/ 配下に(多分)古い libusb と思われるものを発見、移動したのち sudo ldconfig
  16. 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'

参考

「Linux で Microsoft Xbox 360 Kinect センサーを使ってみました」への3件のフィードバック

  1. […] 前回の記事の後半、RTAB-Map で freenect2 が使えない…と四苦八苦していましたが、そもそも今回購入した Microsoft XBox 360 Kinect センサーは v1 と呼ばれる古いものでした。なので、v2 用の freene […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください