Ubuntu Weekly Recipe

第514回Intel RealSense D435でバーチャルユーチューバーの深みを味わう

Intel RealSenseシリーズはIntelが開発しているデプスカメラです。⁠プ」は半濁音です。いま流行りのバーチャルユーチューバーには、モーションキャプチャーするためにRealSenseのようなデプスカメラで撮影してる人もいます。今回はこのデプスカメラを使って、遠近感を得ることにしましょう。

4月16日追記:本記事には多くの事実誤認・誇張が含まれているとのご指摘を受けました。そこで誤っている部分に関して、注釈という形で修正情報を追記しました。誤った記述をしてしまい申し訳ございません。また一次情報も踏まえた詳細なご指摘ありがとうございました。

Kinect後継のIntel RealSense

デプスカメラとは視野にある物体の奥行き方向の位置関係を検知できるカメラです。

奥行きを検知できると物体の輪郭を把握できます。輪郭を把握できると物体の識別が可能になります。このためデプスカメラはモーションキャプチャーやジェスチャー入力、オブジェクトトラッキング、最近だと自動運転などに必要な要素となっているのです。

2010年ごろXbox 360の周辺機器として登場したKinectは、当時高価だったデプスカメラをコンシューマーレベルの価格で提供しただけにとどまらず、PCなどでも使えるようWindows SDKが提供されたこともあって、広く使われるヒット商品となりました。あのカメラの登場がモーションキャプチャー、ならびに昨今のVR/AR/MRのブームの先鞭になったとも言えるでしょう。

残念ながらKinectは2017年に販売を終了したことが公表されました。どうも心臓部であるセンサー系ICのメーカーPrimeSenseがAppleに買収されたことも理由のひとつのようです4月16日追記①⁠。おもしろいことにKinectのサイトでは、後継として「Intel RealSenseデプスカメラの検討をお勧めします」と提案していたりします。

4月16日追記①
このように書いてしまいましたが、そもそもの話としてPrimeSenseのチップはKinect v1でのみ使われており、PrimeSenseの買収前後で発表され発売を開始したXbox One版のKinect以降は、センシング方式も含めて別の技術になっています。よって「理由のひとつ」ですらない可能性が高そうです。

さてIntelのRealSenseは2015年ぐらいから発売されている、ジェスチャーベースのインターフェース技術とその製品群の総称です。本来はPCに組み込んで使用されることを想定してSDKなども含めて作っていたようですが、最近ではIntel EuclidのようにAtomとセットでスタンドアローンの製品として販売しているケースもありました。

今回紹介するD415/D435シリーズは今年1月に発売開始した最新モデルです。179ドルという価格にも関わらず十分実用に耐えるフルスペックの機能をもった製品ということで、発売と同時に売り切れ・入荷待ちになるほどの人気商品でした。今も入荷待ち状態のところが多いようです。D435の場合は以下のスペックになっています。

  • Intel RealSense Vision Processor D4
  • IRステレオカメラ(グローバルシャッター)
  • 深度センサーの出力解像度:1280 x 720 @ 90fps
  • 深度センサーの視野角:水平85.2度、鉛直58度
  • 最大深度:約10m(キャリブレーション、環境光に依存)
  • RGBカメラの出力解像度:1920 x 1080 @ 30fps
  • RGBカメラの視野角:水平69.4度、鉛直42.5度
  • カメラのサイズ:90mm x 25mm x 25mm
  • カメラ側のコネクタ:USB Type-C
  • PC側のコネクタ:USB 3.0 Type-A
  • カメラ背面に2つのM3マウントポイントあり
  • カメラ底面に1/4インチユニファイネジ穴あり

奥行き検出については、いくつかの方法が存在します。RealSenseはどうやら世代によって検出方法が若干異なるようです。D400シリーズの場合は、左右の赤外線カメラとVision Processorを使って視野を計測する方法と、中央からIRパターンを発光しその反射光を計測する方法のハイブリッド構成のようです4月16日追記②⁠。

