【概要#5】Space ROSのMars Roverデモ

共著：@YukiIkeda_robot、@TheJuniorTheSenior、@tainirigel

# はじめに
本記事は、Space ROS Advent Calendar 2024の１つです。

Space ROS Advent Calendar 2024の概要については、下記の記事をご参照ください。
- [Space ROS Advent Calendar 2024について]( https://qiita.com/YukiIkeda_robot/items/876fbfe976ab71c9a53e)

また、Space ROSについては同じくSpace ROS Advent Calendar 2024の記事である下記をご参照ください。
- [【概要#1】宇宙ロボットの背景を概観してみる](https://qiita.com/yuyuqq/items/ca7879b3c2df5244f836)
- [【概要#2】Space ROSの目的](https://qiita.com/yuyuqq/items/cbe07bfe8e8767c095f7)
- [【概要#3】Space ROSとROS 2の違い](https://qiita.com/YukiIkeda_robot/items/227380feca2e8c7e886d)
- [【概要#4】Space ROSのパッケージ構成](https://qiita.com/YukiIkeda_robot/items/a308615180a198979daa)

本記事では、Space ROS のデモの1つとして、火星探査ローバーであるCuriosityのGazeboシミュレータ環境のセットアップと、簡単な動作手順についてまとめていきます(添付の画像がCuriosityのGazeboシミュレータ環境になります)。

![Gazebo (Ubuntu) 2024-02-26 223000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/f1d6e4e6-7e2d-dc00-3617-538502861811.png)

:::note info
環境構築には、1時間以上かかります。時間に余裕があるときにまとめて実施することをおすすめします。
:::

:::note warn
本記事は、2024年2月頃に動作させたときの記録であり、最新版ではありません。現在、最新版でも動作を確認中で、確認ができ次第、内容を更新していきたいと思います。最新版で試される場合、Space ROS 公式の手順は最新化されておらず、ビルドに失敗する可能性があります。
:::

では早速、Space ROSデモの環境構築について説明していきます。

# 前提条件
今回は、Space ROS公式のデモに従って、Windows(OS)のWSL(Windows Subsystem for Linux)上に、Dockerコンテナを作成する形で、デモ環境を構築していきます。

Ubuntu(OS)上でも動作は確認していますので、Ubuntuで試されたい方はそちらでも構いません。大きく手順は変わらないと思います。

また、Space ROSは、基本的にはROS 2をベースにしております。そのため、今回のデモでもROS 2をインストールしていきます。ROSのディストリビューションはHumble(Ubuntu 22.04)です。Jazzy(Ubuntu 24.04)は、現在対応中になります。

今回構築する開発環境は下記になります。
- Windows 11
- WSL2 (ver. 1.1.3.0以上)
- Ubuntu 22.04
- ROS 2 Humble
- Docker
- Earthly

# WSL環境の構築
まず、Windows上にWSLの開発環境を構築する手順について説明していきます。

### WSL2のインストール
Windows上で、下の図のようなターミナルのアイコンをクリックして開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/75237658-2c95-377b-5910-370af5c3ba97.png)

<!-- <div align="center">
  <img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/75237658-2c95-377b-5910-370af5c3ba97.png">
</div> -->

その後、下記のコマンドを実行して、WSL2をインストールします。Windows 11の場合、デフォルトでWSL2が入るはずです (Windows 10の場合、指定して入れる必要があります)。

```
$ wsl --install
```

また、下記のコマンドを実行して、WSL2をアップデートします。

```
$ wsl --update
```

その後、下の図のようなターミナル上のメッセージに従い「ユーザ名」と「パスワード」を設定していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/a87c7359-4c15-9a16-ef54-a9241b4e27e5.png)

これで、WSL2のインストールは終わりです。簡単ですね。

### Xサーバーの設定 (GUI用)
次に、下記のリンクから、VcXsrvをインストールしていきます。このVcXsrvというXサーバーをインストールすることで、WSL上でのGUIが表示できるようになります。

https://sourceforge.net/projects/vcxsrv/

インストールは、インストーラをダウンロードして起動し、そこで表示される指示に従うことで行います。

まずは、リンクを開き、下の図に示す「Download」をクリックすることで、VcXsrvのインストーラをダウンロードしていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/f7099243-25e2-b2cc-bbd9-5dd03eb53f60.png)

そして、ダウンロードしたインストーラを開き、VcXsrvをインストールします。

VcXsrvのインストールが終わると、Windows上で下の図のような、VcXsrvを起動するXLaunchのアイコンが登場するので、これをクリックして開きます。

XLaunch開いたら、「multiple window」を選んで「次へ」を選択します。

そして、「start no client」を選んで「次へ」を選択します。

その後、下の図のように「clipboard」と「Native opengl」を選んで「Additional parameters for VcXsrv」という入力フォームに「-ac」と入力し、「次へ」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/ccddeb0a-8262-5151-42bd-e52bd217a5c2.png)

そうしたら、「Save configuration」を押して、任意の場所にファイルを保存します。このファイルをクリックすることで、Xサーバーが起動するので、どこか皆さんが扱いやすい場所に保存しておいてください。

最後に、「完了」を押してXlaunchを終了します。これで、Xサーバーの設定が完了します。WSLでGUIを使う場合は、このXLaunchの設定を含むファイルをクリックし、Xサーバーを立ち上げる必要があります。

#### 追加設定：Windowsの起動と同時にXLaunchを立ち上げる
WSLでGUIを使うには、Windowsを起動する度にXLaunchをクリックして、Xサーバーを起動しなければいけません。

この後は、追加の設定にはなりますが、これが面倒だという方向けに、WIndowsが起動したら、自動的にXLaunch(Xサーバー)が立ち上がる方法をまとめておきます。

まず、「Windowsキー」+「R」を押して名前のところに「shell:startup」を入力して，「OK」を押します。

そうすると、スタートアップというフォルダが開くので、ここに先ほどXサーバーの設定で作成したファイルを移動していきます。

これで、パソコンの起動時に自動でXLaunch(Xサーバー)の立ち上げを行うようになります。この自動化を行いたくない場合は、スタートアップにXサーバーの設定で作成したファイルを移動せず、WSLを使用する度にそのファイルを開くことで起動するようにしてください。

#### 補足：GUIの動作確認
次に、Xサーバーを用いたGUIの動作確認を行っていきます (できている方は飛ばしてもOK)。

下記のコマンドを実行し、GUIの表示関係のライブラリをインストールします。

```
$ sudo apt install x11-apps
```

その後、XlaunchでXサーバーが起動している状態で、下記のコマンドを実行します。これで、GUIの表示が確認できるはずです。

```
$ xeyes
```

実行すると、下の図のようなxeyesが表示されるかと思います。この目のようなアイコンが表示されていれば、Xサーバーが正常にインストールされていることを確認できます。

<details>
<summary> :warning: GUIが表示されない場合</summary>

GUIが表示されない場合は、「home」直下にある「.bashrc」コード内119行目の下記を

```
export DISPLAY=`hostname`.mshome.net:0.0
```

下記に変えてみてください。

```
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
```

<参考リンク>
- https://guminote.sakura.ne.jp/archives/394
- https://qiita.com/ryoi084/items/0dff11134592d0bb895c
</details>

---

これで、WSL上でGUIも表示されるようになりました。WSLの開発環境の構築は以上になります。

# Docker環境の構築
WSLの環境構築が終わったら、下記のリンクからDocker Desktopをインストールしていきます。

https://www.docker.com/products/docker-desktop/

インストールは、インストーラをダウンロードして起動し、そこで表示される指示に従うことで行います。

この際、下の図に示す「Download for Windows」をクリックし、Docker Desktopのインストーラをダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/33c3e3bc-4fe9-6107-35c0-cc420807b6de.png)

