RustDDSのexampleを動かす

## これは何？

[ROSCon2022](https://roscon.ros.org/2022/)に参加した際に、"Native Rust components for ROS 2"のセッションでRustDDSを紹介していました。今回はRustDDSをソースからビルドして動作を確認しました。

## 対象とする読者

この記事はRustDDSを試してみたいROSユーザー向けに書いています。

## 環境

- ubuntu 22.04
- ROS Humble
- 言語 Rust 1.62.0

## 作業内容

1. eProsimaのShapseDemoをビルドと動作確認
    - RustDDSのデモがShapseDemoを使用する為
1. RustDDSのビルドと実行
    - こっちが今回の目的の方

## 作業準備

Rust, ROSはインストール済みとします。

### eProsimaのShapes Demoのビルドと動作確認

[e-ProsimaのShapes Demo](https://www.eprosima.com/index.php/products-all/eprosima-shapes-demo)のビルド方法を示します。

#### 1.必要なソフトをインストールする

ビルドにな依存関係にあるソフトウェアをインストールします。

```bash
sudo apt install wget git
sudo apt install libasio-dev libtinyxml2-dev
```

colconなどがインストールされていない場合は、以下のコマンドを実行しでインストールします。

```bash
pip install -U colcon-common-extensions vcstool
```

#### 2.ソースをダウンロードする
以下のコマンドでソースをダウンロードします。

```bash
mkdir -p ShapesDemo/src && cd ShapesDemo
wget https://raw.githubusercontent.com/eProsima/ShapesDemo/master/shapes-demo.repos
vcs import src < shapes-demo.repos
```

※ e-Prosimaのチュートリアルはreposファイルのアドレスが微妙に違うので修正してます。


#### 3.ビルド

以下のコマンドでビルドします。
```
colcon build
```

#### 4.動作確認

ビルドしたディレクトリ下で以下を実行します。

```bash
source install/setup.bash
ShapseDemo
```

以下のようなGUIが立ち上がれば成功です。

![Screenshot from 2022-11-18 15-25-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/34825ed6-26de-22b6-5314-81d74fb9e762.png)

動作確認ができたら、Ctrl+cで終了してください

### RustDDSのビルド
#### 1.リポジトリのクローン
以下のコマンドで[RustDDSのリポジトリ](https://github.com/jhelovuo/RustDDS)をクローンします。

```bash
git clone git@github.com:jhelovuo/RustDDS.git
```
#### 2.ソースのビルド

以下のコマンドでダウンロードしてきたソースのディレクトリに移動しビルドしてください。

```bash
cd RustDDS/ 
cargo build
```

#### 3.動作確認
以下のcargoコマンドでexampleを実行してください。
```Circle     GREEN       11  11 [21]```のような文字列が連続して出力できれば成功です。

```bash
$ cargo run --example=shapes_demo -- -P -t Circle -r -c GREEN -S
    Finished dev [unoptimized + debuginfo] target(s) in 0.07s
     Running `target/debug/examples/shapes_demo -P -t Circle -r -c GREEN -S`
No config file found in current working directory.
Topic name is Circle. Type is ShapeType.
(中略)
Circle     GREEN       11  11 [21]
Circle     GREEN       14  14 [21]
Circle     GREEN       17  17 [21]
Circle     GREEN       20  20 [21]
......
```

動作確認ができたら、Ctrl+cで終了してください

## デモの実行方法



### 1.Shpes Demo起動と設定
ShapesDemoをビルドしたディレクトリに行き、以下のコマンドを実行してください。

```
ShapesDemo
```

以下のGUIが立ち上がりますので[Publish]と書かれたボタンを押下してください。

![Screenshot from 2022-11-18 15-25-29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/38191d1c-eaeb-5b47-2a43-f8c7424f1f35.png)

ダイアログが開かれますので以下を設定してください
1. Shapeラベル下のドロップダウンリストから"Circle"を選択
2. Colorラベル下のドロップダウンリストからREDを選択
2. [:white_check_mark:OK]を押してダイアログを閉じる

![Screenshot from 2022-11-18 15-34-47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/816b300f-417c-fd0d-1a6e-5a85014c94f4.png)

次に[Subscribe]と書かれたボタンを押下します。

ダイアログが開かれますので以下を設定してください
1. Shapeラベル下のドロップダウンリストから"Circle"を選
2. [:white_check_mark:OK]を押してダイアログを閉じる

![Screenshot from 2022-11-18 15-34-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/efe661c4-bb56-018c-1626-f313dc0b1e40.png)

以下の図の用に赤い丸が動き回っていれば設定成功です。

![Screenshot from 2022-11-18 15-47-24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/eed095e1-49e2-005f-f934-39f04a320e98.png)

これでShapeDemosの設定は完了しました。

### 2.RustDDSのデモの実行

新しく端末を開き、RustDDSをビルドしたディレクトリへ行ってください。
以下のコマンドを実行すれば、RustDDSのデモが実行されます。

```bash
cargo run --example=shapes_demo -- -P -t Circle -r -c GREEN -S
```

上手く行けば以下のような表示が端末に表示されるはずです。

```bash
Circle     GREEN      184 155 [21]
Circle     RED         97 225 [30]
Circle     RED        102 220 [30]
Circle     RED        107 215 [30]
Circle     GREEN      169 170 [21]
Circle     RED        112 210 [30]
....
```
また、ShapseDemoのGUI上に緑色の丸が表示されるはずです。(数秒のラグがあるので、コマンドの実行後少し待ってください)

![Screenshot from 2022-11-18 15-33-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6898/c655b68d-63dc-13a5-b12a-203d2f8dff4e.png)


動作確認ができたら、Ctrl+cで終了してください

## 私が詰まったところ

- [チュートリアル](https://eprosima-shapes-demo.readthedocs.io/en/latest/installation/linux_sources.html)通りにソースが取得できなかった
    - 誤: https://raw.github(中略)/ShapesDemo/master/ShapesDemo.repos
    - 正: https://raw.github(中略)/ShapesDemo/master/shapes-demo.repos
- Ubuntuはデフォルトではlibasio-devがインストールされておらず、コンパイルできなかった


## 参考資料

- [e-Prosimaのチュートリアル](https://eprosima-shapes-demo.readthedocs.io/en/latest/installation/linux_sources.html)
    - 所々情報が古かったりするので注意
- [RustDDSのexampleディレクトリ](https://github.com/jhelovuo/RustDDS/tree/master/examples/shapes_demo)