4月16日追記②
これに関しても「事実とは異なる」という指摘を受けました。本文では「2つの異なる計測システム」が存在するような誤った説明をしていますが、後者についてはあくまで前者の精度を上げるための補助的な機能です。

底面のネジ穴はいわゆる小ネジサイズの穴ですので、小型のカメラ三脚のネジに接続できます。なお、D435には小型の三脚がついてきました。

USBコネクタはカメラの端の半円になっているUSBカバーの部分を取り外すことで現れます。ただこの部分、銀のカバーの粘着力が弱く、USBカバーを取り外すつもりが銀色の部分だけ取れてしまいました。隙間になにか薄いものを差し込んでてこの原理で取り外しましょう。

図1 使っている時は外しっぱなしなので実害はありませんが、ちょっと悲しい
画像

このRealSence、実体はUSB Video device Classに対応したUSBカメラのようなものなので、Ubuntuでも比較的簡単に動きます。Intel自身がLinux版SDKのUbuntu用リポジトリを公開しているぐらいです。

あとカメラ側には「青い保護シート」が貼ってあります。これを剥がさないと正しく計測できないので注意してください。いや、製品画像見たら剥がすことは明らかなんですが、剥がさないといけないことに気がつくまでに数十分かかりました……。

図2 剥がさないとぼんやりとした映像しか得られません
画像

Intel RealSense SDKのインストール

デプスカメラとして使うためには、Intel RealSense SDKをインストールする必要があります。幸い、64bit版のUbuntu 16.04 LTS向けのリポジトリが公開されていますので、インストールは非常に簡単です。

ただしDKMSでカーネルモジュールをインストールする都合上、SecureBootをオフにするかDKMSでの再構築時に署名を行うよう設定する必要があります。また16.04以外のリリースや64bit版以外のアーキテクチャーについては未確認です。SDKのソースコードは公開されていますので、自分でビルドする方法もあります。

GitHub上に記載されているインストール手順にしたがって、インストールをすすめていきましょう。

まずはリポジトリを登録し、パッケージリストを更新します。

$ echo 'deb http://realsense-hw-public.s3.amazonaws.com/Debian/apt-repo xenial main' \
  | sudo tee /etc/apt/sources.list.d/realsense-public.list
$ sudo apt-key adv --keyserver keys.gnupg.net --recv-key 6F3EFCDE
$ sudo apt update

次にRealSenseのパッケージをインストールします。依存関係でRealSenseのuvcvideoカーネルモジュールとudevのルール、デモツール、それにDKMSや開発パッケージ関連などがインストールされます。

$ sudo apt install librealsense2-dkms librealsense2-utils

ドキュメントではrealsense-uvcvideoパッケージをインストールしていますが、これは少し古い情報です。uvcvideoモジュールのDKMS関連は上記のようにlibrealsense2-dkmsパッケージに移行しました。古いパッケージの場合、Ubuntu 16.04 LTSの4.4カーネルや、HWEカーネルである4.13においてうまくモジュールをビルドできないことがありました。librealsense2-dkmsなら特に不具合はなかったので、こちらのパッケージを使うようにしましょう。もしlibrealsense2-dkmsをインストール済みならsudo apt autoremove librealsense2-dkmsコマンドで古いパッケージを削除しておいてください。udevルールのパッケージも、新しいlibrealsense2-udev-rulesと古いrealsense-sdk-udev-rulesの新旧2種類あるので、古いほうのパッケージは削除してかまいません。

DKMSが正しく動けば、新しいモジュールが構築されロードされるはずです。

$ modinfo uvcvideo | grep "version:"
version:        1.1.2.realsense-1.2.0
srcversion:     7E691E3321664EAA1B07077

モジュールバージョンに「realsense」が入っていれば、正しい状態です。たとえば以下のように、realsenseがない場合は古いモジュールのままとなっています。変わらないようなら一度再起動してみてるといいかもしれません。

$ modinfo uvcvideo | grep "version:"
version:        1.1.1
srcversion:     95C78A492BFEA6BCC55B8F2