そして、ダウンロードしたインストーラを開き、Docker Desktopをインストールします。

Docker Desktopのインストールが終わったら、Windows上で図のようなDocker Desktopのアイコンをクリックして開いていきます。Dockerを使用する際は、毎回このアイコンをクリックして起動します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/d89a48a7-da4c-3a08-57eb-34d4cc1e671e.png)

Docker Desktopが開いたら、下の図のような設定画面を開き、「Ubuntu」のトグルスイッチをONにします。これにより、WSL(Ubuntu)上でDockerを使用できるようになります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/e9bafc7d-6a9b-9751-3178-87ab88bae1f9.png)

これで、Dockerのインストールは完了です。WSLでDockerを使う場合は、Dockerアイコンをクリックし、Dockerを立ち上げる必要があります。

#### 追加設定：Windowsの起動と同時にDockerを立ち上げる
WSLでDockerを使うには、Windowsを起動する度にDockerアイコンをクリックして、Dockerを起動しなければいけません。

この後は、追加の設定にはなりますが、これが面倒だという方向けに、WIndowsが起動したら、自動的にDockerが立ち上がる方法をまとめておきます。

こちらの設定方法は簡単で、Dockerを開き、下の図のように「Start Docker Desktop when you sign in to your computer」のチェックボックスをクリックし、チェックを入れるだけです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/c59b2957-adf3-ad4c-3f3b-1a023a6abacc.png)

