Space ROSのインストールについて

# 概要
Space ROSをDockerイメージとしてビルドしないで、ネイティブ環境にインストールした。
(I installed Space ROS in a native environment, rather than building it as a Docker image.)

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

Space ROSは公式でDockerイメージの使用を推奨している。これは確かSpace ROS自体の設計思想にかかわるお勧めだったように思う（要確認）。

公式ドキュメントでは、ソースからビルドしてネイティブにインストールをする手順の紹介はまだTODOとなっている。

https://space-ros.github.io/docs/rolling/Getting-Started/Building-From-Source.html

今回はWSL2上に環境を構築したかったので、公式リポジトリのDockerfileを参考にSpace ROSのインストールを実施した。その手順を以下にメモする。

※デモプログラムがまだこのバージョンに対応していないことが分かったため、”安定版”の方を以下の記事にまとめました

https://qiita.com/ramuda25/items/1720bc240cf2850e3d71

# 環境とインストール方針
* Ubuntu 24.04
* ROS2 Jazzy
(Space ROSは2025/2/1のコミットから、Ubuntu24.04ベースになった)
* Dockerイメージと同じように/opt/spacerosに本体を置く

# インストール方法

## Step 1: リポジトリのクローン

```bash
# Space ROSのリポジトリをクローン
mkdir -p ~/space-ros-build
cd ~/space-ros-build
git clone https://github.com/space-ros/space-ros.git
cd space-ros
```

## Step 2: 基本的な依存関係のインストール

```bash
# システムをアップデート
sudo apt update
sudo apt upgrade -y

# ロケール関連パッケージのインストール
sudo apt install -y locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8

# ROS 2のaptリポジトリを追加
sudo apt install -y curl gnupg lsb-release software-properties-common
sudo add-apt-repository universe

# GPG鍵を再取得する（オプション：実施時点ではエラーが出たため）
sudo rm -f /usr/share/keyrings/ros-archive-keyring.gpg
curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key | sudo gpg --dearmor -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 $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null

# 開発ツールとROSツールのインストール
sudo apt update
sudo apt install -y \
  bison \
  build-essential \
  cmake \
  git \
  python3-colcon-common-extensions \
  python3-flake8 \
  python3-flake8-blind-except \
  python3-flake8-builtins \
  python3-flake8-class-newline \
  python3-flake8-comprehensions \
  python3-flake8-deprecated \
  python3-flake8-docstrings \
  python3-flake8-import-order \
  python3-flake8-quotes \
  python3-pip \
  python3-pytest \
  python3-pytest-cov \
  python3-pytest-repeat \
  python3-pytest-rerunfailures \
  python3-rosdep \
  python3-rosinstall-generator \
  python3-setuptools \
  python3-vcstool \
  wget \
  vim

# OpenGLの更新（オプションだが、Earthfileに含まれているため）
sudo add-apt-repository ppa:kisak/kisak-mesa
sudo apt update 
sudo apt upgrade -y

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

## Step 3: Space ROS用ディレクトリの作成

```bash
# Space ROSをインストールするディレクトリを作成（Dockerイメージと同じ場所）
sudo mkdir -p /opt/spaceros
sudo chown $USER:$USER /opt/spaceros
cd /opt/spaceros
```

## Step 4: リポジトリファイルの生成とマージ

```bash
# リポジトリ内の既存ファイルを使用
cd /opt/spaceros
cp ~/space-ros-build/space-ros/excluded-pkgs.txt .
cp ~/space-ros-build/space-ros/spaceros-pkgs.txt .
cp ~/space-ros-build/space-ros/spaceros.repos .
cp ~/space-ros-build/space-ros/docker/scripts/merge-repos.py .
chmod +x merge-repos.py

# ROS 2リポジトリファイルを生成
ROS_DISTRO="jazzy"
rosinstall_generator --format repos --rosdistro ${ROS_DISTRO} --deps --upstream \
  --exclude $(cat excluded-pkgs.txt) \
  -- $(cat spaceros-pkgs.txt) > ros2.repos

# Space ROSのリポジトリとROS 2のリポジトリをマージ
python3 merge-repos.py ros2.repos spaceros.repos -o output.repos
```

## Step 5: リポジトリのクローン

```bash
# すべてのリポジトリをクローン
mkdir -p src
vcs import --shallow --retry 3 --input output.repos src
# 再現性のために正確なバージョンをエクスポート（オプション）
vcs export --exact src > exact.repos
```

## Step 6: rosdepを使用して依存関係をインストール

```bash
# rosdepが初期化されていない場合は初期化
sudo rosdep init
rosdep update

# 依存関係を確認するだけ（インストールしないので、rosdep-commands.shを作成するように変更。-sオプション消せばそのまま行ける？）
rosdep install -s -y \
  --from-paths src --ignore-src \
  --rosdistro ${ROS_DISTRO} \
  --skip-keys "$(cat excluded-pkgs.txt) urdfdom_headers ikos" --simulate > rosdep-commands.txt

