ワークスペースとパッケージの作成
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]
|
上記のコマンドはワークスペース(今回はpractice_wsディレクトリ)で実行します.
異なるディレクトリでビルドするとディレクトリ構造を崩れる原因となるので注意してください.
ビルドするとワークスペースに下記の3つのディレクトリが生成されます.
- build : ビルド時に作成した中間ファイルが保存されます.
- install : ビルドにより生成したパッケージがインストール(保存)されます.
- log : ビルド時のログが出力されます.
パッケージの作成
次にパッケージを作成します.
パッケージは,ワークスペースの src
ディレクトリ内に作成します.
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_name
をpractice
とします.
上記のコマンドには便利なオプションが用意されています.
Python言語でプログラミングする場合には,--build-type ament_python
というオプションを加えましょう.
このオプションを加えることでsetup.py
ファイルが生成され,このファイルでエントリーポイント(プログラム実行時の起点の関数)を記述することができます.
また,このファイルを用いてsetuptools
により指定したパッケージをインストールすることができるため,自作したパッケージを配布する際に便利です.
C言語やC++言語でプログラミングする際には, --build-type
のオプションに ament_cmake
を与えます.
また,--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
|
パッケージを作成した際にライセンスに関する警告が出力されます.
--license
オプションでライセンスの種類を指定すると警告が発生せず,LICENSEファイルが自動的に作成されます.
今回は作成したパッケージを配布しないため,ライセンスについては取り扱いません.
作成したパッケージのディレクトリに移動し,ls
コマンドでどのようなディレクトリやファイルが生成されたか確認します.
1
2
3
|
$ cd practice
$ ls
package.xml practice resource setup.cfg setup.py test
|
幾つかのファイルやディレクトリが作成されたことを確認できます.
今回は--node-name
オプションを使用してパッケージを作成したため,pythonファイルが自動的に作成されます.
パッケージと同じ名前のpractice
ディレクトリの中に指定したファイル名practice_node.py
で作成されます.
pythonファイル以外にもパッケージについて説明するpackage.xml
やパッケージの情報やインストール方法を記述するsetup.py
などのファイルが生成されます.
特に,setup.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を用いたビルド
まずはこの状態でビルドして実行しましょう.
ビルドするためには,ワークスペースのルートディレクトリ(最上位のディレクトリ)に移動する必要があります.
移動したらビルドツール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
|
使用しているsetuptoolsのバージョンが58.3よりも新しい場合には警告が表示されます.
Pythonのパッケージ管理ツールがsetup.pyを用いてインストールすることが非推奨となったことが原因です.
setuptoolsをダウングレードすれば警告が表示されなくなりますが,このままでも大きな問題は発生しません.
あまり好ましい状態ではありませんが,ダウングレードによる問題が発生する可能性もあるためこのまま進めます.
無事にビルドが完了すると,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
|
上記のような出力が表示されない場合には環境変数を正しく設定できてません.
何かしらの処理を間違えた,スキップしているので見直しましょう.
なお,新しいターミナルを開いた場合には,環境変数は初期化されます.
ターミナルを開くたびに上記の設定を行ってください.
ROS2をインストールした際,ホームディレクトリに存在する.bashrc
に下記を追加しました.
1
|
source /opt/ros/humble/setup.bash
|
この設定をアンダーレイと呼びます.
これによりROS2のシステムを利用することが可能となります.
これに対して,先ほどのように自作したワークスペースを認識させる操作をオーバーレイと呼びます.
同じ名前のパッケージが存在する場合にはオーバレイのパッケージが優先されます.
普段はアンダーレイ,オーバーレイを意識する必要はありません.
実行
それでは実行しましょう.
前回と同様の方法で実行可能です.
1
2
|
$ ros2 run practice practice_node
Hi from practice.
|
ここまで正しい手順で操作できているとHi from practice.
が出力されます.
ソースコードの変更
少しだけソースコードを変更しましょう.
エディタでソースファイルを開きます.
1
|
$ vim src/practice/practice/practice_node.py
|
2行目の後に下記のコードを追加します.
先ほどの方法でビルドしても良いですが,幾つか便利なオプションが存在するので使ってみましょう.
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.
|