【Ubuntu20.04】AzureKinectをROS Noeticで強引に使う

# Ubuntu20.04がサポートされてない問題
以前、Ubuntu18.04でAzureKinectを動かしました。

https://qiita.com/sunrise_lover/items/09dbccada46ce2347062

20.04は公式でサポートされておらず、OSのバージョンアップに伴って若干トリックが必要になるので記事にしました。

# 1. ドライバのaptインストール

強引に18.04のバイナリをaptで落とします。なんと、20.04でも一応動くんですねぇ...。

```
$ curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
$ sudo apt-add-repository https://packages.microsoft.com/ubuntu/18.04/prod
$ curl -sSL https://packages.microsoft.com/config/ubuntu/18.04/prod.list | sudo tee /etc/apt/sources.list.d/microsoft-prod.list
$ curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
$ sudo apt update
$ sudo apt install libk4a1.4-dev
$ sudo apt install k4a-tools
```
厳密には、上記コマンドでver. 1.4.1がインストールされます。
警告メッセージも出ますが無視して強行して下さい。

(ちゃんと動きますが公式の推奨方法ではないので、手術ロボットとか自動運転とか人命に関わるような用途には使わないで下さいね…。万が一誤動作しても僕は責任取れませんよ…。)

# 2. ドライバの起動確認

まずカメラ(AzureKinect)をUSB接続しておきましょう。
割と電力を喰うので、外部コンセントから駆動電力を取れるバスパワー方式のUSB拡張ポートが必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/2fcf390d-ae68-1f31-327b-8d546280ca70.png)
こういうの。通信速度も大事なので、USB3.0~3.1接続ができるやつを探してね。
下のAmazonリンク切れてたらごめん。
https://amzn.asia/d/8nyfTLj

USBでAzureKinectを繋いだら、
```
$ sudo k4aviewer
```

これでAzureKinectのウィンドウが立ち上がればインストールは成功しています!!
![Screenshot from 2023-08-29 18-10-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/3dcad1b6-13f1-6947-632c-0e5c82bbe0a9.png)

なんか失敗してますが、エラーメッセージは無視して強行します。
エラーは2回出現しますが両方ともDismissをクリック。
すると…
![Screenshot from 2023-08-29 18-12-30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/c566f634-1c73-bf45-051a-a0baad17806a.png)
__ここで左上にカメラのプロダクトナンバーが出ていればUSB接続認識に成功しています！__
(sudoを付けないと上手く行きません。今からsudoが外せるよう対処します。)

緑色の"Open Device"ボタンを押して、カメラ接続を開始すると、AzureKinectが完全に起動するはずです。

![Screenshot from 2024-01-24 13-22-16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/fc1e09c6-f30a-d9d8-a9c0-380031492ce2.png)


# 3. sudoの外し方

ユーザー実行ルールを書き換えます。
まず、書き換え用のルールファイルを公式のgithubからダウンロードします。
https://github.com/microsoft/Azure-Kinect-Sensor-SDK/blob/develop/scripts/99-k4a.rules
右上の赤丸で囲ったダウンロードボタンを押してね。
![Screenshot from 2023-08-29 18-30-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/a0000a97-b356-1c08-d47e-494a5a196efb.png)


ダウンロードしたら、
```
$ sudo cp ~/Downloads/99-k4a.rules /etc/udev/rules.d/
```
でダウンロードディレクトリにあるルールファイルを自分のマシンの深い階層に移動させます。
ここでルールを適用させるため、一旦再起動。

再起動したら、sudoなしで
```
$ k4aviewer
```
を実行すると、
![Screenshot from 2023-08-29 18-38-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/c895ebd8-64e1-3b70-d422-84faeaece44d.png)
ｷｪｪｪｪｳｺﾞｲﾀｧｧｧｧｧ!!!!

この「sudo無しでドライバが動く状態」は、roslauchコマンドでROSラッパーからAPI関数を呼ぶ際に必須になります。読み飛ばさず、必ず記事に従って下さい。

# 4. ROSノードのコンパイル
今回はROS wrapperとして公式の https://github.com/microsoft/Azure_Kinect_ROS_Driver を使います。
ただし、こちらも18.04しかサポートしてません。ま、20.04でそのまま動くけどね。

ROSの基本は分かっている前提とします。
身近にROS詳しい先輩がいなければ、記事内コメントでもTwitterDMでもメールでもLINEでも下さい。
(Twitter疲れたから最近あんま見てません m(_ _)m)
```
$ cd catkin_my_ws/src
$ git clone https://github.com/microsoft/Azure_Kinect_ROS_Driver
$ cd ..
$ catkin build azure_kinect_ros_driver
```
初心者にありがちなのが、ここでビルドでエラーが出たら、依存パッケージが足りてないのかも。
エラーした人は次のコマンドを試してみて下さい。基本的なROSパッケージしか依存してないから、過去にRealSenseとか使ったことがあれば必要ありません。僕は不要でした。

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

コンパイルに成功したら、新しいパッケージを入れたので、
```
$ source devel/setup.bash
```
これで全ての準備が完了です！お疲れ様でした！

# 5. ROSノードの実行

1つめのターミナルで、
```
$ roslaunch azure_kinect_ros_driver driver.launch
```

CPU,GPUの性能が低いと警告メッセージ(ros warn)がちらほら出るかも。まぁ少々なら大丈夫。
![Screenshot from 2023-08-29 18-50-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/d98055c8-c91c-b4d6-5bf0-175359bb33fa.png)

左半分がカメラドライバのノードのターミナル。
このlaunchファイルだけではRVizは立ち上がらないので、別ターミナルでRVizを起動。(右半分)

![Screenshot from 2023-08-29 18-50-00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103136/5581133a-f49a-ef6a-1cd9-f0b5b700a477.png)

RVizのGlobalOptionで表示するtf frameをcamera_baseにセットして、PointCloud2形式のトピック _/points2_ をsubscribeすれば、このように色付き点群が表示されます！！
あとは自分の画像認識ノードでsubscriberを配備するなり、煮るなり焼くなりご自由に。

以上、Ubutnu20.04 + ROS NoeticでもAzureKinectを動かす方法でした。
特に難しくありませんが、日本語の記事が見つからなかったので一応。

参考:https://github.com/microsoft/Azure-Kinect-Sensor-SDK/issues/1263