# 実際にインストールするコマンドを作成
echo '#!/bin/bash' > rosdep-commands.sh
grep "apt-get install" rosdep-commands.txt | sed 's/^/sudo -H /' >> rosdep-commands.sh

# ファイルに実行権限を付与
chmod u+x rosdep-commands.sh

# 依存関係をインストール
./rosdep-commands.sh
```

## Step 7: IKOS（Space ROSで使用される静的解析ツール）のインストール

```bash
# IKOSの依存関係をインストール
sudo apt update
sudo apt install -y \
  gcc \
  g++ \
  cmake \
  libgmp-dev \
  libboost-dev \
  libboost-filesystem-dev \
  libboost-thread-dev \
  libboost-test-dev \
  libsqlite3-dev \
  libtbb-dev \
  libz-dev \
  libedit-dev \
  python3 \
  python3-pip \
  python3-venv \
  llvm-14 \
  llvm-14-dev \
  llvm-14-tools \
  clang-14

# IKOSをビルド
cd ~
git clone --branch v3.4 --depth 1 https://github.com/NASA-SW-VnV/ikos.git
cd ikos
mkdir build
cd build
cmake \
  -DCMAKE_INSTALL_PREFIX="/opt/ikos" \
  -DCMAKE_BUILD_TYPE="Debug" \
  -DLLVM_CONFIG_EXECUTABLE="/usr/lib/llvm-14/bin/llvm-config" \
  ..
make -j$(nproc)
sudo make install
export PATH="/opt/ikos/bin/:$PATH"
echo 'export PATH="/opt/ikos/bin/:$PATH"' >> ~/.bashrc
cd /opt/spaceros
```

## Step 8: Space ROSのビルド

```bash
# colconでビルド
cd /opt/spaceros
colcon build \
  --cmake-args \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
  --no-warn-unused-cli
```

## Step 9: 環境のセットアップ

```bash
# セットアップスクリプトを読み込む
source /opt/spaceros/install/setup.bash

# ターミナル起動時に自動的に読み込むために ~/.bashrc に追加
echo 'source /opt/spaceros/install/setup.bash' >> ~/.bashrc
echo 'export IKOS_SCAN_NOTIFIER_FILES=""' >> ~/.bashrc  # IKOSがコンパイルされたパッケージ用に.ikosbinファイルを作成するようにする
```

## 追加情報

1. デバッグシンボル付きの開発用ビルドの場合は、以下を使用すること：
   ```bash
   colcon build \
     --cmake-args \
     -DCMAKE_BUILD_TYPE=RelWithDebInfo \
     -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
     --no-warn-unused-cli
   ```

2. テストを実行したい場合：
   ```bash
   source install/setup.sh
   colcon test \
     --retest-until-pass 2 \
     --packages-skip ament_lint \
     --ctest-args -LE "(ikos|xfail)" \
     --pytest-args -m "not xfail"
   ```

3. ビルド中に警告が表示されることがあるが、ほとんどは無視して問題ない。特に以下のような警告は、除外されたDDS実装に関連する正常な警告である：
   ```
   rmw implementation 'rmw_fastrtps_cpp' not available for test 'test_generic_pub_sub'
   ```

4. ビルドが成功したことを確認するには：
   ```bash
   $ source /opt/spaceros/install/setup.bash
   $ ros2 --help
   usage: ros2 [-h] [--use-python-default-buffering] Call `ros2 <command> -h` for more detailed usage. ...

   ros2 is an extensible command-line tool for ROS 2.

   options:
     -h, --help            show this help message and exit
     --use-python-default-buffering
                           Do not force line buffering in stdout and instead use the python default buffering, which might be affected by PYTHONUNBUFFERED/-u and
                           depends on whatever stdout is interactive or not

   Commands:
     action     Various action related sub-commands
     component  Various component related sub-commands
     daemon     Various daemon related sub-commands
     doctor     Check ROS setup and other potential issues
     interface  Show information about ROS interfaces
     launch     Run a launch file
     lifecycle  Various lifecycle related sub-commands
     multicast  Various multicast related sub-commands
     node       Various node related sub-commands
     param      Various param related sub-commands
     pkg        Various package related sub-commands
     run        Run a package specific executable
     service    Various service related sub-commands
     test       Run a ROS2 launch test
     topic      Various topic related sub-commands
     trace      Trace ROS 2 nodes to get information on their execution. The main 'trace' command requires user interaction; to trace non-interactively, use the 'start'/'stop'/'pause'/'resume' sub-commands
     wtf        Use `wtf` as alias to `doctor`

     Call `ros2 <command> -h` for more detailed usage.   
   ```