はじめに
今回は colcon を使ったパッケージのビルドをトレースする.ここからのチュートリアルは徐々に実践的な内容になる.
ROSのビルド環境は歴史的にはいくつかのビルドツールを経て colcon に至っているらしいが,面倒なのでここでは省略.
ビルド環境の基礎
ディレクトリ構造
ROS2 のワークスペースは次のようなディレクトリ構造となる.
./workspace/
├ build/
├ install/
├ log/
└ src/
└ package/
dir name | 説明 |
---|---|
build | ビルド時の中間ファイルが格納される. |
install | パッケージのインストール先. |
log | colcon を呼び出した際のログが格納される. |
src | 各パッケージのソースコードを格納する. |
overlay and underlay
ここまでにバイナリもしくはソースコードからビルドして ROS2 環境を導入したと思うが,ワークスペースではそこで導入していたツールやバイナリを依存関係として利用する.
最初に導入した ROS2 環境を underlay,各ワークスペースを overlay と呼ぶ.
すべてのパッケージを同じワークスペースに入れるのではなく,オーバーレイを利用して適宜ワークスペースを小分けにする事が推奨されている.
colcon を使ってビルド
まずは underlay となる ros2 の環境変数を設定しておく.
$ source ~/ros2_iron/install/setup.bash
ワークスペースを作る.
$ mkdir -p ros2-ws/src
$ cd ros2-ws
$ tree -L 1
.
└── src
2 directories, 0 files
サンプルファイルを src に配置する.
$ git clone https://github.com/ros2/examples src/examples -b iron
$ tree -L 3
.
└── src
└── examples
├── CODEOWNERS
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── launch_testing
├── rclcpp
└── rclpy
6 directories, 4 files
colcon でビルドする.ビルドが終わると基礎のセクションで説明した src 以外のディレクトリも生成される.
$ colcon build --symlink-install
-- 中略 --
Summary: 22 packages finished [1min 15s]
10 packages had stderr output: examples_rclpy_executors examples_rclpy_guard_conditions examples_rclpy_minimal_action_client examples_rclpy_minimal_action_server examples_rclpy_minimal_client examples_rclpy_minimal_publisher examples_rclpy_minimal_service examples_rclpy_minimal_subscriber examples_rclpy_pointcloud_publisher launch_testing_examples
$ tree -L 1
.
├── build
├── install
├── log
└── src
5 directories, 0 files
ちなみに –symlink-install をつけると,ファイルをコピーする代わりにシンボリックリンクを利用するようになる.python 等のコンパイルされないソースの変更を即時反映できるようになり,反復作業を高速化できる.
--symlink-install Use symlinks instead of copying files where possible
作成したパッケージをテストする.
$ colcon test
-- 中略 --
Summary: 22 packages finished [48.8s]
10 packages had stderr output: examples_rclpy_executors examples_rclpy_guard_conditions examples_rclpy_minimal_action_client examples_rclpy_minimal_action_server examples_rclpy_minimal_client examples_rclpy_minimal_publisher examples_rclpy_minimal_service examples_rclpy_minimal_subscriber examples_rclpy_pointcloud_publisher launch_testing_examples
ここまででワークスペース内のビルドが完了したので,overlay を設定してデモを動かしてみる.
$ source install/setup.bash
$ ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
[INFO] [minimal_subscriber]: I heard: 'Hello, world! 0'
[INFO] [minimal_subscriber]: I heard: 'Hello, world! 1'
[INFO] [minimal_subscriber]: I heard: 'Hello, world! 2'
$ source install/setup.bash
$ ros2 run examples_rclcpp_minimal_publisher publisher_member_function
[INFO] [minimal_publisher]: Publishing: 'Hello, world! 0'
[INFO] [minimal_publisher]: Publishing: 'Hello, world! 1'
[INFO] [minimal_publisher]: Publishing: 'Hello, world! 2'
独自パッケージを作成する
colcon では REP149 に基づいた package.xml を利用してパッケージを定義できる.
また推奨されるビルドタイプは ament_cmake
,ament_python
となっている.cmake パッケージも利用できる.
ament_cmake を利用した例は demo_nodes_cpp を参照.
ament_python を ament_index_python を参照.
ros2 pkg create
コマンドを利用するとテンプレートからパッケージを作成できる.ここではこんなコマンドがあるよという紹介だけ.
$ cd ros2-ws/src
$ ros2 pkg create my_package
going to create a new package
package name: my_package
destination directory: /path/to/row2-ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['*****']
licenses: ['TODO: License declaration']
build type: ament_cmake
dependencies: []
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
[WARNING]: Unknown license 'TODO: License declaration'. This has been set in the package.xml, but no LICENSE file has been created.
It is recommended to use one of the ament license identifiers:
Apache-2.0
BSL-1.0
BSD-2.0
BSD-2-Clause
BSD-3-Clause
GPL-3.0-only
LGPL-3.0-only
MIT
MIT-0
おわりに
今回は colcon を使ったビルドの流れをトレースした.パッケージの依存関係とか細かい話は以降のチュートリアルで説明する.
コメント