Autoware.Autoの環境構築〜デモ実施の手順

# はじめに
そこそこのスペックのUbuntuデスクトップが手に入ったので、自動運転システムのOSSであるAutoware.Autoの環境構築を実施してみます。
ただ、環境構築だけじゃ面白くないので、Autowareが提供しているデモを動かすところまで実施します。

# Autoware.Autoとは

[Autoware（オートウェア）](https://ja.wikipedia.org/wiki/Autoware)は[ティアフォー](https://ja.wikipedia.org/wiki/%E3%83%86%E3%82%A3%E3%82%A2%E3%83%95%E3%82%A9%E3%83%BC) が主導で開発をしているLinuxとROSベースのオープンソースの自動運転車用オペレーティング・システムです。
もともとROS1をベースとしてAutoware(Autoware.AIと呼ばれている)は開発されており、ROS2が出てからROS2ベースとして再開発されているものがAutoware.Autoになります。
今回は、ROS2ベースであるAutoware.Autoの環境を構築していきます。

# **システムの依存関係と対象環境**

Autoware.Autoではサポートされているプラットフォームや推奨スペックがあるので、下記に記載します。

### **ハードウェア/ソフトウェア要求**

+ **CPU**
    + amd64 / x86_64 (Intel/AMD)
    + arm64 / aarch64 / arm64v8 (ARM v8, 64-bit)
+ **OS**
    | Ubuntu | ROS Version |
    | --- | --- |
    | 20.04 LTS | ROS2 Foxy (active development) |
    | 18.04 LTS | ROS2 Dashing (maintenance only) |

> [補足]
> Ubuntu 18.04でも動くとは書いてあるが、今後の機能追加はされなさそうなので、おとなしくUbuntu 20.04 を使うのが良いでしょう。


### **推奨スペック**

Autonomous Valet Parking Demonstration のデモを動かす際の推奨スペックは下記の通り。

+ **CPU**
    Intel(R) Core(TM) i9-9900KF CPU @ 3.60GHz (16 virtual cores) with 64GB RAM
    ※最低 Core i5 はないと厳しそう

+ **GPU**
    NVIDIA GeForce RTX 2080 with 8 GB memory
    ※最低 NVIDIA RTX1080 はないと厳しそう
+ **SSD**
    Dockerのイメージが結構容量を食うので、あるだけあると良さそう。
    ※なんだかんだで1TBぐらいあれば困ることはなさそう

# **事前準備**
Autoware.Autoを動かすために必要なツールを準備しましょう。
1. Git
2. NVIDIA Graphic Driver
3. Docker CE
4. NVIDIA Container Toolkit

> [補足]
> 2から4に関しては、[[Ubuntu 18.04 LTS で NVIDIA-Docker2 を使ってみる](https://blog.amedama.jp/entry/nvidia-docker2)] のページを参考にしました。


### **1. Gitのインストール**
下記コマンドでGitをインストールします (導入済みであればスキップ)。
```bash
sudo apt -y install git
```

### **2. NVIDIA Graphics Driverのインストール**

1. グラフィックスドライバのリポジトリを追加します。
    ```
    sudo add-apt-repository ppa:graphics-drivers/ppa
    sudo apt update
    ```

2. 使っているGPUで利用できるドライバを確認するためにubuntu-drivers-commonをインストールします。
    ```
    sudo apt-get -y install ubuntu-drivers-common
    ```
    インストールできるドライバの一覧は下記コマンドで確認することができます。
    ```
    ubuntu-drivers devices
    ```

3. 下記コマンドで、ドライバの一覧の中で推奨 (recommended) になっているドライバをインストールします。
    ```
    sudo ubuntu-drivers autoinstall
    ```
    > [補足]
    > バージョンを指定してインストールするときは 下記のようにapt-getを使うことで実施できます。
    > 特定のバージョンのみ使用したい場合はこの方法でインストールしてください。
    > ```
    > sudo apt-get -y install nvidia-driver-430
    > ```    

### **3. Docker CEのインストール**

[[Install Docker Engine on Ubuntu](https://docs.docker.com/engine/install/ubuntu/#installation-methods)]を参考にインストールを実施します。
2022/10/30時点では下記のような手順になります。

1. パッケージの更新およびインストールを実施します。
    ```
    sudo apt-get update
    sudo apt-get install \
        ca-certificates \
        curl \
        gnupg \
        lsb-release
    ```

2. GPGキーを追加します。
    ```
    sudo mkdir -p /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
    ```

3. リポジトリをセットアップします。
    ```
    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    ```

4. 最新版のDockerをインストールします。
    ```
    sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
    ```

### **4. NVIDIA Container Toolkitのインストール**

[[Installation Guide &mdash; NVIDIA Cloud Native Technologies  documentation](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html)]を参考にインストールを実施します。
2022/10/30時点では下記のような手順になります。

1. パッケージを更新します。
    ```
    sudo apt-get update
    ```

2. GPGキーを追加します。
    ```
    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
    ```

3. nvidia-docker2パッケージをインストールします。
    ```
    sudo apt-get install -y nvidia-docker2
    ```

4. Dockerデーモンを再起動します。
    ```
    sudo systemctl restart docker
    ```

これで、事前準備は一通り完了となります。
問題なく導入できているかを確認するために、下記コマンドでCUDAコンテナを実行してみます。
```
sudo docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu20.04 nvidia-smi
```
問題なく導入できていれば、下記のような結果が返ってきます。
```
+-----------------------------------------------------------------------------+
| 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                                                 |
+-----------
```

## **Autoware.Autoのセットアップ**

Autoware.Autoでは開発環境としてDockerベースのツールであるAgile Development Environment (ADE)を使用します。
[[Installation with ADE](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/installation-ade.html)]と[[ADE-Installation](https://ade-cli.readthedocs.io/en/latest/install.html)]を参考にしてADEをインストールし、ADEで用意したコンテナに資材を入れたり、シミュレーション環境を用意するといった作業を実施していきます。

### **ADEのインストール**

以下のコマンドでadeのバイナリをダウンロードし、`/usr/local/bin`に移動させます。
```bash
wget https://gitlab.com/ApexAI/ade-cli/-/jobs/1341322851/artifacts/raw/dist/ade+x86_64
mv ade+x86_64 ade
chmod +x ade
mv ade  /usr/local/bin
```

下記コマンドでADEが実行できるかを確認します。
```bash
cd ~
# パス確認コマンド
which ade
# バージョン確認コマンド
ade --version
```
バージョン情報が表示されれば、ADEのインストールは完了です。


### **ADE Projectのセットアップ**
ADE を使用する際、コンテナを作成することになるのですが、ADEで作成するコンテナ内のユーザディレクトリには、ホスト内のディレクトリがマウントされている必要があります。
下記の手順で、ホスト内にADEにマウントするためのディレクトリを用意します。

下記コマンドで、任意の場所にadehomeディレクトリを作成し、フォルダ内に.adehomeファイルを作成します (下記ではユーザフォルダに作成しています)。


```bash
# adehome を作成する場所はどこでも良い
mkdir -p ~/adehome
cd ~/adehome
touch .adehome
```

下記コマンドで、先ほど作成したadehomeディレクトリ内にAutoware.Autoのリポジトリをクローンします。
```bash
cd ~/adehome
git clone https://gitlab.com/autowarefoundation/autoware.auto/AutowareAuto.git
```

> 公式HPには、次の手順として [*ホストシステムと ADE 間のファイルの共有(Sharing files between the host system and ADE (Optional))*] という手順がありますが、この手順を実施しなくてもデモは動作します。[公式HP](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/installation-ade.html) の内容を確認し、必要だと思う方は実施してください。

### **ADE(開発環境)の起動**

下記コマンドでADE環境を立ち上げることができます。
実行すると、AEDで用意されたコンテナに入った状態となります。

```bash
# SVLボリュームでADEを開始
cd ~/adehome/AutowareAuto
ade --rc .aderc-amd64-foxy-lgsvl start --update --enter
```
> [備考]
> 今回のデモではSVLシミュレータを使用しますが、使用しない場合はSVLボリュームは不要なので、下記コマンドでコンテナを起動しても問題ないはずです。
> ```bash
> # デフォルトでADEを開始
> cd ~/adehome/AutowareAuto
> ade start --update --enter
> ```

なお、別ターミナルから起動中のADEコンテナに入りたい場合は、下記コマンドを実行すれば入れます。
```bash
ade enter
```
以上で、Autoware.Autoの環境構築は完了となります。


## **SVLシミュレータの動作確認**

デモをする前に、SVLシミュレータの動作確認だけ行っておきます。
[SVL simulator: running the SVL simulator alongside Autoware.Auto](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/lgsvl.html) を参考にキー入力で車両を操作するシミュレーションを実施してみます。

### **SVLシミュレータのアカウント作成**

SVL Simulatorを使用するためには [公式サイト](https://wise.svlsimulator.com) でアカウント作成する必要があります。アカウントを持っていない方は、作成しておきましょう。

### **SVLシミュレータの起動&サインイン**

SVLボリュームのADEコンテナを起動し、下記コマンドでSVL Simulatorを起動します。
```bash
# コンテナに入る
ade enter

# コンテナ内で実施する
/opt/lgsvl/simulator
```
SVL Simulatorが開かれたら、`LINK TO CLOUD`をクリックします (ダイアログが表示されたら`OK`をクリック)。
![Open_SVL-Simulator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341805/bb4c760b-7f20-0c1c-1572-5a41d977e004.png)

SVL Simulatorの Webサイトが開かれるので、先ほど作成したアカウントでサインインします。
![Login_SVL-Simulator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341805/a4fe503d-d4eb-b329-1cb2-da819c3ae355.png)

ログインに成功すると、下記のような画面に遷移します。
![Web_SVL-Simulator.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341805/4840e6a3-235d-97ac-0ba5-b876c8c1062f.png)

### **シミュレーション環境の用意**
下記の手順でシミュレーションを実施するための環境(道路や車両)を用意します。
1. 左ツリーの`Clusters`を選択し、`New Cluster`に任意の名前を入力して`Create Cluster`をクリックします。(とりあえずade-clusterとした)
2. 左ツリーの`Library/Maps`を選択し、AutonomouStuffを検索してヒットするかを確認します。
ヒットしない場合、左ツリーの`Store/Maps`にて AutonomouStuff を検索&選択し、`Add to Library`をクリックします。
3. [ROS2ForUnitySVLBridge](https://wise.svlsimulator.com/plugins/profile/d490cb21-2a44-447f-a289-7d869f23aabf) のページにアクセスし、`Add to Library`をクリックします。
4. 左ツリーの`Library/Vehicles`を選択しAWFLexus2016RXHybridを選択します。
`Sensor Configuration`の右側にあるボタンを押し、最下部にある`Add New Configuration`をクリックします。
`Configuration Name`は任意(とりあえずAutowareAuto-ROS2_bridgeとした)、`Bridge`はROS2ForUnitySVLBridgeを選択します。
5. `Sensor Configuration`の最下部にAutowareAuto-ROS2_bridgeがあるのでクリックします。
`Visual Editor`の右端にある`{...}`を選択し、[avp-sensors.json](https://gitlab.com/autowarefoundation/autoware.auto/AutowareAuto/-/blob/master/src/launch/autoware_demos/config/svl/avp-sensors.json)の内容をコピペします。(コピペするとセンサーが追加されるはず)
6. キー入力操作用のシミュレーションを作成します。
左ツリーの`Simulations`を選択し、`Add New`を選択します。
`Simulation Name`は任意(とりあえずSample-KeyControlとした)、`Select Cluster`はade-clusterを選択し、`Next`をクリックします。
`Run Template`はRandom Traffic、`Map`はAutonomouStuff、`Vehicle`はLexus2016RXHybrid、`Select Sensor Configuration`はAutowareAuto-ROS2_bridgeを選択し、`Next`をクリックします。
`Autopilot`はOther ROS 2 Autopilot (自動操縦)を選択し、`Next`、`Publish`の順にクリックします。

### **シミュレーションを実施**

左ツリーの`Simulations`の中に先ほど作成したシミュレーションが入っています。
作成したシミュレーションを選択し、`Run Simulation`をクリックすると、SVL Simulatorアプリの画面にシミュレーション環境が表示されます。
左下の ▶ をクリックするとシミュレーションが開始され、キー操作により車両を動かせるようになります。
(F1を押すとキー操作のリストが表示されます)
![Demo_SampleKeyControl.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341805/7ef5728e-1526-66e2-95ac-c01db47ca289.gif)
以上で、SVLシミュレータの動作確認が完了となります。
Autoware.AutoおよびSVLシミュレータが準備できたので、最後にデモを実施していきます。

## **Autoware.Autoのデモ: [Autonomous Valet Parking Demonstration](https://autowarefoundation.gitlab.io/autoware.auto/AutowareAuto/avpdemo.html)**

Autowareでは、バレーパーキングのデモが提供されています。
ユーザが駐車場を指定し、指定した駐車場まで自動運転した後に駐車するといったデモ内容となります（障害物がある場合は停止します）。
下記手順に沿ってデモを実施していきます。

1. SVLボリュームでADEコンテナの起動、SVL Simulatorの起動&サインイン、 先ほど作成したSample-KeyControlのシミュレーションの起動まで実施します。
2. ターミナルを開き、ADEコンテナ内に入り、下記コマンドを実行してRViz(可視化ツール)を起動します。
    ```bash
    # コンテナに入る
    ade enter
    # コンテナ内で実施する
    source /opt/AutowareAuto/setup.bash
    ros2 launch autoware_auto_launch autoware_auto_visualization.launch.py
    ```

3. 新しいターミナルを開き、ADEコンテナ内に入り、下記コマンドでデモを実行します。
    ```bash
    # コンテナに入る
    ade enter
    # コンテナ内で実施する
    source /opt/AutowareAuto/setup.bash
    ros2 launch autoware_demos avp_sim.launch.py
    ```

4. RViz内の車両位置がSVLシミュレータとあっていないため、`2D Pose Estimate`を使用してRViz内の車両位置を調整します。
(本来車両が位置する場所に矢印を引けば位置合わせできるはず)

5. `2D Goal Pose`で駐車スペースを選択します。
> [補足]
> プログラムからでも駐車スペースを指定することができます。その場合は下記のようなコマンドにようになります。
> ```bash
> ros2 topic pub /planning/goal_pose geometry_msgs/msg/PoseStamped '{header: {frame_id: "map"}, pose: {position: {x: -96.46856384277344, y: 58.39532775878906}, orientation: {z: 0.42554035782814026, w: 0.9049394130706787}}'} --once
> ```

実際にデモを動作させている様子は下記の通りです(容量制限の関係上、カクついたgifになっていますがご了承ください)。
※オレンジの矩形が荒ぶっていますが、一旦スルーで、、
![Demo_ValetParking.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341805/5e6cbbf3-4232-b85c-1d0d-20d9dd3070f9.gif)
指定した駐車スペースに駐車しているっぽい振る舞いになったので、これで良しとしました！


## おわりに

今回は自動運転システムのOSSであるAutoware.Autoの環境構築およびデモ実施までを行いました。
トヨタ自動車が東京オリンピックで動かしていた自動運転バス「e-Palette（イーパレット）」にAutowareが採用されており、注目を浴びているOSSです。
動作環境としては、ある程度スペックがあるPC(GPUなど)が必要になるので手軽に動かすのは難しいですが、興味がある方は触ってみてはどうでしょうか？