なお、最新のRealSenseライブラリはHaswell以降にサポートされたAVX2を使うようになりました。つまり、Ivy Bridge以前のアーキテクチャの場合、デモプログラムを動かすとIllegal instructionが発生しエラー終了してしまいます。もし、IvyBridgeで動かしたい場合は、少し前の2.10.1を使うといいでしょう。次のコマンドでパッケージをダウングレードできます。

$ sudo apt install librealsense2-utils=2.10.1-0~realsense0.62 \
  librealsense2=2.10.1-0~realsense0.62

ただしRealSenseのデモプログラムはそれなりにスペックを要求しますので、注意してください。少なくとも、筆者のメインマシンであるCPU Core i5-3427U(Ivy Bridge⁠⁠、RAM 4GiBだとフレームの取得ミスが頻発し、警告だらけになりました。CPUの遅さが原因か、USB 3.0のバス性能が悪いのかは難しいところです。

もしRealSenseの開発関連のパッケージも必要であれば、次のようにインストールしてください。しかしながら今回は使用しません。

$ sudo apt install librealsense2-dev librealsense2-dbg

Intel RealSense SDKのアンインストール

Intel RealSense SDKのパッケージはすべて「librealsense2」で始まっているため、以下の方法でアンインストールできます。

$ sudo apt autoremove librealsense2*

必要に応じてリポジトリも削除しておきましょう。

$ sudo rm /etc/apt/sources.list.d/realsense-public.list
$ sudo apt-key del 6F3EFCDE
$ sudo apt update

デモプログラムを動かす

librealsense2-utilsにはいくつかのデモプログラムが含まれています。とりあえずいろいろ試せるのが「realsense-viewer」です。

まず最初にRealSense本体を接続します。なお、まともに動かすためにはそれなりに高速なPCとUSB 3.0のコネクタが必要です。特にUSB 3.0は、十分な速度が出ないとフレーム落ちして警告が大量に表示されます。このため仮想マシン上での動作はサポートされていません。さらにポートによって速度が変わる場合もあるので、必要に応じて接続する場所を調整してください。とは言え、付属のUSB Type-Cのケーブルは1mぐらいなので、デスクトップPCの場合は取り回しがいろいろと大変かもしれません。

RealSenseを接続すると以下のようなメッセージがdmesgに表示されます。

$ dmesg | tail
[ 4460.387462] usb 2-7: new SuperSpeed USB device number 2 using xhci_hcd
[ 4460.404752] usb 2-7: New USB device found, idVendor=8086, idProduct=0b07
[ 4460.404780] usb 2-7: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 4460.404785] usb 2-7: Product: Intel(R) RealSense(TM) 430
[ 4460.404790] usb 2-7: Manufacturer: Intel(R) RealSense(TM) 430
[ 4460.404795] usb 2-7: SerialNumber: 736313020779
[ 4460.408536] uvcvideo: Found UVC 1.50 device Intel(R) RealSense(TM) 430 (8086:0b07)
[ 4460.411585] uvcvideo: Unable to create debugfs 2-2 directory.
[ 4460.411902] input: Intel(R) RealSense(TM) 430 as /devices/pci0000:00/0000:00:14.0/usb2/2-7/2-7:1.0/input/input18
[ 4460.413902] uvcvideo: Found UVC 1.50 device Intel(R) RealSense(TM) 430 (8086:0b07)
[ 4460.415026] uvcvideo: Unable to create debugfs 2-2 directory.

次にrealsense-viewerをデスクトップ環境で起動します。

$ realsense-viewer
図3 起動直後の画面
画像

無事に起動すると左上に製品名が表示されます。ちなみに「Intel RealSense USB2」と表示される場合、USB 2.0のポートを使っているか速度が出ないポートになっています。この状態ではまともに動作しませんので接続場所を変更してください。

「Streo Module」をONにするとデプスカメラが動作し、深度マップと赤外線マップが表示されます。また「RGB Camera」をONにすると、同時にRGBカメラで撮影した内容も表示します。

