ROS 2のツールの使い方

Updated on: 2019-09-05

トップに戻る

ROS 2の開発はまだ途中です。 APIやライブラリの開発は進みましたが、ツール開発まだ始まりの段階です。 それでも、利用できるツールはいくつかあります。 本セクションではROS 2が提供するツールを説明します。

「ros2」コマンド

ros2はROS 2の主なコマンドライン(CUI)ツールです。 ROS 1のrostopicrosservice等のコマンドの変わりです。 様々な「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

「msg」サブコマンド

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」サブコマンド

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」サブコマンド

nodeサブコマンドは現在ただ起動中のノードのリストを表示するために利用します。

1
2
3
4
$ ros2 node list
greeting_server
greeter
displayer

将来ノードのライフサイクルを扱うため等にも利用するかもしれません。

「pkg」サブコマンド

パッケージについての情報を出力するためのサブコマンドです。 特に実行ファイルのリストアップに便利です。

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
【省略】

「run」サブコマンド

パッケージ内にある実行ファイルを起動するためのサブコマンドです。ROS 1のrosrunと同様です。

「topic」サブコマンド

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

「service」サブコマンド

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')

「rviz2」

ROS 2へrvizのポーティング作業は始まったばかりです。 2017の秋ぐらいに動く状態になって、未完成のフィーチャーはまだ多いです。

端末でrviz2の実行で起動できます。

rviz2

使い方はROS 1と同様です。

「launch」

ROS 2のシステム起動するツールはROS 1のroslaunchとかなり違うことになる予定です。 実装もまだので、テストのための簡単なツールしかありません。

roslaunchと主な差は、XMLでシステムを定義することではなくて、Pythonでシステムの起動方法を記述することです。 CMakeと類似なこととして考えても良いです。 Pythonの利用のでシステム起動のイベントへ反応することや環境情報によって起動方法を自動的に変更することが可能になります。

launchファイル

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」コマンド

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