自動運転AIchallenge-2024の備忘録(1)

# はじめに
今年もAIchallemgeの季節がやってきました!!なんと，今回は自動運転レーシングということで決勝大会では，実際のレースが楽しめます!!参加していない方でもその様子を見ることができるので，ぜひ足を運んでみてください!!

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074581/309baa46-42da-4253-0b1e-d1cd6ff78737.png)
> 引用: [シティサーキット東京ベイ、１２月１７日にグランドオープン](https://www.nextmobility.jp/economy_society/city-circuit-tokyo-bay-grand-opening-on-december-17th20231117/)

## 実行環境
- Ubuntu 22.04
- Intel(R) Core(TM) i7-10875H CPU
- NVIDIA GeForce RTX 3070 GPU

今回は，最初に行ったステップとこれから行うことについてまとめることにします．

## 環境構築
基本的なセットアップについては，[公式ドキュメント](https://automotiveaichallenge.github.io/aichallenge-documentation-2024/getting-started.html)を参考に進めました．まずは，必要なパッケージをインストールしていきます.
```shell
sudo apt update
sudo apt install -y git python3-pip ca-certificates curl gnupg
```
次に，dockerをインストールします.
```shell
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

sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo usermod -aG docker $USER
```
以下のコマンドで，正常にdockerがインストールされたか，確認できます.
```shell
docker run hello-world
```

続いて，rockerというGUI付きのdockerを利用するのに便利なツールをインストールしていきます.推奨されているのはaptでインストールすることなのですが，pipでインストールしたほうがシンプルなのでそれに従ってインストールします.
```shell
pip install rocker
echo export PATH='$HOME/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
```
このあと，dockerのイメージをビルドするのですが，先に必要なdocker imageを取得していきます．
```shell
docker pull ghcr.io/automotiveaichallenge/autoware-universe:humble-latest
# 確認用
docker images
```
イメージの取得には時間がかかるので，その間に以下を進めておきます.まずは，aichallengeのレポジトリをクローンします.
```shell
cd ~
git clone https://github.com/AutomotiveAIChallenge/aichallenge-2024.git
```
次にクローンしたプロジェクト`~/aichallenge-2024/aichallenge/simulator`に，シミュレータである[AWSIM](https://drive.google.com/drive/folders/1ftIoamNGAet90sXeG48lKa89dkpVy45y)をダウンロードして展開します.

以上の作業が問題なく完了していれば，ビルドを始めていきます.

```shell
cd ~/aichallenge-2024
./docker_build.sh dev
# イメージが作成されたことを確認してください
docker images
```
:::note
詳しい説明は省きますが，`~/aichallenge-2024/aichallenge`におけるローカルの変更は，dockerに反映されるようになっているためコンテナを起動する前に開発用エディタを起動しておくと便利です．わたしは，vscodeを使用しているので`code .`をコンテナ起動前に実行しました.
:::

## コンテナの起動 ・ 実行

無事にビルドが終了したので，実際にコンテナを起動します．

```shell
./docker_run.sh dev cpu
```
問題なければコンテナに入れるはずです.`ls`と打って出力が変わっていたら成功しています!次に以下を実行し，autowareをビルドします.
```shell
cd /aichallenge
./build_autoware.bash
```

:::note warn
ビルドするのは，初回時とソースコードを追加，変更した場合に実行すれば問題ないです.yamlやlaunchを変更した場合はビルドしなくても問題ないです.
:::

以上が完了すれば，autowareを無事に動かせると思います!以下のコマンドで確認できます．
```shell
# 実行&評価
./run_evaluation.bash
```

`./run_evaluation.bash`を実行すると，`~/aichallenge-2024/output`の中に走行動画やrosbagが記録されると思います.しかし，毎回記録を取ると容量をすぐに圧迫したりするので，[公式](https://automotiveaichallenge.github.io/aichallenge-documentation-2024/development/workspace-usage.html#debugterminal3)のように，ターミナルを三つ起動して実行確認するのが良いと思います.もし，１つのターミナルで実行したい場合のスクリプト例を以下に示しておきます.
```bash
#!/bin/bash
AWSIM_DIRECTORY=/aichallenge/simulator/AWSIM


# shellcheck disable=SC1091
source /aichallenge/workspace/install/setup.bash
sudo ip link set multicast on lo
sudo sysctl -w net.core.rmem_max=2147483647 >/dev/null

# Start rqt
echo "Start rqt"
rqt >/dev/null &
PID_RQT=$!


# Start AWSIM
echo "Start AWSIM"
$AWSIM_DIRECTORY/AWSIM.x86_64 >/dev/null &
PID_AWSIM=$!
sleep 10

# Start Autoware(sleep時間は任意の時間に変更)
echo "Start Autoware"
ros2 launch aichallenge_system_launch aichallenge_system.launch.xml >autoware.log 2>&1 &

PID_AUTOWARE=$!
sleep 15


# Start driving and wait for the simulation to finish
echo "Waiting for the simulation"
ros2 topic pub --once /control/control_mode_request_topic std_msgs/msg/Bool '{data: true}' >/dev/null
wait $PID_AWSIM
```

また，たまに連続実行するとうまく動作しない場合があります．その場合はコンテナを起動し直すか，以下のような`terminate.bash`を作成すると良いかもしれません.
```bash
#!/bin/sh
for i in $(seq 2 100000)
do
    kill ${i}
done
```

# まとめ

今回は，環境構築を軽くまとめてみました.もうすでに，周回できているのでこれからは，時間を短くすることに集中したほうが良さそうです.今後の方針として以下がありますが次回以降は，その方針に沿ったものをまとめていこうと思います．ここまでありがとうございました．

## これからの方針
- 何が起動されていてどのように作用しているか確認 
- パラメータの最適化
- ルートの最適化