実際にカメラの前で物を動かすなどして、正しく深度情報を取得できていることを確認してみましょう。ちなみにあまりに近い物体の情報は取得できません。また、視野内の最深距離に応じて深度スケールは変わります。マウスホイールを動かすと個々のウィンドウを拡大縮小できます。

図4 赤系が遠く、青系が近い、黒は計測できなかったところ
画像

他にもいくつかのツールが用意されています。

  • rs-multicam: 深度情報とRGBカメラの結果だけを表示するシンプルなツールです4月16日追記③⁠。
  • rs-measure: 画面上で指定した、二箇所の地点間の距離を計測します。直線距離ではなく、物体の形状に合わせた距離を計測するのがポイントです。
  • rs-pointcloud: 撮影した情報から物体の位置情報をマップし、画面をドラッグすることで別の角度から「見る」ことが可能になります。
  • rs-align: 指定した距離より遠い物体をマスクするツールです4月16日追記④⁠。
  • rs-enumerate-devices: デバイスの情報を表示します。
4月16日追記③
この説明は間違いでした。rs-multicamの説明にもあるように、本来は複数のRealSenseを接続することで意味をなすサンプルです。
4月16日追記④
この説明は間違いでした。rs-alignの説明にもあるように、本来はRGBカメラによるカラーフレームとデプスカメラから算出した奥行きフレームの位置合わせの方法を示すことが目的です。その合わせた結果を元に、指定した距離より遠い物体を除去しています。
$ rs-enumerate-devices
 Device info:
    Name                          :     Intel RealSense 435
    Serial Number                 :     746512070435
    Firmware Version              :     05.08.15.00
    Physical Port                 :     /sys/devices/pci0000:00/0000:00:14.0/usb2/2-7/2-7:1.0/video4linux/video0
    Debug Op Code                 :     15
    Advanced Mode                 :     YES
    Product Id                    :     0B07
(中略)
Stream Profiles supported by Stereo Module
 Supported modes:                                      stream     resolution fps   format
    Infrared 2    1280x800      @ 30Hz  Y8
    Infrared 1    1280x800      @ 30Hz  Y8
    Infrared 1    1280x800      @ 25Hz  Y16
    Infrared 2    1280x800      @ 25Hz  Y16
    Infrared 2    1280x800      @ 15Hz  Y16
(中略)
Stream Profiles supported by RGB Camera
 Supported modes:                                      stream     resolution fps   format
    Color         1920x1080     @ 30Hz  RAW16
    Color         1920x1080     @ 30Hz  Y16
    Color         1920x1080     @ 30Hz  BGRA8
    Color         1920x1080     @ 30Hz  RGBA8
    Color         1920x1080     @ 30Hz  BGR8
    Color         1920x1080     @ 30Hz  RGB8

このように強力なデプスカメラであるRealSenseを使うと、Ubuntuでも簡単にモーションキャプチャーが可能になります4月16日追記⑤⁠。SDKもGitHub上で公開されているので、自分用にソフトウェアを作ることも可能です。Ubuntu環境のみでバーチャルユーチューバーを目指している人はぜひ参考にしてください。

4月16日追記⑤
「実用的なモーションキャプチャーを実現するためには他にも機能・実装が必要なので『簡単に』は言い過ぎなのでは?」というご指摘をいただきました。まったくそのとおりです。ハードウェアのRealSenseが取得できるのはあくまで奥行き情報だけで、その情報から物体の識別や骨格・姿勢の推定を行うのはあくまでソフトウェア側で実装する必要があります。SDKを利用して自分で実装したり、Nuitrackのようなプロプライエタリなソフトウェアを使う方法もあるでしょう。ただいずれにせよ、公式なLinux向けドライバーとSDKが提供されているという点において、⁠Windows・Mac向けのソフトウェアしか提供されていない便利なハードウェア」をなんとかLinuxでも使えるようにすることに比べると、⁠簡単」だと思うのです。……いや、⁠簡単」は言いすぎでした。申し訳ございません。

おすすめ記事

記事・ニュース一覧