【初心者向け】Azure Kinect を Ubuntu18.04+ROS Melodic で使う

# 更新
Ubuntu20.04版のインストール手順も書きました。
https://qiita.com/sunrise_lover/items/1a70ddafee44419eda2a

# Azure Kinect + ROS
RealSenseに比べてちょっと大きいけど、2021年3月時点でRGB-Dカメラの最強角のひとつ。
この記事ではROSノードを立ち上げ、PointCloud2メッセージをRvizで表示するところまで実現します。

今回の環境はこちら↓
- Ubuntu 18.04
- ROS Melodic

(初投稿なのでご容赦下さい。コメント頂ければ更新するかと思います。)

ツイッターもフォローしてね♡
https://twitter.com/Crane_mk4

# 目次
1. SDKのインストール (apt)
2. ROSノードのビルド
3. 実行

# ステップ1：SDKのインストール
SDKを使えば、UbuntuがAzureKinectを認識してくれます(雑)。

細かい事は置いといて、とりあえず以下のコマンドをターミナルで順番に実行しましょう。

`curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -`

`sudo apt-add-repository https://packages.microsoft.com/ubuntu/18.04/prod`

`sudo apt update`

`sudo apt install k4a-tools libk4a1.4-dev`


この時点で一応 Azure Kinectを動かすことができます。正しくインストールされたか確認も含め、次のコマンドを試してみましょう。

__必ずsudo権限で__ 試してください！！！ (後ほどsudoを外せるよう工夫します)

`sudo k4aviewer`

![Screenshot from 2021-03-18 19-37-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/95680344-2fb9-e3b2-c129-0282fde1c772.png)


左上のプルダウンに数字列があれば成功です。
(もし[No Devices]とあればカメラのUSB接続を疑いましょう。`lsusb`コマンドでMicrosoft製のデバイスが表示されているか、USB接続は3.0か、電力の供給は十分か、などが怪しいです。正しく接続されていれば、`lsusb`コマンドでMicrosoft製デバイスが**5項目**出現します。)

緑色の「Open Device」を押しましょう。

![Screenshot from 2021-03-18 19-37-23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/d5f599f0-14a1-4016-5954-eed9acb6db19.png)

細かい設定を調節できます。解像度を上げれば高画質なRGB画像が取れますが、負荷も上がります。
とりあえず今はこのままで、緑色のStartボタンを押しましょう。

![Screenshot from 2021-03-18 19-38-18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/0cbe40ad-5d55-6f16-c079-0795571a7ca1.png)

上のようにカメラが立ち上がります。View Modeを3Dにすると点群が立体表示されるので面白い…。

#### ※エラー情報

_replace_sample(). capturesync_drop, releasing capture early due to full queue TS:    614600 type:Depth_
というエラーはケーブル接続の問題です。
PCの背面にあるUSBポートを使って、 __マザーボードに直接挿して__ ください。

(Jetsonなどクソ雑魚GPUでも発生するらしいですが、RTX2080Tiや2080Super、3060など常識的な性能があれば大丈夫なので、まず最優先でUSB接続を疑ってください。)
ToFカメラなので照射が結構電源食います、必ず外部バスパワー電源を使ってください。



### 難点 : sudo権限でないと起動しない
これはROS周りで色々と面倒になるので、sudoなしでも起動できるよう改造する必要があります。
具体的には、「udevルールの変更」をします。

まず、適当な場所にSDKのコードをダウンロードします。
(結局ソース落とすなら最初からソースビルドすりゃええ話やけど、初心者対象なのでaptに甘えました)

`mkdir src/camera_drivers`
`cd src/camera_drivers`
`git clone https://github.com/microsoft/Azure-Kinect-Sensor-SDK.git`

こうしてgit上のソースコードがダウンロードします。
次に、`scripts`フォルダの中にある`99-k4a.rules`というファイルを、自分のターミナルが参照する実行ルールの場所にコピーしてあげましょう。

`sudo cp Azure-Kinect-Sensor-SDK/scripts/99-k4a.rules /etc/udev/rules.d/`

