ROS2 パッケージをビルドする

はじめに

以下の公式Wikiの手順に従って進めます。

https://index.ros.org/doc/ros2/Tutorials/Colcon-Tutorial/

ROS2ではcolconというコマンドを用いてビルドを行います。どうもROSはビルドシステムが落ち着かないようで、ROS1の頃はrosbuild→catkinと変更され、ROS2初期にはamentというシステムだったようです。現在のROS2は内部的にはamentを使うものの、ROS1 catkinとの相互運用性のために、一段上のレイヤのインタフェースコマンドであるcolconを用いるのが一般的だそうです。

※ 2023/12時点のROSの長期サポート版である「humble」を対象に記載を更新しました。

事前準備

例によって、必要パッケージのインストールです。

sudo apt install python3-colcon-common-extensions

まず、ROSのワークスペースは、特定の決められたディレクトリ構造を持つ必要があります。~/ros2_example_ws/srcのような、ワークスペースディレクトリがあって、その中にsrcディレクトリがあるものです。colconコマンドはsrcディレクトリと同列に、build,install,logのディレクトリを生成します。ここまではcatkinと同じですが、catkinで存在したdevelディレクトリは無くなったようです。

ワークスペース作成

以下の手順で、ワークスペースを作成していきます。

mkdir -p ~/colcon_ws/src
cd ~/colcon_ws

パッケージの作成

cd ~/colcon_ws/src
ros2 pkg create my_package

launchファイルを含むパッケージの作成方法

cd ~/colcon_ws/src/my_package

# launchファイルを入れるためのディレクトリを作る
mkdir launch

# launchファイルをlaunchディレクトリ内に作成する

# launchディレクトリはビルド時にデフォルトでinstallに移動してくれないため、そちらの設定を行う
vi CMakeLists.txt

パッケージ作成時にデフォルトで作成されたCMakeLists.txtを編集する。

ament_package()の前に以下を挿入する。参考

install(DIRECTORY
  launch
  DESTINATION share/${PROJECT_NAME}
)

サンプルを動かしてみる場合

作成したら、srcディレクトリにサンプルソースをクローンしてきます。

git clone https://github.com/ros2/examples src/examples

ブランチをhumble用のものに切り替えます。

cd ~/colcon_ws/src/examples
git checkout humble
cd ~/colcon_ws

ビルド

ビルドの前に、sourceコマンドでROS2ディストリビューションのsetup.bashを実行しておく必要があります。ROS2ではこれをunderlayというそうです。そしてそれにかぶせるようにして、ワークスペースのsetup.bashを実行します。これをoverlayと呼ぶそうです。

環境設定をレイヤで重ねていくようなイメージですね。

ここではワークスペースはまだできていないため、ディストリビューションのsetup.bashのみ実行しておきます。インストール時に.bashrcに追記した人は必要ありません。

source /opt/ros/humble/setup.bash

ワークスペースのトップに移動します。

cd ~/colcon_ws

※ これが忘れがちで要注意です。ビルドはカレントディレクトリ以下のパッケージに対して行われるため、間違った位置で実行するとエラーになり、またビルドのためのディレクトリが作成されてしまいます。そうした場合、間違った場所に作られたbuild, install, logディレクトリを削除します。

以下のコマンドでビルド開始です。

colcon build --symlink-install

--symlink-installを指定することで、srcフォルダ内のリソースを自動生成ディレクトリにコピーするのではなくリンクとされるようになり、.pyなどの更新がリビルドなしに可能になるようです。

※ (2024/06/27) どうもパッケージ指定でのビルドのキーワードで迷い込まれる方が多いようなので、追記しておきます。

--packages-select パッケージ名とすることで、指定のパッケージのみをビルドします。

--packages-up-to パッケージ名とすることで、指定のパッケージとそれに依存するパッケージをビルドします。

ここで、ビルドしたワークスペースのsetup.bashを実行します。これで、ビルドしたプログラムを実行できるようになります。
「.」はsourceコマンドの別名のようです。

. install/setup.bash

実行

端末を2つ開いて、以下のそれぞれを実行します。それぞれの端末で2つのsetup.bashを実行することを忘れてはいけません。

ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
ros2 run examples_rclcpp_minimal_publisher publisher_member_function

上のほうが受信(購読)側、下のほうが送信(出版)側です。両者でHello, world!の文字列が表示されれば成功です。

ROS1を知っている者としては、roscoreを実行しなくてよいというのがちょっと感慨深いです。

終わりに

ひとまず、何となく環境インストールからビルドの仕方まではわかりました。
次はプログラム内でのメッセージ送受信の扱い方やツール類の使い方を見ていこうと思います。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です