これで、パソコンの起動時に自動でDockerの立ち上げを行うようになります。この自動化を行いたくない場合は、「Start Docker Desktop when you sign in to your computer」のチェックボックスのチェックを外して、Dockerを使用する度にそのファイルを開くことで起動するようにしてください。

:::note info
ちなみに、私はXサーバーは自動で立ち上げるようにしていますが、Dockerは自動で立ち上げるようにはしていません。この設定は皆さんの使う頻度に合わせてもらえればと思います。
:::

# Earthly環境の構築
Docker環境までの構築が終わったら、下記のリンクを参考にEarthlyをインストールしていきます。

https://earthly.dev/get-earthly

WSLの場合、下記のコマンドを実行し、Earthlyをインストールします。

```
$ sudo /bin/sh -c 'wget https://github.com/earthly/earthly/releases/latest/download/earthly-linux-amd64 -O /usr/local/bin/earthly && chmod +x /usr/local/bin/earthly && /usr/local/bin/earthly bootstrap --with-autocomplete'
```

その後、Earthlyのインストールが正常にできたか確認するために、下記のコマンドを実行します。

```
$ earthly github.com/earthly/hello-world+hello
```

これで下の図のような表示がされればインストール成功です！

![スクリーンショット 2024-01-17 003632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/63bf3455-ef9e-5708-b7b6-cff1e7a4139b.png)

これで、Earthlyのインストールは完了です。以上で、Space ROSのデモを実施するための環境を構築することが出来ました！

# Space ROSのDockerコンテナ環境の構築
Space ROSのデモを実施するための環境構築ができましたので、いよいよSpace ROSのDockerコンテナ環境を構築していきます。

### Dockerイメージの作成
まず、下記のコマンドを使ってSpaceROSのdockerパッケージをgit cloneします。

```
$ git clone https://github.com/space-ros/docker.git
```

その後、spaceros、moveit2、space_robotsの3つのDockerイメージを作成します。各Dockerイメージのビルドを行う際には、Earthlyの起動が必要になります。基本的には、3つのDockerイメージを連続してビルドすれば大丈夫です(途中で再起動等を行うと面倒なので)。

まず、下記のコマンドでspacerosのDockerイメージを作成します。

```
$ cd docker/spaceros
$ ./build.sh
```

次に、下記のコマンドでmoveit2のDockerイメージを作成します。

```
$ cd ../moveit2
$ ./build.sh
```

最後に、下記のコマンドでspace_robotsのDockerイメージを作成します。

```
$ cd ../space_robots
$ ./build.sh
```

<details>
<summary> :warning: moveit2のdockerイメージのビルドに失敗した場合</summary>

下記のようなエラーが出ていた場合、メモリ不足によってビルドに失敗した可能性があります。

```
g++: internal compiler error: Killed (program cc1plus)
```