これでsudoを使わなくてもAzureKinectが開けるようになったはずです。
ルールを変更したので、**PCを再起動**しましょう。

(以下のコマンドでリロードすることもできますが、僕は上手くいかなかったので早々に諦めて再起動しました。
`sudo udevadm control --reload-rules`
`sudo udevadm trigger`)


今ならsudoを付けなくてもAzureKinectが使えるようになっているはずです！試してみましょう。

`k4aviewer`

僕は動きました。
動かない人は研究室の強い先輩に泣きつくか、コメント欄へどうぞ。


次はこの映像や3D点群をROSトピックに流します。

# ステップ2 : ROSノードのビルド

ROSノード(公式)を使えば、ROSのトピック通信を経由して、先ほどの点群を6D物体認識やSLAMなどに直接利用できます。

(ROS触ったことないよ！って人はここでAzureKinectは一旦置いといて、まずはROSについて知ってみたり、チュートリアルを触ってみると良いと思います。コメント欄でリクエストが多ければ、こんな幼稚な文才の僕が平たくROSについて書くかもしれません。)

まずはご自分の好みのcatkin workspaceへ移動して、そのままsrcディレクトリまで降りてください。

`cd catkin_my_ws/src`

`git clone https://github.com/microsoft/Azure_Kinect_ROS_Driver`

`cd ..`  

そうすればソースコードがダウンロードされたはずので、次はいよいよビルドです。

`catkin build azure_kinect_ros_driver`

初心者にありがちなのが、ここでビルドでエラーが出たら、依存パッケージが足りてないのかも。
エラーした人は次のコマンドを試してみて下さい。

`rosdep install -i -y -r --from-paths src`

(僕はROS一年目の頃、この魔法のコマンドに何度救われたか分かりません。)
全依存パッケージが自動インストールされるはずなので、さっき失敗した人は改めて先ほどの`catkin build azure_kinect_ros_driver`を試してみて下さい。
これで失敗したら研究室の強い先輩に泣きつくか、コメント欄へどうぞ。


そうしたら新しいパッケージを入れたので、仕上げに環境変数の更新をしましょう。

`source devel/setup.bash`

これで全ての準備は整いました。

# ステップ3 : 実行

これ↓を打つ。

`roslaunch azure_kinect_ros_driver driver.launch`

すると、ROSトピックにPointCloud2が流れ始める。

確認しましょう。別のターミナルを開き、`rviz`コマンドでRvizを立ち上げます。

![Screenshot from 2021-03-18 20-34-19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/0db34695-2c37-d3c6-8df9-1ebedc2c51c2.png)

空っぽのRvizが立ち上がります。
左下のAddボタンで、表示したいトピックを選択します。
以下のように、By topicのタブの中から/ponts2 PointCloud2 というトピックを選択し、OKを押します。

![Screenshot from 2021-03-18 20-34-33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/841b5b02-301e-d961-7f6e-14e5742a6854.png)

座標系が異なるため、まだ何も映らないです。
GlobalOptionの`map`となっている項目を、プルダウンから`camera_base`に変更しましょう。

![Screenshot from 2021-03-18 20-34-55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/5f954663-bcc6-7ee0-556f-ca7ca86335f0.png)

色付き点群が表示されました！おめでとう！
あとは平面検出なり物体検出なり、PCL+pcl-rosでご自由にお楽しみ下さい。

![Screenshot from 2021-03-18 20-37-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/ee968f07-7145-dc09-087f-3a7a15c3ea23.png)



### 宣伝
色情報に基づく6D物体認識です。
https://www.youtube.com/watch?v=agjsPMJshy0
(ロボット研究の一部で作って、論文が通ったきり放置なので、かなりクソコードです。)

https://github.com/TsuruMasato/OnlineObjectDetector

RANSACや特徴量検出を多用してますので、PCLの書き方サンプルくらいになれば…。
こちらもコメント欄で要望が多ければ、ちゃんとキレイに書き直すかもしれません。

実際にこちらの物体認識モジュールを使用したヒューマノイドロボットがこちら↓
https://www.youtube.com/watch?v=2rr84jnez4k