ワークスペースとパッケージの作成

colconを用いたワークスペース及びパッケージの作り方,Python言語によるプログラミングする方法学びます.

目的

ROS2におけるワークスペース及びパッケージの概念を理解し,演習を通してワークスペースの作成から自作ノードを起動する方法までを学びます. 講義の前半では,座学形式でワークスペースやパッケージ,ビルドツールcolconについて学び, 後半は下記の演習を通して実践的に身につけます.

前準備

ROS2がリリースした当初は,amentというビルドシステムによりビルドしていました. amentはROS2のパッケージのみビルドできるシステムでしたが,ROS2 Bouncyより新たに登場したcolconと呼ばれるビルドツールによりROS1とROS2の両方をビルドできるようになりました. 内部ではROS2パッケージをamentによりビルドしています. colconはROS2パッケージに含まれていないため,下記のコマンドによりインストールしましょう.

1
$ sudo apt install python3-colcon-common-extensions

ワークスペースとパッケージの作成

ワークスペースの作成

まずは作業用のディレクトリとなるワークスペースとパッケージを保存するsrcディレクトリを作成します.

1
2
3
4
5
$ mkdir practice_ws
$ cd practice_ws
$ mkdir src
$ pwd
/home/[user_name]/practice_ws

上記のコマンドの pwdはカレントディレクトリまでの絶対パスを表示するコマンドです. 出力結果の [user_name]には,各自が作成したアカウントの名前が入ります. 今後の作業では,頻繁にディレクトリの作成と移動を繰り返すため, カレントディレクトリまでの絶対パスが把握しにくくなります. そのような際には,pwd コマンドでカレントディレクトリまでの絶対パスを確認してください.

まだパッケージを作成していませんが,この状態でもビルドできます. 下記のコマンドによりビルドしましょう.

1
2
$ colcon build
Summary: 0 packages finished [0.29s]

ビルドするとワークスペースに下記の3つのディレクトリが生成されます.

  • build : ビルド時に作成した中間ファイルが保存されます.
  • install : ビルドにより生成したパッケージがインストール(保存)されます.
  • log : ビルド時のログが出力されます.

パッケージの作成

次にパッケージを作成します. パッケージは,ワークスペースの src ディレクトリ内に作成します. cdコマンドでsrcディレクトリに移動します.

1
$ cd src

パッケージの作成にはpkg createコマンドを使用します. ヘルプを確認してみましょう.

 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
32
33
34
35
36
37
38
39
40
$ ros2 pkg create -h
usage: ros2 pkg create [-h] [--package-format {2,3}]
                       [--description DESCRIPTION] [--license LICENSE]
                       [--destination-directory DESTINATION_DIRECTORY]
                       [--build-type {cmake,ament_cmake,ament_python}]
                       [--dependencies DEPENDENCIES [DEPENDENCIES ...]]
                       [--maintainer-email MAINTAINER_EMAIL]
                       [--maintainer-name MAINTAINER_NAME]
                       [--node-name NODE_NAME] [--library-name LIBRARY_NAME]
                       package_name

Create a new ROS 2 package

positional arguments:
  package_name          The package name

options:
  -h, --help            show this help message and exit
  --package-format {2,3}, --package_format {2,3}
                        The package.xml format.
  --description DESCRIPTION
                        The description given in the package.xml
  --license LICENSE     The license attached to this package; this can be an
                        arbitrary string, but a LICENSE file will only be
                        generated if it is one of the supported licenses (pass
                        '?' to get a list)
  --destination-directory DESTINATION_DIRECTORY
                        Directory where to create the package directory
  --build-type {cmake,ament_cmake,ament_python}
                        The build type to process the package with
  --dependencies DEPENDENCIES [DEPENDENCIES ...]
                        list of dependencies
  --maintainer-email MAINTAINER_EMAIL
                        email address of the maintainer of this package
  --maintainer-name MAINTAINER_NAME
                        name of the maintainer of this package
  --node-name NODE_NAME
                        name of the empty executable
  --library-name LIBRARY_NAME
                        name of the empty library

オプションが多いですが,最低でもpackage_nameが必要であることがわかります. 今回はpackage_namepracticeとします.

上記のコマンドには便利なオプションが用意されています. Python言語でプログラミングする場合には,--build-type ament_pythonというオプションを加えましょう. このオプションを加えることでsetup.pyファイルが生成され,このファイルでエントリーポイント(プログラム実行時の起点の関数)を記述することができます. また,このファイルを用いてsetuptoolsにより指定したパッケージをインストールすることができるため,自作したパッケージを配布する際に便利です.

また,--node-name [node_name]というオプションも加えましょう. [node_name]で指定した名前のpythonファイルが生成されます. それでは,下記のコマンドでパッケージを作成します.

 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
