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

先週からスマホカメラUSBカメラ×2台Kinect 360 と深度マップ撮影をやっていて、とうとう Kinect One の購入に至ったので書いておきます。

新品が到着

Amazon で Kinect One 本体専用の電源・USBアダプターを購入しました。本体が1,4000円に対して電源・USBアダプターが5250円というのはなかなかのお値段バランス。

Xbox One Kinect センサー (アフィリエイトなし)

Xbox One Kinect センサー用 Windows PCアダプター 9J7-00007 (アフィリエイトなし)

ちなみに、Kinect 360 (v1) と Kinect One (v2) の違いについては次のページが詳しいです。

udev 設定

環境によるのかもしれませんが、Kinect 360 (v1) はホストマシンと USB 接続するとそのまま利用できていました。今回の Kinect One (v2) では、一般ユーザ権限で Kinect を使うのに udev の設定が必要だったので書いておきます。

root 権限で /lib/udev/rules.d/90-kinect2.rules を新規作成し、公式にある次の内容を記述します。

# this file belongs in /etc/udev/rules.d/
# ATTR{product}=="Kinect2"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02c4", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02d8", MODE="0666"
SUBSYSTEM=="usb", ATTR{idVendor}=="045e", ATTR{idProduct}=="02d9", MODE="0666"

udev のルールを再認識させるためには、root 権限で

udevadm trigger

した後に、Kinect を使いたい一般ユーザ権限の再ログイン・Kinect の再接続をすれば良いようです。 システム側には3つのデバイスとして認識されているようですね。RGBカメラ、Dカメラ、マイクかな。

参考までに、dmesg は次のとおりになっていました。

[2319025.138813] usb 2-1: new SuperSpeed USB device number 9 using xhci_hcd
[2319025.156457] usb 2-1: New USB device found, idVendor=045e, idProduct=02d9
[2319025.156464] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2319025.156469] usb 2-1: Product: NuiSensor Adaptor      
[2319025.156473] usb 2-1: Manufacturer: Microsoft Corporation  
[2319025.159153] hub 2-1:1.0: USB hub found
[2319025.159284] hub 2-1:1.0: 1 port detected
[2319025.494131] usb 1-7: new high-speed USB device number 31 using xhci_hcd
[2319025.624314] usb 1-7: New USB device found, idVendor=045e, idProduct=02d9
[2319025.624321] usb 1-7: New USB device strings: Mfr=1, Product=2, SerialNumber=0
[2319025.624326] usb 1-7: Product: NuiSensor Adaptor      
[2319025.624330] usb 1-7: Manufacturer: Microsoft Corporation  
[2319025.625176] hub 1-7:1.0: USB hub found
[2319025.625337] hub 1-7:1.0: 1 port detected
[2319026.724222] usb 2-1.1: new SuperSpeed USB device number 10 using xhci_hcd
[2319026.740876] usb 2-1.1: New USB device found, idVendor=045e, idProduct=02c4
[2319026.740883] usb 2-1.1: New USB device strings: Mfr=1, Product=2, SerialNumber=4
[2319026.740888] usb 2-1.1: Product: Xbox NUI Sensor
[2319026.740892] usb 2-1.1: Manufacturer: Microsoft
[2319026.740896] usb 2-1.1: SerialNumber: XXXXXXXXXXXX

lsusb でも3つのデバイスとして認識されています。

freenect2 のビルド

Debian ベースである LMDE2 (Linux Mint Debian Edition) では、公式リポジトリにあるのは v1 向けの libfreenect だけです。そこで、Open Kinect Project の Github リポジトリから libfreenect2 を入手してビルドします。システム要件やビルド方法は README.md に書かれているとおりです。依存しているライブラリのほとんどは APT でインストールすることができます。 一点だけひっかかったのは、

Install libusb. The version must be >= 1.0.20.

の部分。 LMDE2 公式リポジトリは2017年3月現在、libusb のバージョンが 1.0.19 しか提供されていないようです。そこで、

ここから libusb の 1.0.20 のソースコードをダウンロードし、make install しました。なお、Ubuntu の場合だったら deb パッケージがこちらで配布されています。 freenect2 のソースコードにある depends ディレクトリの中身にある程度依存関係をアレしてくれるスクリプトが入っているので、そちらを参考にしてもいいかもしれません。

参考にならないであろう私がインストールした経緯はこちらです。今回 Kinect One を買って無駄にならなかった…ぞ!!!

