Autoware.Autoをインストールしてチュートリアルを動かす

### Autoware.Autoとは？

[Autoware](https://www.autoware.org/)は自動運転のオープンソースソフトウェアです。ROSをベースにしており、５年ほど前から公開されていますが、近年ROS2に対応した[Autoware.Auto](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/index.html)が公開されました。

この記事では、Autoware.Autoをインストールし、各種のデモを動かすところまでを紹介します。

※Autoware.Autoの背景技術に関しては、ロボットの自律移動や自動車の自動運転について勉強すると理解が進みます。ロボットの自律移動技術の勉強方法については別記事の[ロボットの自律移動を学ぶために有用な本まとめ](https://qiita.com/mafuto/items/c94c77223667bfdcf647)に記載してありますので、よろしければご覧ください。

### Autoware.Autoのインストール

#### 環境
・OS: ubuntu 18.04
・docker: 20.10.1 (公式では19.03以上が推奨されています）

上記は必須ですが、これだけではAutowareの全チュートリアルを動かすことはできません。nvidia製のGPUに依存するものがあるからです。なので、nvidia製のGPU搭載のPCをお持ちの方は、その使用をおすすめします。また下記の環境セットアップもお願いします。

・[nvidia-docker2](https://github.com/NVIDIA/nvidia-docker/wiki/Installation-(version-2.0))
・nvidia-container-toolkit（公式サイトに載っていたので記載しておきますが、nvidia-docker2をインストールした時点で入るはずなので特に気にしなくて大丈夫だと思います。）


#### ADEのインストール
Autoware.AutoはAgile Development Environment (通称ADE)という自動運転ソフトウェアの開発環境が用意されています。イメージとしてはほぼdockerなのでdockerを使ったことがある人にとっては動作イメージがしやすいと思います。インストール手順は下記の通りです。

######１. PATHが通っているディレクトリ直下にadeをインストール（[公式](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/installation-ade.html#installation-and-development-install-ade)では/usr/local/bin が推奨されています。）

※PATHは ```echo $PATH```で調べることができます。

```
$ cd /usr/local/bin      #上述の通り、PATHが通っていれば任意のディレクトリで構いません。
$ wget https://gitlab.com/ApexAI/ade-cli/uploads/f6c47dc34cffbe90ca197e00098bdd3f/ade+x86_64
$ mv ade+x86_64 ade
$ chmod +x ade
$ ./ade --version
#バージョンが表示されれば成功。
$ ./ade update-cli
$ ./ade --version
#アップデートされた最新のバージョンが表示されれば成功。
```

######２. ワークスペースの作成
任意の場所にワークスペースを作成します。

```
$ mkdir adehome
$ cd adehome
$ touch .adehome
```
Autowareを動かす際は、ADEを起動して立ち上がったdockerコンテナの中でROS2のコマンドやら何やらを叩いていく流れになります。このとき、ローカルで行った作業の意図を反映させるためには、ADE内部にローカルのファイルシステムをマウントできると非常に楽です。ADEはこの仕組みを持っていて（おそらく内部的な処理としてはdocker run -v でマウントしているものと思われる）、.adehomeが含まれるディレクトリをマウントするようになっています。なのでここで作成したadehomeがADE内部にマウントされることになります。

######３. Autoware.Autoのソースコードをclone

```
$ cd adehome
$ git clone https://gitlab.com/autowarefoundation/autoware.auto/AutowareAuto.git
```

#####４. ソースコードのビルド

１〜３で作成したソースコードを含むadehomeディレクトリをade内部にマウントし、ビルドします

```
$ ade start --update --enter
ade$ cd AutowareAuto
ade$ vcs import < autoware.auto.$ROS_DISTRO.repos
ade$ colcon build
```

続けて自動テストも行って、ソースコードが正しくbuildされたことを確認しましょう。

```
ade$ colcon test
ade$ colcon test-result
```

#####５.チュートリアルの実行

###### adeの実行（共通）

```
###nvidia GPU搭載PCの場合
$ cd ~/adehome/AutowareAuto
$ ade --rc .aderc-lgsvl start --update --enter -- --privileged

###その他のPCの場合
$ cd ~/adehome/AutowareAuto
$ ade start --update --enter
```
--privileged オプションは毎回必要なわけではないのですが、例えばadeからローカル環境の/dev直下にアクセスする場合などに必要なオプションであり、いざという時につまずきの原因となるので、毎回つけておくくらいの勢いで良いと思います。気になる方は外してください。

###### チュートリアル１：Ndt EKF smooth localization

ndtマッチングと拡張カルマンフィルタ（EKF）を用いた自己位置推定のチュートリアル。特に動きはない。

```
ade$ source install/setup.bash
ade$ ros2 launch autoware_demos ekf_ndt_smoothing_lgsvl.launch.py
```

###### チュートリアル2：3D perception stack
※adeの実行は最初に忘れずに行ってください。
※[pcapファイルをダウンロード](https://autoware-auto.s3.us-east-2.amazonaws.com/route_small_loop_rw.pcap)し、adehomeに置いてください。

・ターミナル1（rvizの立ち上げ）


```
$ ade enter   #起動中のadeに別ターミナルから入ることのできるコマンド
ade$ source /opt/AutowareAuto/setup.bash
ade$ rviz2 -d /opt/AutowareAuto/share/autoware_auto_examples/rviz2/autoware_perception_stack.rviz
```

・ターミナル2（pcapファイルのループ再生）

```
$ ade enter
ade$ udpreplay -r -1 route_small_loop_rw.pcap
```

・ターミナル3 (前方lidarノードの起動)

```
$ ade enter
ade$ source /opt/AutowareAuto/setup.bash
ade$ ros2 run velodyne_node velodyne_cloud_node_exe --model vlp16 __ns:=/lidar_front __params:=/opt/AutowareAuto/share/velodyne_node/param/vlp16_test.param.yaml
```

・ターミナル4 (後方lidarノードの起動)

```
$ ade enter
ade$ source /opt/AutowareAuto/setup.bash
ade$ ros2 run velodyne_node velodyne_cloud_node_exe --model vlp16 __ns:=/lidar_rear __params:=/opt/AutowareAuto/share/velodyne_node/param/vlp16_test_rear.param.yaml
```

・ターミナル5(バウンディングボックスを出すノードの起動)

```
$ ade enter
ade$ source /opt/AutowareAuto/setup.bash
ade$ ros2 launch autoware_demos lidar_bounding_boxes_pcap.launch.py
```

・ターミナル6(ロボットのtfを出すノードの起動)

```
$ ade enter
ade$ ros2 run robot_state_publisher robot_state_publisher /opt/AutowareAuto/share/lexus_rx_450h_description/urdf/lexus_rx_450h_pcap.urdf
```

・ターミナル7(cloud filterの起動)

```
$ ade enter
ade$ source /opt/AutowareAuto/setup.bash
ade$ ros2 run point_cloud_filter_transform_nodes point_cloud_filter_transform_node_exe __ns:=/lidar_front __params:=/opt/AutowareAuto/share/point_cloud_filter_transform_nodes/param/vlp16_sim_lexus_filter_transform.param.yaml __node:=filter_transform_vlp16_front  --remap points_in:=/lidar_front/points_raw
```

・ターミナル8(地面識別ノードの起動)

```
$ ade enter
ade$ source /opt/AutowareAuto/setup.bash
ade$ ros2 run ray_ground_classifier_nodes ray_ground_classifier_cloud_node_exe __params:=/opt/AutowareAuto/share/ray_ground_classifier_nodes/param/vlp16_lexus.param.yaml --remap points_in:=/lidar_front/points_filtered
```

・ターミナル9(非地面の物体を点群クラスターごとにバウンディボックス化するノードの起動)

```
$ ade enter
ade$ source /opt/AutowareAuto/setup.bash
ade$ ros2 run euclidean_cluster_nodes euclidean_cluster_node_exe __params:=/opt/AutowareAuto/share/euclidean_cluster_nodes/param/vlp16_lexus_cluster.param.yaml --remap points_in:=/points_nonground
```

### さいごに
想定以上に長くなってしまったのでチュートリアルの紹介は２つで打ち切ります。[公式](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/tutorials.html)には残り2つのチュートリアルがありますが、nvidiaのGPUが搭載されたPCでないと動きません。GPU搭載PCをお持ちの方は是非残り２つにも挑戦してみてくださいね！筆者の環境では動いているので、手順通りに環境設定ができていれば残り２つもちゃんと動くと思います。また気が向いたら残り２つも追記します！