32
33
34
35
36
37
38
$ ros2 pkg create --build-type ament_python --node-name practice_node practice 
going to create a new package
package name: practice
destination directory: /home/yuu/practice_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['yuu <yuu@todo.todo>']
licenses: ['TODO: License declaration']
build type: ament_python
dependencies: []
node_name: practice_node
creating folder ./practice
creating ./practice/package.xml
creating source folder
creating folder ./practice/practice
creating ./practice/setup.py
creating ./practice/setup.cfg
creating folder ./practice/resource
creating ./practice/resource/practice
creating ./practice/practice/__init__.py
creating folder ./practice/test
creating ./practice/test/test_copyright.py
creating ./practice/test/test_flake8.py
creating ./practice/test/test_pep257.py
creating ./practice/practice/practice_node.py

[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 identitifers:
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

作成したパッケージのディレクトリに移動し,lsコマンドでどのようなディレクトリやファイルが生成されたか確認します.

1
2
3
$ cd practice
$ ls 
package.xml  practice  resource  setup.cfg  setup.py  test

幾つかのファイルやディレクトリが作成されたことを確認できます. 今回は--node-nameオプションを使用してパッケージを作成したため,pythonファイルが自動的に作成されます. パッケージと同じ名前のpracticeディレクトリの中に指定したファイル名practice_node.pyで作成されます.

practice_node.pyをエディタで開いてみましょう.

1
2
$ cd practice
$ vim practice_node.py

初期の状態では,ROSの機能を使用するコードは記述されておらず, print関数で文字列を出力するのみとなっています.

1
2
3
4
5
6
def main():
    print('Hi from practice.')


if __name__ == '__main__':
    main()

colconを用いたビルド

まずはこの状態でビルドして実行しましょう. ビルドするためには,ワークスペースのルートディレクトリ(最上位のディレクトリ)に移動する必要があります.

1
$ cd ../../../

移動したらビルドツールcolconを用いてビルドします.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ colcon build
Starting >>> practice
--- stderr: practice                   
/usr/lib/python3/dist-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
---
Finished <<< practice [0.43s]

Summary: 1 package finished [0.73s]
  1 package had stderr output: practice

無事にビルドが完了すると,buildとinstall,logディレクトリが生成されます.

1
2
$ls
build  install  log  src

buildはビルド中に生成されるテンポラリファイル,installは実行時に使用するファイル,logはビルド時の出力を記録したファイルが保存されます.

ノードの起動

環境変数の設定

作成したノードを起動する前に,作成したパッケージがどこにあるかをコンピュータに認識させる必要があります. そのため,sourceコマンドを用いて環境変数を設定します.

1
$ source install/setup.bash

上記のコマンドにより環境変数$COLCON_PREFIX_PATHにビルド時に生成したインストールファイルのパスが設定されます. 試しにechoコマンドで確認しましょう.

1
2
$ echo $COLCON_PREFIX_PATH
/home/yuu/practice_ws/install

上記のような出力が表示されない場合には環境変数を正しく設定できてません. 何かしらの処理を間違えた,スキップしているので見直しましょう. なお,新しいターミナルを開いた場合には,環境変数は初期化されます. ターミナルを開くたびに上記の設定を行ってください.

実行

それでは実行しましょう. 前回と同様の方法で実行可能です.

1
2
$ ros2 run practice practice_node
Hi from practice.

ここまで正しい手順で操作できているとHi from practice.が出力されます.

ソースコードの変更

少しだけソースコードを変更しましょう. エディタでソースファイルを開きます.

1
$ vim src/practice/practice/practice_node.py

2行目の後に下記のコードを追加します.

1
    print('Hello ROS2.')

先ほどの方法でビルドしても良いですが,幾つか便利なオプションが存在するので使ってみましょう.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
$ colcon build --packages-select practice --symlink-install
Starting >>> practice
--- stderr: practice                   
/usr/lib/python3/dist-packages/setuptools/command/install.py:34: SetuptoolsDeprecationWarning: setup.py install is deprecated. Use build and pip and other standards-based tools.
  warnings.warn(
---
Finished <<< practice [0.42s]

Summary: 1 package finished [0.71s]
  1 package had stderr output: practice

オプション--packages-select [package_name]は,指定したパッケージのみをビルドする方法です. ワークスペースの規模が大きくなるとビルドに時間を要します. 特定のパッケージのみビルドしたい場合に利用しましょう. もう1つのオプション--symlink-installは,installディレクトリにファイルをコピーする代わりにシンボリックリンク(ショートカット)を作成します. これにより,プログラムを変更しても再ビルドが必要なくなります. 作業の効率が高くなり,生産性が向上しますのでぜひ使用しましょう.

改変したプログラムを実行すると下記のような出力が得られます.

1
2
3
$ ros2 run practice practice_node
Hi from practice.
Hello ROS2.