Space ROSのデモをネイティブ環境にインストールする

この記事では、Docker環境として提供されているSpace ROSのNavigation2パッケージをネイティブのUbuntu環境にインストールする方法を解説します。

## はじめに

Space ROSはNASAとOpen Robotics（OSRFやROS開発を牽引する団体）が宇宙用ロボットのために開発しているソフトウェア環境です。通常、Space ROSの機能はDocker イメージとして提供されていますが、場合によってはネイティブ環境に直接インストールしたい場合があります。

https://github.com/space-ros/space-ros

https://github.com/space-ros/docker

この記事では、[以前の記事](https://qiita.com/ramuda25/items/1720bc240cf2850e3d71)で書いたようにネイティブ環境にSpace ROSがインストールされている前提で、デモ用のソフトウェアをネイティブ環境にインストールする手順を説明します。

以下の3つのインストールを行います。
* space_nav2
* moveit2
* space_robots
* nav2_demo

## 前提条件

- Ubuntu 22.04
- ROS2 Humble
- Space ROSの基本環境が既にインストール済み（`osrf/space-ros:humble-2024.10.0`相当の環境）

## インストール条件
* 複数のワークスペースを切り替え易いように使用時の環境変数読み込みシェルを作成します

## インストール手順

### 1.space_nav2環境の構築方法

#### 1.1. リポジトリのクローン

まずは、Space ROSのDockerリポジトリをクローンして、必要なファイルを取得します。

  ```bash
  # GitHubからリポジトリをクローン
  git clone https://github.com/space-ros/docker.git ~/space-ros-docker
  ```

#### 1.2. ワークスペースの作成

Navigation2のワークスペースを作成します。

```bash
# ワークスペースの作成
mkdir -p ~/nav2_ws/src
cd ~/nav2_ws
```

#### 1.3. 必要なファイルをコピー

Dockerリポジトリから必要なファイルをコピーします。

```bash
# 必要なファイルをコピー
cp ~/space-ros-docker/navigation2/navigation2.repos .
cp ~/space-ros-docker/navigation2/excluded-pkgs.txt .

# space_nav2_bringupパッケージをコピー
cp -r ~/space-ros-docker/navigation2/src/ src/

# パラメータファイルのディレクトリを作成してコピー
mkdir -p src/space_nav2_bringup/params/
cp ~/space-ros-docker/nav2_demo/nav2_params.yaml src/space_nav2_bringup/params/
```

#### 1.4. ソースコードの取得

vcstoolを使って、必要なソースコードをリポジトリから取得します。

```bash
# navigation2.reposファイルからソースをインポート
cd ~/nav2_ws
vcs import --shallow src < navigation2.repos
```

#### 1.5. 依存関係のインストール

Space ROSの環境をセットアップして、依存関係をインストールします。

```bash
# Space ROSの環境変数をセットアップ
source /opt/spaceros/install/setup.bash

# 依存関係のインストール
rosdep install -i --from-path src --skip-keys $(cat excluded-pkgs.txt) -y
```

#### 1.6. ビルド

ワークスペースをビルドします。

```bash
# ビルド実行
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON --no-warn-unused-cli
```

#### 1.7. 追加のパッケージをインストール

Dockerファイルでインストールされる追加パッケージをインストールします。

```bash
sudo apt update
sudo apt install -y ros-humble-rviz2 ros-humble-nav2-bringup
```

#### 1.8. 環境設定を.bashrcに追加

```bash
# 新しいターミナルセッションで実行する場合に使用するセットアップスクリプトを作成
cat > ~/setup_nav2.sh << EOF
#!/bin/bash
source /opt/spaceros/install/setup.bash
source $HOME/nav2_ws/install/setup.bash
echo "Space Nav2環境が設定されました"
EOF

# スクリプトを実行可能にする
chmod +x ~/setup_nav2.sh

# 必要のないファイルを削除する（ここで終わる場合）
# rm -rf ~/space-ros-docker
```




### 2.MoveIt2環境の構築方法

#### 2.1. 必要なリポジトリをクローン

```bash
# Space ROS Dockerリポジトリをクローン（ここから始める場合）
# git clone https://github.com/space-ros/docker ~/space-ros-docker
```

#### 2.2. 必要なツールとパッケージをインストール

```bash
# 最新のパッケージリストを取得
sudo apt-get update

# rosdepを更新
rosdep update

# ビルドとテストのツールをインストール
sudo apt install -y \
  build-essential \
  clang-format \
  cmake \
  git \
  libbullet-dev \
  python3-colcon-common-extensions \
  python3-flake8 \
  python3-pip \
  python3-pytest-cov \
  python3-rosdep \
  python3-setuptools \
  python3-vcstool \
  wget

# テストに必要なPipパッケージをインストール
python3 -m pip install -U \
  argcomplete \
  flake8-blind-except \
  flake8-builtins \
  flake8-class-newline \
  flake8-comprehensions \
  flake8-deprecated \
  flake8-docstrings \
  flake8-import-order \
  flake8-quotes \
  pytest-repeat \
  pytest-rerunfailures \
  pytest

# rosinstall_generatorをインストール
sudo apt-get install -y python3-rosinstall-generator
```

#### 2.3. 環境変数の設定

```bash
# 必要なディレクトリを定義
export HOME_DIR=$HOME
export ROS_DISTRO=humble
export SPACEROS_DIR=/opt/spaceros
export MOVEIT2_DIR=$HOME/moveit2_ws
```

#### 2.4. MoveIt2のソースコードを取得

```bash
# MoveIt2ディレクトリを作成
mkdir -p $MOVEIT2_DIR/src

# MoveIt2のソースコードを取得
cd $HOME_DIR
git clone https://github.com/ros-planning/moveit2.git -b $ROS_DISTRO $MOVEIT2_DIR/src
cd $MOVEIT2_DIR/src
git clone https://github.com/ros-planning/moveit2_tutorials.git -b $ROS_DISTRO
```

#### 2.5. 必要なファイルをリポジトリからコピー

```bash
# 除外パッケージリストとMoveIt2パッケージリストをコピー
cp $HOME/space-ros-docker/moveit2/excluded-pkgs.txt /tmp/
cp $HOME/space-ros-docker/moveit2/moveit2-pkgs.txt /tmp/
cp $HOME/space-ros-docker/moveit2/moveit2_tutorials.repos /tmp/
```

#### 2.6. 依存パッケージのreposファイルを生成

```bash
# MoveIt2の依存パッケージのreposファイルを生成
rosinstall_generator \
  --rosdistro $ROS_DISTRO \
  --deps \
  --exclude-path $SPACEROS_DIR/src \
  --exclude $(cat /tmp/excluded-pkgs.txt) -- \
  -- $(cat /tmp/moveit2-pkgs.txt) \
  > /tmp/moveit2_generated_pkgs.repos
```

#### 2.7. 必要なリポジトリをインポート

```bash
# 生成されたreposファイルに基づいてリポジトリをインポート
cd $MOVEIT2_DIR
vcs import src < /tmp/moveit2_generated_pkgs.repos

# MoveIt2チュートリアルに必要な追加リポジトリをインポート
vcs import src < /tmp/moveit2_tutorials.repos
```

#### 2.8. システム依存関係をインストール

```bash
# Space ROSの環境をソース
source $SPACEROS_DIR/install/setup.bash

# rosdepを使用して依存関係をインストール
cd $MOVEIT2_DIR
rosdep install --from-paths src --ignore-src --rosdistro $ROS_DISTRO -r -y \
  --skip-keys "console_bridge generate_parameter_library fastcdr fastrtps rti-connext-dds-5.3.1 urdfdom_headers rmw_connextdds ros_testing rmw_connextdds rmw_fastrtps_cpp rmw_fastrtps_dynamic_cpp composition demo_nodes_py lifecycle rosidl_typesupport_fastrtps_cpp rosidl_typesupport_fastrtps_c ikos diagnostic_aggregator diagnostic_updater joy qt_gui rqt_gui rqt_gui_py"
```

#### 2.9. MoveIt2をビルド

```bash
# Space ROSの環境をソース
source $SPACEROS_DIR/install/setup.bash

# MoveIt2をビルド
cd $MOVEIT2_DIR
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON --event-handlers desktop_notification- status-
```

#### 2.10. GUIアプリケーションをインストール（オプション）

```bash
# サンプルGUIアプリをインストール
sudo apt-get install -y \
  firefox \
  glmark2 \
  libcanberra-gtk3-0 \
  libpci-dev \
  xauth \
  xterm
```

#### 2.11. 実行用の環境設定

```bash
# 新しいターミナルセッションで実行する場合に使用するセットアップスクリプトを作成
cat > ~/setup_moveit2.sh << EOF
#!/bin/bash
source /opt/spaceros/install/setup.bash
source $HOME/moveit2_ws/install/setup.bash
echo "Moveit2環境が設定されました"
EOF

# スクリプトを実行可能にする
chmod +x ~/setup_moveit2.sh

# 必要のないファイルを削除(ここで終了する場合)
# rm -rf ~/space-ros-docker 
```

### 3.Space Robotsデモ環境を構築する手順



#### 3.1. 環境変数の設定

まず、必要な環境変数を設定します：

```bash
export HOME_DIR=$HOME
export DEMO_DIR=$HOME_DIR/demos_ws
export SPACEROS_DIR=/opt/spaceros       # Space ROSのインストールディレクトリ
export MOVEIT2_DIR=$HOME_DIR/moveit2_ws # MoveIt2のインストールディレクトリ
export ROS_DISTRO=humble
export IGNITION_VERSION=fortress
export GZ_VERSION=fortress
```

#### 3.2. デモ用ワークスペースの作成

```bash
mkdir -p ${DEMO_DIR}/src
cd ${DEMO_DIR}
```

#### 3.3. 依存パッケージのインストール

```bash
sudo apt-get update -y
sudo apt-get install -y \
  git-lfs \
  python3-rosinstall-generator \
  libmongoc-dev \
  libssl-dev \
  build-essential \
  devscripts \
  debian-keyring \
  fakeroot \
  debhelper \
  cmake \
  libboost-dev \
  libsasl2-dev \
  libicu-dev \
  libzstd-dev \
  doxygen
```

#### 3.4. MongoDB C++ ドライバーのインストール

```bash
cd $HOME_DIR
wget https://github.com/mongodb/mongo-cxx-driver/releases/download/r3.6.7/mongo-cxx-driver-r3.6.7.tar.gz
tar -xzf mongo-cxx-driver-r3.6.7.tar.gz
cd mongo-cxx-driver-r3.6.7/build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local
sudo cmake --build . --target EP_mnmlstc_core
cmake --build .
sudo cmake --build . --target install

# ビルド後に一時ファイルの削除
cd $HOME_DIR
rm -rf mongo-cxx-driver-r3.6.7 mongo-cxx-driver-r3.6.7.tar.gz
```

#### 3.5. リポジトリのクローンとソースコードの取得

```bash
# リポジトリをクローン（ここから始める場合）
# cd $HOME_DIR
# git clone https://github.com/space-ros/docker.git ~/space-ros-docker
cd space-ros-docker/space_robots

# demo_manual_pkgs.reposを使ってソースコードを取得
cp demo_manual_pkgs.repos ${DEMO_DIR}/
cd ${DEMO_DIR}
vcs import src < demo_manual_pkgs.repos

# 一時的処理：demosリポジトリのアップデートによりパッケージ名が変更になったので修正されるまでは特定コミットにチェックアウト
cd ${DEMO_DIR}/src/demos
git checkout 981bd60
cd ${DEMO_DIR}
```

#### 3.6. 依存関係のインストール

```bash
# Space ROSとMoveIt2の環境をソース
source ${SPACEROS_DIR}/install/setup.bash
source ${MOVEIT2_DIR}/install/setup.bash

# rosdepでの依存関係インストール
sudo apt-get update -y
rosdep install --from-paths src --ignore-src -r -y --rosdistro ${ROS_DISTRO}
```

#### 3.7. デモをビルド

```bash
# Space ROSとMoveIt2の環境をソース
source ${SPACEROS_DIR}/install/setup.bash
source ${MOVEIT2_DIR}/install/setup.bash

# ビルド実行
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
```

#### 3.8. レンダリングアクセス権限の設定

GPUレンダリングアクセスのために必要に応じて：

```bash
sudo usermod -aG render $USER
# 設定変更を反映するにはログアウトして再ログインする必要があります
```

#### 3.9. 環境設定スクリプトの作成

毎回のセットアップを簡略化するために、環境設定スクリプトを作成します：

```bash
cat > setup_demos.sh << 'EOF'
#!/bin/bash
# このスクリプトは source コマンドで実行する必要があります
source /opt/spaceros/install/setup.bash
source $HOME/demos_ws/install/setup.bash
echo "Space Robotsデモ環境が設定されました"
EOF

chmod +x setup_demos.sh
```

#### 3.10クリーンアップ（オプション）

デモを使い終わったら、以下のコマンドでワークスペースを削除できます：

```bash
# 不要になったファイルを削除
# rm -rf $HOME_DIR/space-ros-docker # ここで終わりにする場合
rm -rf mongo-cxx-driver-r3.6.7.tar.gz mongo-cxx-driver-r3.6.7/
```