はじめに
以下の公式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を実行しなくてよいというのがちょっと感慨深いです。
終わりに
ひとまず、何となく環境インストールからビルドの仕方まではわかりました。
次はプログラム内でのメッセージ送受信の扱い方やツール類の使い方を見ていこうと思います。