Updated on: 2019-09-05
ROS 2の開発はまだ途中です。 APIやライブラリの開発は進みましたが、ツール開発まだ始まりの段階です。 それでも、利用できるツールはいくつかあります。 本セクションではROS 2が提供するツールを説明します。
ros2
はROS 2の主なコマンドライン(CUI)ツールです。
ROS 1のrostopic
、rosservice
等のコマンドの変わりです。
様々な「verb」と呼ぶサブコマンドでROS 2のノード、トピック等を操ることができます。
ros2 -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
$ ros2 -h
usage: ros2 [-h] Call `ros2 <command> -h` for more detailed usage. ...
ros2 is an extensible command-line tool for ROS 2.
optional arguments:
-h, --help show this help message and exit
Commands:
action Various action related sub-commands
component Various component related sub-commands
daemon Various daemon related sub-commands
launch Run a launch file
lifecycle Various lifecycle related sub-commands
msg Various msg related sub-commands
multicast Various multicast related sub-commands
node Various node related sub-commands
param Various param related sub-commands
pkg Various package related sub-commands
run Run a package specific executable
security Various security related sub-commands
service Various service related sub-commands
srv Various srv related sub-commands
topic Various topic related sub-commands
Call `ros2 <command> -h` for more detailed usage.
下記でよく利用するサブコマンドを説明します。 例を実行するために、ワークスペースで3つの端末を起動して、3つのノードを起動します。
端末1:
1
2
3
$ cd ~/ros2_basics
$ source install/local_setup.bash
$ ros2 run greeter greeter
端末2:
1
2
3
$ cd ~/ros2_basics
$ source install/local_setup.bash
$ ros2 run displayer displayer
端末3:
1
2
3
$ cd ~/ros2_basics
$ source install/local_setup.bash
$ ros2 run greeting_server greeting_server
ros2 msg
はROS 1のrosmsg
コマンドと類似です。
利用可能なメッセージ型のリストアップ、あるメッセージ型の表示などができます。
システムにある全メッセージ型のリストはlist
サブコマンドで出力します。
1
2
3
4
5
6
7
8
9
10
11
$ ros2 msg list
actionlib_msgs/GoalID
actionlib_msgs/GoalStatus
actionlib_msgs/GoalStatusArray
builtin_interfaces/Duration
builtin_interfaces/Time
diagnostic_msgs/DiagnosticArray
diagnostic_msgs/DiagnosticStatus
diagnostic_msgs/KeyValue
geometry_msgs/Accel
【省略】
package
サブコマンドは一つのパッケージにあるメッセージ型を表示します。
1
2
$ ros2 msg package greeting_msg
greeting_msg/Greeting
メッセージ型の内容はshow
サブコマンドで表示します。
1
2
3
4
$ ros2 msg show greeting_msg/Greeting
string hello_text
string world_name
int16 count
srv
サブコマンドはROS 1のrossrv
コマンドの変わりです。
msg
サブコマンドと同様に利用します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ ros2 srv list
composition/LoadNode
diagnostic_msgs/AddDiagnostics
diagnostic_msgs/SelfTest
example_interfaces/AddTwoInts
lifecycle_msgs/ChangeState
lifecycle_msgs/GetAvailableStates
lifecycle_msgs/GetAvailableTransitions
lifecycle_msgs/GetState
logging_demo/ConfigLogger
map_msgs/GetMapROI
【省略】
$ ros2 srv package request_greeting_service
request_greeting_service/RequestGreeting
$ ros2 srv show request_greeting_service/RequestGreeting
string name
---
string greeting
node
サブコマンドは現在ただ起動中のノードのリストを表示するために利用します。
1
2
3
4
$ ros2 node list
greeting_server
greeter
displayer
将来ノードのライフサイクルを扱うため等にも利用するかもしれません。
パッケージについての情報を出力するためのサブコマンドです。 特に実行ファイルのリストアップに便利です。
1
2
$ ros2 pkg executables greeter_ros2_style
greeter_ros2_style greeter
list
で利用可能なパッケージリストの出力ができます。
1
2
3
4
5
6
7
8
9
10
11
12
13
$ ros2 pkg list
actionlib_msgs
amcl
ament_cmake
ament_cmake_auto
ament_cmake_clang_format
ament_cmake_copyright
ament_cmake_core
ament_cmake_cppcheck
ament_cmake_cpplint
ament_cmake_export_definitions
ament_cmake_export_dependencies
【省略】
パッケージ内にある実行ファイルを起動するためのサブコマンドです。ROS 1のrosrun
と同様です。
ROS 1のrostopic
コマンドと同様にトピックとのインタラクションのためのサブコマンドです。
ノードが利用しているトピックのリストはlist
サブ子何度で表示します。
1
2
3
4
$ ros2 topic list
/clock
/greeting
/parameter_events
トピックに流れているデータはecho
サブコマンドでします。
1
2
3
4
5
6
7
8
9
10
11
12
$ ros2 topic echo /greeting
hello_text: hello
world_name: world
count: 444
hello_text: hello
world_name: world
count: 445
hello_text: hello
world_name: world
count: 446
echo
サブコマンドでトピックにデータの送信ができます。
シンタクスはrostopic
と同様で、データはYAMLで指定します。
1
2
3
4
5
6
7
8
9
10
11
$ ros2 topic pub /greeting greeting_msg/Greeting '{hello_text: gidday, world_name: planet, count: 42}'
publisher: beginning loop
publishing greeter_custom_msg.msg.Greeting(hello_text='gidday', world_name='planet', count=42)
publishing greeter_custom_msg.msg.Greeting(hello_text='gidday', world_name='planet', count=42)
publishing greeter_custom_msg.msg.Greeting(hello_text='gidday', world_name='planet', count=42)
publishing greeter_custom_msg.msg.Greeting(hello_text='gidday', world_name='planet', count=42)
^C
ROS 1のrosservice
コマンドと同様にサービスのインタラクションのためのサブコマンドです。
ノードが利用してうるサービスのリストはlist
サブコマンドで表示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ ros2 service list
/displayer/describe_parameters
/displayer/get_parameter_types
/displayer/get_parameters
/displayer/list_parameters
/displayer/set_parameters
/displayer/set_parameters_atomically
/greeter/describe_parameters
/greeter/get_parameter_types
/greeter/get_parameters
/greeter/list_parameters
/greeter/set_parameters
/greeter/set_parameters_atomically
/greeting_server/describe_parameters
/greeting_server/get_parameter_types
/greeting_server/get_parameters
/greeting_server/list_parameters
/greeting_server/set_parameters
/greeting_server/set_parameters_atomically
/request_greeting
サービスコールはcall
サブコマンドでします。
1
2
3
4
5
$ ros2 service call /request_greeting request_greeting_service/RequestGreeting '{name: Bob}'
requester: making request: request_greeting_service.srv.RequestGreeting_Request(name='Bob')
response:
request_greeting_service.srv.RequestGreeting_Response(greeting='Hello, Bob')
ROS 2へrviz
のポーティング作業は始まったばかりです。
2017の秋ぐらいに動く状態になって、未完成のフィーチャーはまだ多いです。
端末でrviz2
の実行で起動できます。
使い方はROS 1と同様です。
ROS 2のシステム起動するツールはROS 1のroslaunch
とかなり違うことになる予定です。
実装もまだので、テストのための簡単なツールしかありません。
roslaunch
と主な差は、XMLでシステムを定義することではなくて、Pythonでシステムの起動方法を記述することです。
CMakeと類似なこととして考えても良いです。
Pythonの利用のでシステム起動のイベントへ反応することや環境情報によって起動方法を自動的に変更することが可能になります。
ROS 2のlaunch
フィあるはXMLではなくてPythonで記述します。
ROS 2 Dashing DiademataではXMLフォーマットが戻る予定ですが、Pythonフォーマットはメインです。
Pythonで記述する利点は、起動中のイベントに判断した反応するlaunchファイル等が実装かのうです。
下記は例です。
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
import launch
import launch_ros.actions
def generate_launch_description():
greeter = launch_ros.actions.Node(
package='greeter',
node_executable='greeter',
output='screen'
)
displayer = launch_ros.actions.Node(
package='displayer',
node_executable='displayer',
output='screen'
)
return launch.LaunchDescription([
greeter,
displayer,
launch.actions.RegisterEventHandler(
event_handler=launch.event_handlers.OnProcessExit(
target_action=displayer,
on_exit=[launch.actions.EmitEvent(event=launch.events.Shutdown())],
)),
])
ワークスペースのトップディレクトリにgreetings.launch.py
というファイルを作成して、上記の内容を入力します。
launch
コマンドはROS 2に含まれています。
launch
ファイル名を渡して実行します。
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
$ cd ~/ros2_basics
$ source install/local_setup.bash
$ ros2 launch greetings.launch.py
(0) pid 15613: ['/home/geoff/src/workspaces/ros2_basics/install/lib/greeter_custom_msg/greeter'] (stderr > stdout, all > console)
(1) pid 15614: ['/home/geoff/src/workspaces/ros2_basics/install/lib/displayer_custom_msg/displayer'] (stderr > stdout, all > console)
^C(0) signal SIGINT
(1) signal SIGINT
[0] [INFO] [greeter]: Publishing greeting 'hello world 0'
[0] [INFO] [greeter]: Publishing greeting 'hello world 1'
[0] [INFO] [greeter]: Publishing greeting 'hello world 2'
[0] [INFO] [greeter]: Publishing greeting 'hello world 3'
[0] [INFO] [greeter]: Publishing greeting 'hello world 4'
[0] [INFO] [greeter]: Publishing greeting 'hello world 5'
[0] [INFO] [greeter]: Publishing greeting 'hello world 6'
[0] signal_handler(2)
[0] signal_handler(2)
[1] [INFO] [displayer]: Received greeting 'hello world 0'
[1] [INFO] [displayer]: Received greeting 'hello world 1'
[1] [INFO] [displayer]: Received greeting 'hello world 2'
[1] [INFO] [displayer]: Received greeting 'hello world 3'
[1] [INFO] [displayer]: Received greeting 'hello world 4'
[1] [INFO] [displayer]: Received greeting 'hello world 5'
[1] [INFO] [displayer]: Received greeting 'hello world 6'
[1] signal_handler(2)
[1] signal_handler(2)
(0) rc 0
(1) rc 0