RTAB-Map のビルド

RTAB-Mapは公式マニュアルを参考にインストールします。

今見たら ROS 版や Docker 版もあるんですね…、私は APT で全部揃えて cmake しました。

参考

Linux で Kinect と RTAB-Map を使ってみました

前回の記事の後半、RTAB-Mapfreenect2 が使えない…と四苦八苦していましたが、そもそも今回購入した Microsoft XBox 360 Kinect センサーは v1 と呼ばれる古いものでした。なので、v2 用の freenect2 で動かなくて当然という…!なんということでしょう… (:3っ )っ

RTAB-Map でスキャン

その事実に深夜に気付いて RTAB-Map のメニューから freenect を有効にして使ってみると…

ちゃんと理想通りのスキャンができました!

ちゃんと Kinect 自身の位置も情報として取得できているようで面白いですねー。スキャンしながらリアルタイムで位置合わせをしているのも興味深いです。(でも精度はそこそこ) スキャン後に改めて「Post processing」で自動位置合わせ処理を施すこともできるようです。

RTAB-Map から PCD 形式で出力し、pcl_viewer で表示した動画を置いておきます。

中古で5000円(うちケーブル代が3000円くらい)にしてはよく撮れているんじゃないでしょうか。

下記は Cloud Compare でノイズ除去、セグメンテーション調整(点群を切ったり貼ったり)、SSAO フィルタを有効にしてみた状態のスクリーンショットです。

近付いてみなければそれっぽい!

Lenovo の赤外線深度計付きスマホ

そういえば、

GoogleのAR技術Tangoに世界初対応のスマホ「Phab 2 Pro」がついに日本発売 – GIGAZINE

という記事も出ていることですし、もっとポイントクラウド関連が賑っていけばいいですね! 早速、RTAB-Map と連携させて空間スキャンしてる方がいらっしゃいました。

もはや v2 買うわ!

せっかく kinect v2 用の freenect2 をビルドして組み込んだので、

コイツを新品で注文してしまいました。TOF方式になって精度も(ホストの要求スペックも)上がっているらしいので楽しみ!

参考

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'

参考

3/26メモ

heroku

わかりやすい。

heroku 上で Rails アプリが動くところまでざっと見てみました。てか、heroku の前にまともに Rails の勉強しなきゃ。

ほほう。

vagrant

上の heroku の動画で vagrant を使っていて、docker や virtualbox はコマンドラインからガリガリ使っていたけど、vagrant は名前くらいしか知らなかったのでちょっとメモしておく。

うんうん、virtualbox のイメージも空から降ってくるべきですよね。

swig

sirenmruby から MRI に移植してるんだけど、どうせなら SWIG で OpenCASCADE ラッパーな ruby-occt を作ってゴニョゴニョすべきかなと思いつつ

を見てたんだけど、PythonOCC では大量の SWIG 用ラッパーファイルで頑張ってらっしゃる。*.i だけなら流用できるのかなー、でも python なんちゃらって文字があるぞ。めんどいなあ…。そもそも siren は OCCT の無駄に多いクラスや機能を適度にまとめて使えることが利点だから、フル機能の OCCT を使いたいんだったら PythonOCC やネイティブな OpenCASCADE を使えばいいと思ってたりして悩みどころです。

Kinect 360 買っちゃった

前々回と前回の OpenCV まわりに関連して、とうとう Kinect を購入しました。Kinect for Windows じゃなく 360 でもとりあえずは研究に使えるらしいし、ドライバや SDK が厳格そうな Windows で開発するわけでもない、360なら価格も中古で低価格程度ということで Amazon で5000円の中古をポチ。ヤフオクで2000円弱で出品されてるんですが、動作保証と電源ケーブル同梱版、手続きの早さで割高だけど Amazon のを購入しました。

月曜日(明日)届く予定です。楽しみ。Kinect の到着を待つ間、Python で書いていた(というかコピペしてた)ステレオマッチング処理を Ruby で書き直そうと思ってドキュメントを見てたら ruby-opencv には StereoSGBM()ない模様

こんな時に颯爽と実装してプルリクをぶん投げられる人になりたい…。

デジタルデバイス処分

PS3、楽天 KOBO、NEC LifeTouch NOTE、Lavie Tab W 708 など使ってないデバイスを処分中。ハンディカムや液タブも売り出そうか悩み中です。