初心者がAI チャレンジやってみた (5)：環境の再構築（番外編）

# 概要
「初心者がAI Challengeやってみた」シリーズの第5弾（番外編）です。
第4弾まではパラメータの調整のみで全障害物突破を目指し、見事達成することができました！

~~今回からはソースコードをいじってみながら動作の改善を目指します。~~
と思っていたのですが、PCが壊れるというまさかの事態発生です（泣）。
なんとか直すことはできたものの、1から環境構築をし直すことになってしまいました。[第1弾](https://qiita.com/h_bog/items/86fba5b94b2148c4d9da)でセットアップについて書きましたが、折角の機会なので今回はもう少し具体的にセットアップの手順について記述します。

本シリーズでは[Japan Automotive AI Challenge 2023](https://www.jsae.or.jp/jaaic/)にautoware初心者の筆者が試行錯誤しながら挑戦する記録を公開しています。自動運転に興味があるけどプログラミングに自信が無い方などの参考になれば幸いです。

前の記事はこちら：
* 第1弾：[初心者がAIチャレンジやってみた(1)](https://qiita.com/h_bog/items/86fba5b94b2148c4d9da)：Autowareを動かしてみる
* 第2弾：[初心者がAIチャレンジやってみた(2)](https://qiita.com/h_bog/items/a36df3042a342bd2a0c5)：1つ目の障害物の回避成功
* 第3弾：[初心者がAIチャレンジやってみた(3)](https://qiita.com/h_bog/items/849a4241cdef257f3b3a)：2つ目の障害物の回避成功
* 第4弾：[初心者がAIチャレンジやってみた(4)](https://qiita.com/h_bog/items/8bce776fef0a39676c46)：全障害物回避達成！（全パラメータ公開）

:::note warn
筆者はautoware初心者です。
説明等が正確でない可能性があるので本記事だけではなく他の記事や[autowareのドキュメント](https://autowarefoundation.github.io/autoware-documentation/main/)も確認するようにしてください。
:::

# PCスペック
以下のスペックのPCを使っています：
| OS       |  Ubuntu 22.04            |
|----------|--------------------------|
| CPU      |  Intel Corei9 (16 cores) |
| GPU      |  NVIDIA GeForce RTX 3090 |
| Memory   |  64GB                    |
| Storage  |  1.0TB                   |

1台でAutowareとAWSIMを両方動かせるスペックなので、その想定で進めていきます。
推奨（必須？）スペックは[公式ドキュメント](https://automotiveaichallenge.github.io/aichallenge2023-sim/setup/index.html#minimum-hardware-requirements)の方に記述されているのでそちらをご確認ください。

# 環境構築
基本的には[公式ドキュメント](https://automotiveaichallenge.github.io/aichallenge2023-sim/setup/index.html)のセットアップ手順に従えば問題なく行えます。
今回はドキュメントには詳しく記述されていないdocker, rocker, NVIDIA Container Tookit, git lfs, そして ROS2のインストール時に使ったコマンドを記述します。

:::note warn
本記事には書いてありませんが、[公式ドキュメント](https://automotiveaichallenge.github.io/aichallenge2023-sim/setup/index.html)に書いてあるNVIDIAドライバやVulkanのインストールも忘れずに行ってください。
:::

## Dockerのインストール
[Dockerのウェブサイト](https://docs.docker.com/engine/install/ubuntu/)を見ながら進めていきます。

まずはDockerがPCにインストールされているかを確認しましょう。
ターミナルを開いて以下のコマンドでインストールされているDockerのバージョンを確認します。
```sh
docker --version
```
もしも古いバージョンがインストールされていればアンインストールをする必要があるそうです（手順は[こちら](https://docs.docker.com/engine/install/ubuntu/#uninstall-old-versions)を参照）。今回はDockerがそもそもインストールされていなかったので、この必要はありませんでした。

インストールはウェブサイトの[手順](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository)に従えば問題なくできました。参考までにコマンドを記します。
```sh
# インストールの下準備
sudo apt-get update
sudo apt-get install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
sudo chmod a+r /etc/apt/keyrings/docker.gpg
echo \
  "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 最新のDockerをインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# インストールできているかをテスト
sudo docker run hello-world
```

最後のコマンドで"Hello from Docker!"と表示されればインストールは成功です。

## Rockerのインストール
[こちら](https://github.com/osrf/rocker)がRockerのGitHubページです。
色々と書いてありますが、[ここ](https://github.com/osrf/rocker#debians-recommended)に書いてあるコマンド１行でインストールできました。
```sh
sudo apt-get install python3-rocker
```

## NVIDIA Container Toolkitのインストール
NVIDIAの[こちらの手順](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html#setting-up-nvidia-container-toolkit)を参考にインストールしました。一応Autowareのドキュメントにも[インストール手順](https://github.com/autowarefoundation/autoware/tree/main/ansible/roles/nvidia_docker#manual-installation)が載っているのですが、一部コマンドが違います。今回はNVIDIAの方でうまくいったのでそちらを記述します。

```sh
# インストールの下準備
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
      && curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
      && curl -s -L https://nvidia.github.io/libnvidia-container/$distribution/libnvidia-container.list | \
            sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
            sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

# インストール
sudo apt-get update
sudo apt-get install -y nvidia-container-toolkit
sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

# インストールできているかをテスト
sudo docker run --rm --runtime=nvidia --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi
```

最後のコマンドで以下のような出力が出れば成功です。
（下記はNVIDIAウェブサイトからのコピペです）
```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06    Driver Version: 450.51.06    CUDA Version: 11.0     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|                               |                      |               MIG M. |
|===============================+======================+======================|
|   0  Tesla T4            On   | 00000000:00:1E.0 Off |                    0 |
| N/A   34C    P8     9W /  70W |      0MiB / 15109MiB |      0%      Default |
|                               |                      |                  N/A |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                                  |
|  GPU   GI   CI        PID   Type   Process name                  GPU Memory |
|        ID   ID                                                   Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```

## git lfsのインストール
git lfsの[GitHubページ](https://github.com/git-lfs/git-lfs/blob/main/INSTALLING.md)の手順に沿ってインストールをします。
```sh
curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
sudo apt-get install git-lfs
```

## ROS2のインストール
ROS2 Humbleをインストールします。[こちらの手順](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html)に沿って進めれば問題なくインストールできました。Localeの設定はスキップしましたが、もしもエラーが出るようでしたら手順に沿って設定してみてください。

```sh
# インストールの下準備
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# インストール
sudo apt update
sudo apt upgrade
sudo apt install ros-humble-desktop

# 環境構築
source /opt/ros/humble/setup.bash
```

インストールが正常にできているかを確認するには、[こちらの手順](https://docs.ros.org/en/humble/Installation/Ubuntu-Install-Debians.html#try-some-examples)通りにサンプルコードを走らせてみてください。

# AWSIMとAutowareのセットアップ
以上で事前準備が完了しました。次にAWSIMとAutowareのセットアップを行います。
これに関しては[公式ドキュメント](https://automotiveaichallenge.github.io/aichallenge2023-sim/setup/index.html)に丁寧なセットアップ手順が記載がされているので、そちらを参考に進めてください。

万が一ここで詰まってしまったら[AI Challenge 2023 の GitHub](https://github.com/AutomotiveAIChallenge/aichallenge2023-sim/issues)にissueを作って聞くのが良いかもしれません。

# ローカル環境での実行
セットアップ手順の方で[動作確認方法](https://automotiveaichallenge.github.io/aichallenge2023-sim/setup/index.html#autoware)も記述されています。ただ、どうやらこれはあくまでも動作確認用であり、これにプラスで機能を追加した実行方法が公式ドキュメントの[Local Environmentページ](https://automotiveaichallenge.github.io/aichallenge2023-sim/local/index.html)に書かれていました。具体的には以下の３つの機能がプラスされます：
* 起動時に自動で車両の自己位置を設定
* 起動時に自動で車両の目標地点を設定
* 走行中のスコアの更新と走行終了後のスコアの保存

それでは[Local Environmentページ](https://automotiveaichallenge.github.io/aichallenge2023-sim/local/index.html)の手順を参考にしながらコードを実行してみましょう。

```sh
#aichallenge2023-simディレクトリで
cd docker
bash build.sh            # Dockerイメージのビルド
bash run_container.sh    # Dockerコンテナの起動
```
ここで使った`build.sh`は基本的には最初の１回だけ実行すればいいです。
AWSIMとAutoware用でそれぞれ１つずつターミナルを用意して、各ターミナルでコンテナを起動します。

**AWSIM起動**
```sh
# Rockerコンテナ内で
sudo ip link set multicast on lo      # 一度だけ
source /autoware/install/setup.bash   # 一度だけ
/aichallenge/AWSIM/AWSIM.x86_64
```
最初の２つのコマンドはコンテナ起動後に１度だけ打てばいいです。
最後のコマンドでAWSIMが起動します。

**Autoware起動**
```sh
# Rockerコンテナ内で
cd /aichallenge
bash build.sh           # コードのビルド
bash run.sh             # コードの実行
```
`build.sh`はコードに変更がない限りは最初の一度だけ打てば十分です。Dockerビルド時のコマンドと同じなので少し紛らわしいですが、こちらはコードのビルドを行っているので全くの別のコマンドです。

最後のコマンドでAutowareが実行されます。動作確認用の手順では車両の初期位置や目標地点の設定を手動で行う必要が有りましたが、このコマンドではそれらが自動で行われるので便利です。