Updated on: 2018-08-27
ROS 2では、ソフトウェアとリソース等は「パッケージ」という単位で管理します。 パッケージはロボット機能の一部やロボットモデル、設定ファイル、UIディザイン等のような必要なリソースを収納し、様々なアプリケーションで再利用されるための存在です。 そしてアプリケーションがパッケージにわけられたことでソフトウェア開発もより柔軟的に行えます。
ROS 2では、パッケージもアプリケーションもビルドする際にcolcon
というツールを使用しています。
パッケージは独自でビルドすることはもちろん可能ですが、ROS 2ベースの開発には基本的にパッケージをできるだけ小さくします。
しかし、パッケージ数が多ければ多いほど、一つづつビルドすることが難しくなります。
この問題を解決するためにcolcon
は開発されました。
colcon
は複数の依存関係があるパッケージを正しい順番でビルドするためのツールです。
ワークスペースにあるパッケージをすべてビルドするためにも、ワークスペースにある任意のパッケージのビルドにも利用可能です。
colcon
は「メタビルドシステム」と言い、各ROS 2用のパッケージのビルドを管理するためのツールです。
CMake
を直接利用したROS 1のcatkin
と違って、colcon
はビルドツールに依存しません。
パッケージのビルド方法はパッケージによって自由に変わり、colcon
はそのパッケージが利用するビルドツールを実行するだけです。
CMake
、Pythonのsetup.py
等様々なネーティブなビルドツールが扱えられます。
ROS 2でソフトウェアの流れは下記で表示されます。
このセクションではROS 2でワークスペース及びcolcon
の利用方法を説明します。
ROS 2ベースのソフトウェア開発中に利用しているパッケージはインストールされたか、「ワークスペース」という場所に置いているかのどちらです。
インストールされたパッケージは他のソフトウェアライブラリと同様にOSのディレクトリ(/opt/
、$HOME/.local/
等)に置いていて、開発中のソフトウェアに利用できます。
インストールされていないパッケージをアプリケーションで利用するためにワークスペースに置くことが必要です。
(アプリケーションと同様に実行する前にインストールすることは必要です。)
ワークスペースの構造を理解するために、作成してみましょう。
下記の手順で新しいワークスペースを作ります。
(作業開始前に/opt/ros/ardent/setup.bash
を有効にすることを忘れずに!)
1
$ mkdir -p ~/ros2_intro_colcon/src
ワークスペースはこんな簡単に作成できます。
src
というディレクトリがあれば、colcon
としてそれの親ディレクトリはワークスペースになれます。
注意:他の物が置いているディレクトリをワークスペースとして利用しない方がいいです。
src
ディレクトリにパッケージをダウンロードします。
1
2
3
4
5
$ cd ~/ros2_intro_colcon/src
$ git clone https://github.com/ros2/examples.git
$ cd examples
$ git checkout dashing
[省略]
gitは、ソースコードなどの変更履歴を記録して管理する、分散型バージョン管理システムと呼ばれるものです。 今回のセミナーでは詳細は触れませんが、研究開発を行う上では非常に有用なシステムですので、利用をお勧めします。 公式の解説書、Pro Gitなどを参考にして下さい。
GitHubは、ソースコードなどのリポジトリ・サービスです。 オープンソースソフトウェアの開発のため、共同作業のため及び配布のためによく利用されて、ROSではソースコードの保存と配布する場所としてもっとも人気なサービスです。 バイナリーパッケージとして配布されているROSパッケージ以外の利用をする場合、ほとんどGitHubを利用します。 URLが分かれば上の手順だけで簡単にROSのパッケージが自分のワークスペースにインポートし利用することができます。
では、次にパッケージのディレクトリ構成を確認します。 ダウンロードしているパッケージがバージョンアップされている場合などには、下記の実行例とファイル名が異なったり、ファイルが追加・削除されているが場合があります。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cd ~/ros2_intro_colcon/src/examples/
$ ls
CONTRIBUTING.md LICENSE rclcpp rclpy README.md
$ cd rclcpp/
$ ls
minimal_client minimal_composition minimal_publisher minimal_service
minimal_subscriber minimal_timer README.md
$ cd minimal_publisher/
$ ls
CHANGELOG.rst lambda.cpp not_composable.cpp README.md
CMakeLists.txt member_function.cpp package.xml
$ cd ../minimal_composition/
$ ls
CHANGELOG.rst CMakeLists.txt include package.xml src
$ ls src/
composed.cpp publisher_node.cpp standalone_publisher.cpp
standalone_subscriber.cpp subscriber_node.cpp
$
colcon
としてとくに意味がないので、子ディレクトリに入ること以外触れません。colcon
としてとくに意味がないので、子ディレクトリに入ること以外触れません。minimal_publisher
パッケージの内容です。
package.xml
ファイルがあるので、colcon
はこのディレクトリをパッケージとして扱い、ワークスペースをビルドするときにpackage.xml
に記述されたビルドタイプに従ってビルドします。
ソースファイルはpackage.xml
と同じディレクトリに置かれています。minimal_composition
パッケージの内容です。
package.xml
ファイルがあるので、colcon
はこのディレクトリをパッケージとして扱い、ワークスペースをビルドするときにpackage.xml
に記述されたビルドタイプに従ってビルドします。
ソースコードはサブディレクトリに置かれています。minimal_composition
パッケージの一部です。
パッケージ内のディレクトリのでcolcon
としてパッケージの一部として扱います。
ビルド時の扱い方法はパッケージのビルドタイプとビルド設定ファイルに決められています(この場合はCMakeLists.txt
です。)。基本的にパッケージはpackage.xml
があるディレクトリです。
そのパッケージの中身は完全に自由です。
package.xml
でビルドタイプを指定してそれに合っているビルド方法の設定ファイルを置けば、colcon
はパッケージがビルドできます。
colcon
でワークスペース内のパッケージをリストアップすることは可能です。
1
2
3
4
5
6
7
8
9
10
11
12
13
$ cd ~/ros2_intro_colcon
$ colcon list
examples_rclcpp_minimal_client /home/geoff/ros2_intro_colcon/src/examples/rclcpp/minimal_client (ros.ament_cmake)
examples_rclcpp_minimal_composition /home/geoff/ros2_intro_colcon/src/examples/rclcpp/minimal_composition (ros.ament_cmake)
examples_rclcpp_minimal_publisher /home/geoff/ros2_intro_colcon/src/examples/rclcpp/minimal_publisher (ros.ament_cmake)
examples_rclcpp_minimal_service /home/geoff/ros2_intro_colcon/src/examples/rclcpp/minimal_service (ros.ament_cmake)
examples_rclcpp_minimal_subscriber /home/geoff/ros2_intro_colcon/src/examples/rclcpp/minimal_subscriber (ros.ament_cmake)
examples_rclcpp_minimal_timer /home/geoff/ros2_intro_colcon/src/examples/rclcpp/minimal_timer (ros.ament_cmake)
examples_rclpy_executors /home/geoff/ros2_intro_colcon/src/examples/rclpy/executors (ros.ament_python)
examples_rclpy_minimal_client /home/geoff/ros2_intro_colcon/src/examples/rclpy/services/minimal_client (ros.ament_python)
examples_rclpy_minimal_publisher /home/geoff/ros2_intro_colcon/src/examples/rclpy/topics/minimal_publisher (ros.ament_python)
examples_rclpy_minimal_service /home/geoff/ros2_intro_colcon/src/examples/rclpy/services/minimal_service (ros.ament_python)
examples_rclpy_minimal_subscriber /home/geoff/ros2_intro_colcon/src/examples/rclpy/topics/minimal_subscriber (ros.ament_python)
graph
でさらにワークスペース内のパッケージが依存するパッケージのリストアップも可能です。
1
2
3
4
5
6
7
8
9
10
11
12
$ colcon graph
examples_rclcpp_minimal_client +
examples_rclcpp_minimal_composition +
examples_rclcpp_minimal_publisher +
examples_rclcpp_minimal_service +
examples_rclcpp_minimal_subscriber +
examples_rclcpp_minimal_timer +
examples_rclpy_executors +
examples_rclpy_minimal_client +
examples_rclpy_minimal_publisher +
examples_rclpy_minimal_service +
examples_rclpy_minimal_subscriber +
colcon
でパッケージのビルドcolcon
コマンドでワークスペースを扱います。
colcon
はワークスペースを扱うときにワークスペースの最上位ディレクトリで実行します。
ワークスペースにあるソフトウェアのビルドやテスト等のためにverb
というサブコマンドと一緒に利用します。
利用可能なverb
はcolcon -h
の実行でリストアップできます。
1
2
3
4
5
$ colcon -h
usage: colcon [-h] [--log-base LOG_BASE] [--log-level LOG_LEVEL]
{build,extension-points,extensions,info,list,metadata,test,test-result,version-check}
...
[省略]
verb
の後に-h
を付けるとそのverb
の細かい説明が表示されます。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ colcon build -h
usage: colcon build [-h] [--build-base BUILD_BASE]
[--install-base INSTALL_BASE] [--merge-install]
[--symlink-install] [--test-result-base TEST_RESULT_BASE]
[--executor {parallel,sequential}]
[--parallel-workers NUMBER]
[--event-handlers [name1+ [name2- ...]]]
[--ignore-user-meta] [--metas [PATH [PATH ...]]]
[--base-paths [PATH [PATH ...]]]
[--packages-ignore [PKG_NAME [PKG_NAME ...]]]
[--packages-ignore-regex [PATTERN [PATTERN ...]]]
[--paths [PATH [PATH ...]]]
[--packages-up-to [PKG_NAME [PKG_NAME ...]]]
[--packages-above [PKG_NAME [PKG_NAME ...]]]
[--packages-select-by-dep [DEP_NAME [DEP_NAME ...]]]
[--packages-skip-by-dep [DEP_NAME [DEP_NAME ...]]]
[--packages-select [PKG_NAME [PKG_NAME ...]]]
[--packages-skip [PKG_NAME [PKG_NAME ...]]]
[--packages-select-regex [PATTERN [PATTERN ...]]]
[--packages-skip-regex [PATTERN [PATTERN ...]]]
[--packages-start PKG_NAME] [--packages-end PKG_NAME]
[--cmake-args [* [* ...]]] [--cmake-target CMAKE_TARGET]
[--cmake-target-skip-unavailable] [--cmake-clean-cache]
[--cmake-clean-first] [--cmake-force-configure]
[--ament-cmake-args [* [* ...]]]
[--catkin-cmake-args [* [* ...]]]
Build a set of packages.
optional arguments:
[省略]
build
というverb
でダウンロードしたサンプルコードを含めてワークスペース全体をビルドします。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ cd ~/ros2_intro_colcon
$ colcon build
Starting >>> examples_rclcpp_minimal_client
Finished <<< examples_rclcpp_minimal_client [3.14s]
Starting >>> examples_rclcpp_minimal_composition
Finished <<< examples_rclcpp_minimal_composition [8.81s]
Starting >>> examples_rclcpp_minimal_publisher
Finished <<< examples_rclcpp_minimal_publisher [6.81s]
Starting >>> examples_rclcpp_minimal_service
Finished <<< examples_rclcpp_minimal_service [2.80s]
Starting >>> examples_rclcpp_minimal_subscriber
Finished <<< examples_rclcpp_minimal_subscriber [7.52s]
Starting >>> examples_rclcpp_minimal_timer
Finished <<< examples_rclcpp_minimal_timer [4.03s]
Starting >>> examples_rclpy_executors
Finished <<< examples_rclpy_executors [0.63s]
Starting >>> examples_rclpy_minimal_client
Finished <<< examples_rclpy_minimal_client [0.51s]
Starting >>> examples_rclpy_minimal_publisher
Finished <<< examples_rclpy_minimal_publisher [0.49s]
Starting >>> examples_rclpy_minimal_service
Finished <<< examples_rclpy_minimal_service [0.51s]
Starting >>> examples_rclpy_minimal_subscriber
Finished <<< examples_rclpy_minimal_subscriber [0.49s]
Summary: 11 packages finished [36.0s]
ビルド後、ワークスペースの最上位ディレクトリに2つの新しいサブディレクトリが生成されました。
build
ディレクトリはコンパイル中に作成されたテンプファイルです。
install
はソフトウェアを実行時に利用するための情報です。
catkin
と違って、colcon
のbuild
ステップはインストールも含まれています。
ソフトウェア開発のベストプラクティスに従うために、ビルド設定ファイルでインストール方法が記述されていないとソフトウェアは利用できません。
デフォルトのインストール先はワークスペースの最上位ディレクトリにあるinstall
ディレクトリです。
--install-base
オプションでインストール先が変更できます。
ROS 2でワークスペースを利用するとき、端末でそのワークスペースをアクティベートすること(有効にすること)が必要です。
このためにワークスペースの最上のディレクトリでsource install/local_setup.bash
を実行します。
このコマンドはワークスペースの情報を利用中の端末に読み込みます。
しかし、 仮のことだけ ので必ず新しい端末でワークスペースを利用し始めると 必ず まずはsource install/local_setup.bash
を実行しなければなりません。
一つの端末で一回だけ実行すれば十分です。
その端末を閉じるまでに有効です。
1
$ source install/local_setup.bash
上述を実行すれば、ワークスペースでビルドした実行ファイルは実行可能になります。
1
2
$ ros2 run examples_rclcpp_minimal_publisher publisher_member_function
...
colcon
のverb
によってワークスペース全体ではなく一つのパッケージに対して何かすることもあります。
build_pkg
、test_pkg
等はこれの例です。
このように利用するときはワークスペースの最上位ディレクトリではなく、パッケージの最上位ディレクトリ(package.xml
があるディレクトリ)で実行するか、コマンドの引数としてパッケージのパスを指定します。
この場合、ワークスペースのbuild
とinstall
ディレクトリではなくて、カレントディレクトリで生成されたbuild
とinstall
ディレクトリにビルドファイル等が置かれます。
パッケージソースを汚れないように気をつけてください。
下記の実行でminimal_client
パッケージのみをビルドします。
1
2
3
4
5
6
$ cd ~/ros2_intro_colcon
$ colcon build --packages-select examples_rclcpp_minimal_client
Starting >>> examples_rclcpp_minimal_client
Finished <<< examples_rclcpp_minimal_client [0.65s]
Summary: 1 package finished [0.86s]
colcon
はディフオルトで4つのビルドタイプがサポートされています。
cmake
純粋CMakeを利用するパッケージ用のビルドタイプです。 どんなCMakeでも対応できますが、インストール等を全部開発者が担当し、ROSの特別機能(メッセージ生成等)が簡単にできません。
python
純粋Pythonパッケージ用のビルドタイプです。
どんなsetup.py
でも対応できますが、インストール等を全部開発者が担当し、ROSの特別機能(メッセージ生成等)が簡単にできません。
ament_cmake
CMakeを利用しますが、ament_cmake
パッケージが提供するマクロでCMakeLists.txt
の作成がより簡単になります。
ワークスペースにある他パッケージへ情報の渡すこと、リソースインデクスに情報登録、テスト登録等を支援します。
ROS 2用C++ソフトウェア開発のおすすめのビルドタイプです。
ament_python
Pythonのsetuptools
用のsetup.py
を利用するためのビルドタイプです。
catkin
ROS1で利用されているcatkin
ビルドツール用のビルドタイプです。
ROS1パッケージをcolcon
でビルドするために利用します。
colcon
はcatkin
と違って、すべてのビルドされたファイルがソフトリンクされたdevel
スペースがありません。
開発中のパッケージをインストールせずに利用することはできません。
catkin
ではこの機能は主にPythonソースや設定ファイルの「編集→テスト→編集」サイクルを短縮するために開発されましたが、事実上で多い方は自分が開発したソフトウェアをインストールせずにを利用するためにこのフィーチャーを利用しました。
colcon
はdevel
スペースがないのでインストールせずにソフトウェアを利用することができません。
代わりに「symlinked install」という手法を利用します。
これはインストールステップを実行するときに、ファイルをコピーすると代わりにソフトリンクを作成します。
結果的にdevel
スペースに近いことになりますが、各ビルドツールのインストール機能を利用しているのでパッケージの開発者は何がどこにソフトリンクされるか管理できます。
1
2
3
$ cd ~/ros2_intro_colcon
$ colcon build --symlink-install
[省略]
テストが含まれいるパッケージがあれば、colcon
でそのテストの実行は可能です。
test
というverb
で実行します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ cd ~/ros2_intro_colcon
$ colcon test
Starting >>> examples_rclcpp_minimal_client
Finished <<< examples_rclcpp_minimal_client [0.05s]
Starting >>> examples_rclcpp_minimal_composition
Finished <<< examples_rclcpp_minimal_composition [0.03s]
Starting >>> examples_rclcpp_minimal_publisher
Finished <<< examples_rclcpp_minimal_publisher [0.03s]
Starting >>> examples_rclcpp_minimal_service
Finished <<< examples_rclcpp_minimal_service [0.03s]
Starting >>> examples_rclcpp_minimal_subscriber
Finished <<< examples_rclcpp_minimal_subscriber [0.03s]
Starting >>> examples_rclcpp_minimal_timer
Finished <<< examples_rclcpp_minimal_timer [0.02s]
Starting >>> examples_rclpy_executors
Finished <<< examples_rclpy_executors [1.92s]
Starting >>> examples_rclpy_minimal_client
Finished <<< examples_rclpy_minimal_client [1.27s]
Starting >>> examples_rclpy_minimal_publisher
Finished <<< examples_rclpy_minimal_publisher [1.14s]
Starting >>> examples_rclpy_minimal_service
Finished <<< examples_rclpy_minimal_service [1.07s]
Starting >>> examples_rclpy_minimal_subscriber
Finished <<< examples_rclpy_minimal_subscriber [1.10s]
Summary: 11 packages finished [6.92s]