この際、下記のコマンドを実行して、WSL2に割り当てる最大メモリ量を確認してみてください。これが、10GB未満であった場合、メモリ不足でビルドが失敗した可能性があります (10GB以上あれば十分かと思います)。

```
$ free -h
``

10GB未満であった場合、Windows側のWSL設定ファイルを書き換え、WSL2に割り当てる最大メモリ量を増量します。WSL設定ファイルは、大抵「C:\\[User]\\.wslconfig」にあります。

下記のように設定することで、WSL2に割り当てる最大メモリ量を調整していきます。この際、デフォルトでは、PCの半分が割り当てられているはずです。

```:.wslconfig
[wsl2]
memory=10GB
```

その後、WSLを再起動することで、WSL2に割り当てられている最大メモリ量が更新されます。再び下記のコマンドを実行して、WSL2に割り当てる最大メモリ量を確認してみてください。

```
$ free -h
```

無事にWSL2に割り当てる最大メモリ量が増加していたら、再度ビルドを試みてください。ビルド完了後は、設定を元に戻しておいた方が良いかもしれません (お任せします)。

＜参考リンク＞
- https://snowsystem.net/other/windows/wsl2-fixed-memory-allocation/

</details>

---

これで、必要なDockerイメージを作成することができました。

### rockerのインストール
早速Dockerコンテナを作成していきたいところなのですが、その前にrockerをインストールする必要があります。rockerはROSとセットになっているので、ローカルに既にROSが入っている場合は、下記のコマンドを実行し、rockerをインストールします。

```bash
$ sudo apt-get install python3-rocker
```

ローカル環境にROSが入っていない場合は、下記のコマンドを実行し、rockerに関係するものを含めてインストールします。

```
$ sudo apt update && sudo apt install curl gnupg lsb-release
$ 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 $(source /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
$ sudo apt update
$ sudo apt-get install python3-rocker
```

これで、rockerのインストールは完了です。

### Dockerコンテナの起動方法
Dockerコンテナを立ち上げる準備が整いましたので、下記のコマンドを実行し、Dockerコンテナを作成します。

```
$ cd docker/space_robots
$ ./run.sh
```

:::note info
ちなみに、ここまでROS 2のインストール手順はありませんでしたが、ROS 2はDockerコンテナ上で既にビルドされたものが入っているので問題ありません。
:::

# Space ROSのMars Roverデモ
ここまでで、Space ROSのDocker環境を構築することができました。ここからは、Space ROS公式のデモンストレーションである火星探査ローバーであるCuriosityのGazeboシミュレータの起動と、簡単な動作を試していきたいと思います。

### Mars Rover Gazeboの起動
Dockerコンテナが起動している状態で、下記コマンドを実行し、Mars RoverのGazeboシミュレータを起動してみてください。そうすると、下の図のようなGazeboシミュレータが立ち上がると思います。この際、左上隅にある更新ボタンをクリックすると、カメラ画像が表示されるようになります。

```
$ ros2 launch mars_rover mars_rover.launch.py
```

![Gazebo (Ubuntu) 2024-02-26 222901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/40203f12-6ee2-9e66-88bd-c8956342f957.png)

`$ ./run.sh`でDockerコンテナを立ち上げた後、Dockerコンテナを停止した方は、下記を参考に再度Dockerコンテナを立ち上げてから、上記のコマンドを実行してみてください。

### コンテナへの入り方
Gazeboシミュレータ上のMars Roverを動かすために、別端末で実行中のコンテナに入る必要があります。そこで、Dockerコンテナへの入り方についてまとめていきます。

作成済みのDockerコンテナへ入る際は，下記のコマンドを用います。この際、`<container-name>`には、入りたいDockerコンテナ名が入ります。

```
$ docker exec -it <container-name> bash
```

Mars Roverのデモの際は、下記のコマンドを実行します。

```
$ docker exec -it openrobotics_space_robots_demo bash
```

新しく開いたDockerコンテナ上で下記のコマンドを実行し，Space ROSの環境を設定します。

```
$ source ~/spaceros/install/setup.bash
$ source ~/demos_ws/install/setup.bash
```

環境によっては上記のコマンドが実行できない場合があるので、その場合は下記のように`home/spaceros-user`の絶対パスを指定して実行してみてください。

```
$ source /home/spaceros-user/spaceros/install/setup.bash
$ source /home/spaceros-user/demos_ws/install/setup.bash
```

### Mars Roverを動かす
ここでは、Mars Roverの動かし方についてまとめていきます。

例として、先程立ち上げた2つ目のDcokerコンテナ上で下記のコマンドを実行し、Mars Roverを前進させてみます。これにより、下の動画のようにMars Roverが前進します。

```
$ ros2 service call /move_forward std_srvs/srv/Empty
```

![無題の動画-‐-Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/fea4eb2a-ad2b-bcaf-1ed8-f31bef285b70.gif)

また、先程立ち上げた2つ目のDcokerコンテナ上で下記のコマンドを実行し、Mars RoverのTool ArmやMast (Camera Arm) を動かしてみます。これにより、下の動画のようにMars RoverのTool ArmやMast (Camera Arm) が動きます。

Tool Armを開く際は、下記のコマンドを実行します。

```
$ ros2 service call /open_arm std_srvs/srv/Empty
```

Mast (Camera Arm) を開く際は、下記のコマンドを実行します。

```
$ ros2 service call /mast_open std_srvs/srv/Empty
```

![無題の動画-‐-Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3922460/2dee49bf-49f2-9011-8fb7-2d25e221a5f7.gif)

以上が、Space ROSで、Mars Roverを動かすデモンストレーションになります。

### Mars Roverの動かし方
ここで、Mars Roverを動かし方についてまとめていきます。下記のコマンドを実行することで、Mars Roverの各機能の動作確認ができると思います。

Mars Roverを前進させる。

```
$ ros2 service call /move_stop std_srvs/srv/Empty
```

Mars Roverを左折させる。

```
$ ros2 service call /turn_left std_srvs/srv/Empty
```

Mars Roverを右折させる。

```
$ ros2 service call /turn_right std_srvs/srv/Empty
```

Mars Roverを停止させる。

```
ros2 service call /move_stop std_srvs/srv/Empty
```

Tool Armを開く。

```
$ ros2 service call /open_arm std_srvs/srv/Empty
```

Tool Armを閉じる。

```
$ ros2 service call /close_arm std_srvs/srv/Empty
```

Mast (camera arm)を開く。

```
$ ros2 service call /mast_open std_srvs/srv/Empty
```

Mast (camera arm)を閉じる。

```
$ ros2 service call /mast_close std_srvs/srv/Empty
```

# まとめ
ここまでで、Space ROSのDockerコンテナ環境を構築し、デモンストレーションの1つであるMars Roverを動かしてみました。

ROSを使ったロボット開発をしたことがある方は、上記のコマンドでROS Serviceが動いていることが想像できると思います。そして、このROS ServiceのClient側のプログラムを書くことで、ロボットを自由自在に動かせるプログラムを書くことも想像できるかと思います。このような形で、通常のROSと同じように動き、宇宙ロボット開発のハードルを下げるというのが、Space ROSの目的の1つです。

ただ、全体を通して「どこがROS 2と違うのか？」と疑問に思われた方もいるかもしれません。正直なところ、いまのところは通常のROS 2と何ら変わりがありません。宇宙ロボットのGazeboを作成し、ROS 2で動かしたという感じになっています。

このMars Roverを使って、Space ROSの一部機能のデモンストレーションをすることができるというのが、このシミュレータの役割になっています。今後、他のSpace ROS Advent Calendar 2024記事で、このMars Roverを使ったSpace ROSの機能をデモンストレーションする記事も投稿予定ですので、楽しみにしていてください。

Space ROS Advent Calendar 2024の投稿・購読もお願いします！！

:::note info
上記の手順でうまく動作できなかった場合や、それらを解決する方法が見つかった場合は、コメントまでお知らせください。できるだけ、様々なケースに対する対処をこの記事でまとめていきたいと考えています。
:::