ROS 2のワークスペース:colconとパッケージ

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 software use flow

このセクションでは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
$

基本的にパッケージは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)

-gオプションを付けるとさらにワークスペース内のパッケージが依存するパッケージのリストアップも可能です。

1
2
3
4
5
6
7
8
9
10
11
12
$ colcon list -g
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というサブコマンドと一緒に利用します。 利用可能なverbcolcon -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と違って、colconbuildステップはインストールも含まれています。 ソフトウェア開発のベストプラクティスに従うために、ビルド設定ファイルでインストール方法が記述されていないとソフトウェアは利用できません。 デフォルトのインストール先はワークスペースの最上位ディレクトリにある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
...

一つのパッケージのビルド

colconverbによってワークスペース全体ではなく一つのパッケージに対して何かすることもあります。 build_pkgtest_pkg等はこれの例です。 このように利用するときはワークスペースの最上位ディレクトリではなく、パッケージの最上位ディレクトリ(package.xmlがあるディレクトリ)で実行するか、コマンドの引数としてパッケージのパスを指定します。 この場合、ワークスペースのbuildinstallディレクトリではなくて、カレントディレクトリで生成されたbuildinstallディレクトリにビルドファイル等が置かれます。 パッケージソースを汚れないように気をつけてください。

下記の実行で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つのビルドタイプがサポートされています。

ソフトリンクインストール

colconcatkinと違って、すべてのビルドされたファイルがソフトリンクされたdevelスペースがありません。 開発中のパッケージをインストールせずに利用することはできません。 catkinではこの機能は主にPythonソースや設定ファイルの「編集→テスト→編集」サイクルを短縮するために開発されましたが、事実上で多い方は自分が開発したソフトウェアをインストールせずにを利用するためにこのフィーチャーを利用しました。 colcondevelスペースがないのでインストールせずにソフトウェアを利用することができません。 代わりに「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]