WindowsにDockerを使ってROS2 Jazzyを入れましたが、本命はこちらです。
結局、他にも利用しているWindowsパソコンだとロボット制御専用にはできないので、実際のプロジェクトは、Raspberry Pi 5の方で進めることになります。ただ、Raspberry Pi は、DebianベースでUbuntuベースではないので、パッケージをそのままインストールという訳には、行きませんでした。
ROS2 Jazzy をインストールする
以下のサイトを参考(というかほぼその通り)にさせて頂きました。
Python仮想環境のリセット
もし、pyenv を使って仮想環境を設定していた場合は、バージョンエラーが多発するので、元々のシステムにインストールされたpythonのバージョンに戻しておきます。
$ python -V
Python 3.11.10
$ pyenv global system
$ python -V
Python 3.11.2
ロケールの設定
前回の設定でロケールは、ja_JP.UTF-8になっています。
ROS2は、en_US.UTF-8 が前提とのことで、ロケール設置を変更しておきます。
sudo apt update && sudo apt install -y locales
/etc/locale.gen を編集します。
sudo nano /etc/locale.gen
以下の3つのロケールをコメントアウトして有効にします。
… (略)
C.UTF-8 UTF-8
… (略)
en_US.UTF-8 UTF-8
… (略)
ja_JP.UTF-8 UTF-8
… (略)
ロケールを生成し、更新します。
sudo locale-gen
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
必要なリポジトリを有効にする
まずは、必要なパッケージをインストールします。
sudo apt install -y software-properties-common
ROS2 GPG キーを追加します。
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
リポジトリに追加します。
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
開発ツールをインストール
以下のようにコマンドを実行してパッケージをインストールします。
sudo apt update && sudo apt install -y \
python3-mypy \
python3-pip \
python3-flake8-blind-except \
python3-flake8-class-newline \
python3-flake8-deprecated \
python3-pytest \
python3-pytest-cov \
python3-pytest-mock \
python3-pytest-repeat \
python3-pytest-rerunfailures \
python3-pytest-runner \
python3-pytest-timeout \
ros-dev-tools
ROS2のビルド
ROS2 Jazzy のコードを取得します。
mkdir -p ~/ros2_jazzy/src
cd ~/ros2_jazzy/
vcs import --input https://raw.githubusercontent.com/ros2/ros2/jazzy/ros2.repos src
rosdepを使って依存パッケージをインストールします。
cd ~/ros2_jazzy/
sudo apt upgrade
sudo rosdep init
rosdep update
rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers"
ROS2 Jazzy をビルドします。3時間弱かかりました。
cd ~/ros2_jazzy/
colcon build --symlink-install
環境のセットアップ
ROS2を使用するときには、以下を実行する。
. ~/ros2_jazzy/install/local_setup.bash
例題を実行
新しいターミナルを開いて以下のように talker を実行します。
$ . ~/ros2_jazzy/install/local_setup.bash
$ ros2 run demo_nodes_cpp talker
別のターミナルで以下のように listener を実行します。
$ . ~/ros2_jazzy/install/local_setup.bash
$ ros2 run demo_nodes_py listener
Ctrl+C で終了します
インストールは、これで完了です。
ROS2 を学ぶ
ここでは、チュートリアルを実践してみます。
初心者用チュートリアル(CLI)を行って、ROS2の使い方を学習します。
環境設定
Raspberry Pi でROS2の演習をする際には、沢山のターミナルを立ち上げる事になります。
毎回、立ち上げるたびにセットアップをするのは面倒なので、ターミナル起動時に自動でセットアップが動くようにします。
echo "source ~/ros_jazzy/install/setup.bash" >> ~/.bashrc
上記のように一度セットアップしておけば、以降は、このおまじないは不要になります。
turtlesim を動かしてみる
turtlesim の起動
turtlesim は、ROS2 を学習するための軽量シミュレータです。
なのでチュートリアルでは、turtlesim を使ってROS2の基本を学習します。
まずは、パッケージがインストールされていることを確認します。
ros2 pkg executables turtlesim
以下のように表示されれば、OKです。
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node
基本的にROS2でプログラムを動かすときのコマンドはros2で始まります。
なのでどういったコマンドがあるかの調査は、以下で行います。
~/ros2_jazzy $ ros2 -h
usage: ros2 [-h] [--use-python-default-buffering] Call `ros2 <command> -h` for more detailed usage. ...
ros2 is an extensible command-line tool for ROS 2.
options:
-h, --help show this help message and exit
--use-python-default-buffering
Do not force line buffering in stdout and instead use the python default buffering, which
might be affected by PYTHONUNBUFFERED/-u and depends on whatever stdout is interactive or not
Commands:
action Various action related sub-commands
bag Various rosbag related sub-commands
component Various component related sub-commands
daemon Various daemon related sub-commands
doctor Check ROS setup and other potential issues
interface Show information about ROS interfaces
launch Run a launch file
lifecycle Various lifecycle 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
topic Various topic related sub-commands
wtf Use `wtf` as alias to `doctor`
Call `ros2 <command> -h` for more detailed usage.
いずれも重要なコマンドですが、特に覚えておくべきものを確認しておきます。
run | パッケージを実行する。 |
node | ノード関連の各種サブコマンド |
topic | さまざまなトピック関連のサブコマンド |
service | 各種サービス関連のサブコマンド |
この説明では、内容まではあまり分かりませんが、以下のROS2で何かを動かす場合には、以下の法則で動かすというルールがあることは分かりました。
ros2 <コマンド> <各コマンドの引数>
では、turtlesim を動かしてみます。
動かす場合は、以下のコマンドで動かします。
ros2 run <パッケージ名> <実行ファイル名>
turtlesimの受信側(サブスクライバー)は、以下のコマンドで動かします。
ros2 run turtlesim turtlesim_node
シミュレーターウィンドウが表示され、中央にランダムなカメが表示されます。
実行ファイル名「turtlesim_node」は、プログラムで決められている名前なので、この通りに指定しないと起動しません。
[INFO] [1725769049.678584777] [turtlesim]: Starting turtlesim with node name /turtlesim
[INFO] [1725769049.722316059] [turtlesim]: Spawing turtle [turtle1] at x=[5.544445], y=[5.544445], theta=[0.000000]
起動したターミナルに上記のように表示されて、別途、シミュレーション画面が表示されて中央にカメが配置されます。
turtlesim の発信側(パブリッシャー)は、以下のコマンドで起動します。
ros2 run turtlesim turtle_teleop_key
実行すると以下のように表示されます。
Reading from keyboard
----------------------------
Use arrow keys to move the turtle.
Use g|b|v|c|d|e|r|t keys to rotate to absolute orientations. 'f' to cancel a rotation.
'q' to quit.
矢印キー(↑:前進、↓:後退、←:反時計回りに回転、⇒:時計回りに回転)や指定されたキー入力(G,B,V,C,D,E,R,T)に従って画面の上のカメが移動します。カメを止めるには[F]キー、プログラムを終了するには[Q]キーを入力します。
移動した軌跡は白い線となってシミュレータ画面に表示されます。
これで、受信側(サブスクライバー)と発信側(パブリッシャー)のノードが立ち上がりました。
この2つがメッセージを送受信してカメが動いています。
ノードの確認
ROS2におけるノードはモータを動かしたり、画像をカメラから入力して処理したりといった機能を担っています。各ノードは、トピック、サービス、アクション、パラメータを利用してほかのノードとデータを送受信します。ROS2では1つの実行ファイルに1つ以上のノードを含めることが可能です。
それでは、現在のノードがどうなっているか確認してみます。
ros2 node list
上記のコマンドでノードリストを表示します。
/teleop_turtle
/turtlesim
以下のコマンドでノードの詳細情報を表示します。
ros2 node info /turtlesim
ノード「/turtlesim」の詳細情報が表示されます。
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/get_type_description: type_description_interfaces/srv/GetTypeDescription
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
ノード「/teleop_turtle」の詳細情報も表示してみます。
ros2 node info /teleop_turtle
以下のように表示されます。
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Service Servers:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/get_type_description: type_description_interfaces/srv/GetTypeDescription
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
ノードが2つ立ち上がり、それぞれパブリッシャー(発信者)とサブスクライバー(受信者)として動いていることが分かります。2つのターミナルの送受信は、/turtle1/cmd_velを介して行われています。
/turtlesim
Subscribers:
/turtle1/cmd_vel: geometry_msgs/msg/Twist
/teleop_turtle
Publishers:
/turtle1/cmd_vel: geometry_msgs/msg/Twist
この「/turtle1/cmd_vel」はトピックと呼ばれ、各ノードの通信の仲介をします。
rqt を使ってみる
まだ、rqtが入っていない場合は、以下で使ってインストールします。
sudo apt update
sudo apt install -y '~nros-jazzy-rqt*'
新しいターミナルでrqtを起動します。
rqt
rqt が起動したら メニューから「plugins」→「Services」→「Service Caller」を選択します。
Service のプルダウンを選択すると沢山の呼び出し可能なサービスが表示されています。
先ほどのノード情報を確認したときに表示されていたサービスの情報が表示されています。
rqt から実際にサービスを呼び出すことが可能です。
サービスに「/spawn」を選択して、各パラメータを設定して呼び出してみます。
各パラメータを{x: 1.0, y: 1.0, theta: 0.0, name: ‘turtle2’}にしてCallしてみます。
カメが1匹追加されました。
別のサービス「/turtle1/set_pen」を呼び出してみます。
これは、turtle1の奇跡のペンの色やサイズを変更するサービスです。
ペンを変更後にカメを動かしてみます。
追加されたカメは動かないですね。
リマップ してみる
追加されたカメ(turtle2)を動かすためには、turtle_teoeop_keyがもう一つ必要ですが、普通に起動するとturtle1とも繋がってしまいます。この動作を変更するには、トピック「cmd_vel」をリマップします。
ros2 run turtlesim turtle_teleop_key --ros-args --remap turtle1/cmd_vel:=turtle2/cmd_vel
独立して追加されたカメ(tertle2)も動かせるようになります。
ノードを学ぶ
turtlesim のノードの確認
再び、turtlesimを起動します。2つのターミナルでそれぞれ以下をコマンドを実行します。
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
ノードリストを確認してみます。
$ ros2 node list
/teleop_turtle
/tertlesim
リマップしてみる
リマップして別のシミュレーターを起動します。
ros2 run turtlesim turtlesim_node --ros-args --remap __node:=my_turtles
新しいシミュレータ画面が表示されました。
ノードリストを確認してみます。
$ ros2 node list
/my_turtle
/teleop_turtle
/tertlesim
ノード情報
ノードの詳細情報を確認してみます。
$ ros2 node info /my_turtle
/my_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/my_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/my_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/my_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/my_turtle/get_type_description: type_description_interfaces/srv/GetTypeDescription
/my_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/my_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/my_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
カメを動かしてみます。「turtle_teleop_key」を動かしたターミナルで矢印キーを動かしてカメを動かしてみます。
1つの入力で2つのシミュレーターが同時に動くのが確認できました。
トピックを学ぶ
いつものように2つのターミナルで「ros2 run turtlesim turtlesim_node」と「ros2 run turtlesim turtle_teleop_key」を起動しておきます。
別のターミナルで「rqt_graph」コマンドを入力すると、rqt_graphのGUI画面が新たに立ち上がります。
rqt_graph を確認してみる
$ rqt_graph
Node Graph の対象を「Nodes/Topics (active)」にして、Groupを0に、Debugのチェックをオン、tfのチェックをオンにすると以下のような表示になります。
最新化は、画面サイズに合わせてグラフを調整するのはで行うことが出来ます。
上記のノードとトピック、およびグラフの周囲にある 2 つのアクションが表示されます (今は無視します)。中央のトピック「/turtle1/cmd_vel」の上にマウスを移動すると、上の画像のように色が強調表示されます。
グラフは、/turtlesim ノードと /teleop_turtle ノードが /turtle1/cmd_vel トピックを介して相互に通信している様子表しています。/teleop_turtle ノードはトピックにデータ (カメを移動するために入力したキーストローク) を公開し、/turtlesim ノードはそのトピックをサブスクライブしてデータを受信します。
トピックのリスト
新しいターミナルで「ros2 topic list」コマンドを実行すると、システムで現在アクティブなすべてのトピックのリストが返されます。
$ ros2 topic list
/parameter_events
/rosout
/turtle1/cmd_vel
/turtle1/color_sensor
/turtle1/pose
「ros2 topic list -t」コマンドを実行すると、同じトピックのリストを返しますが、今回はトピックの種類が括弧内に追加されます。
$ ros2 topic list -t
/parameter_events [rcl_interfaces/msg/ParameterEvent]
/rosout [rcl_interfaces/msg/Log]
/turtle1/cmd_vel [geometry_msgs/msg/Twist]
/turtle1/color_sensor [turtlesim/msg/Color]
/turtle1/pose [turtlesim/msg/Pose]
これらの属性、特にタイプは、トピック間を移動するときにノードが同じ情報について話していることを認識する方法です。
これらすべてのトピックが rqt_graph のどこにあるか分からない場合は、[非表示] の下のボックスをすべてチェック解除できます。
トピックの情報
トピックの情報を表示するには、以下を使用します。
$ ros2 topic info <topic_name>
トピック /turtle1/cmd_dev の情報を表示します。
$ ros2 topic info /turtle1/cmd_vel
以下のように表示されます。
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1
トピック /turtle1/cmd_vel が仲介するメッセージの型が「geometry_msgs/msg/Twist」であるということが分かります。このトピックを介してデータのやり取りを行っているパブリッシャーが1、サブスクライバーが1であることが分かります。
トピックのエコー
トピックに公開されているデータを表示するには、以下を使用します。
$ ros2 topic echo <topic_name>
/teleop_turtle がトピック /turtle1/cmd_vel にデータを公開することがわかっているので、echo を使用してそのトピックを確認してみます。
$ ros2 topic echo /turtle1/cmd_dev
最初、このコマンドはデータを返しません。これは、「/teleop_turtle」が何か公開するのを待機しているためです。
「turtle_teleop_key」が実行中のターミナルに戻り、矢印を使用してタートルを動かします。同時に 「echo」が実行中のターミナルを見ると、移動するたびに位置データが公開されていることがわかります。
linear:
x: 2.0
y: 0.0
z: 0.0
anglure:
x: 0.0
y: 0.0
z: 0.0
---
「/_ros2cli_397」は、先ほど実行したechoコマンドによって作成されたノードです。(番号は異なる場合があります)。これで、パブリッシャーがトピックを介してデータを公開し、2 つのサブスクライバーがトピックにサブスクライブしていることがわかります。
インターフェースの表示
ノードはメッセージを使用してトピックを介してデータを送信します。パブリッシャーとサブスクライバーは通信するために同じタイプのメッセージを送受信する必要があります。
「ros2 topic list -t」や「ros2 topic info /turtle1/cmd_vel」を実行後に確認したトピックのタイプから、各トピックで使用されるメッセージの型が分かります。「cmd_vel」トピックの型は次のようになります。
geometry_msgs/msg/Twist
これは、「geometry_msgs」中の「Twist」と呼ばれる「msg」が存在することを意味します。
$ ros2 interface show <msg_type>
「ros2 interface show <msg type>」を実行すれば、メッセージの型の詳細情報が確認できます。これは、トピックが仲介するメッセージのデータの構造です。
$ ros2 interface show geometry_msgs/msg/Twist
実行すると以下のように表示されます。
# This expresses velocity in free space broken into its linear and angular parts.
Vector3 linear
float64 x
float64 y
float64 z
Vector3 angular
float64 x
float64 y
float64 z
このメッセージの型が表しているのは、「linear」が直線移動の速さを表し、「angular」が回転の角度を表しています。
先ほどのトピックのエコーを確認するコマンドで確認してみると、上下の矢印キーではlinearのxの値がプラス/マイナスで表示され、左右の矢印キーではangularのzの値がプラス/マイナスで表示されます。
トピックへのデータ配信
メッセージ構造が確認できたので、次のコマンドを使用して、コマンド ラインから直接トピックにデータを公開できます。
$ ros2 topic pub <topic_name> <msg_type> '<args>'
引数'<args>'
は、前のセクションで説明した構造でトピックに渡す実際のデータです。
この引数は YAML 構文で入力する必要があることに注意してください。完全なコマンドは次のように入力します。
$ ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: { x: 0.0, y:0.0, z: 1.8}}"
「–once」 は、「メッセージを1つ公開して終了する」ことを意味するオプションです。
publisher: beginning loop
publishing #1: geometry_msgs.msg.Twist(linear=geometry_msgs.msg.Vector3(x=2.0, y=0.0, z=0.0), angular=geometry_msgs.msg.Vector3(x=0.0, y=0.0, z=1.8))
ターミナルに上記のように表示され、カメが少しだけ動きます。
カメを継続的に動作させるには、一定のコマンドストリームが必要です。
例えば、カメを動かし続けるにrは、次のコマンドを実行します。
$ ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: { x: 0.0, y:0.0, z: 1.8}}"
先程とのコマンドの違いは、「–once」を「–rate 1」に置き換えています。これは、「メッセージを1Hzの周期で公開する」ことを意味するオプションです。
rqt_graph を更新すると、何が起こっているかをグラフィカルに確認できます。
ノード(/_ros2cli_4394)が /turtle1/cmd_vel トピックを介してメッセージを公開しており、それがノード(/turtlesim)とノード(/_ros2cli_4709)の両方で受信されていることが分かります。
なお、ノード(/_ros2cli_4709)は、「ros2 topic echo」コマンドを実行中のターミナルです。
さらに、/turtle1/pose トピックをエコーしてみます。
$ ros2 topic echo /turtle1/pose
「/turtlesim」ノードが公開したメッセージを「/turtle1/pose」トピックを介して新しいノード「/_ros2cli_5055」がサブスクライブしていることが分かります。
トピックのデータ公開速度
次のコマンドを実行して、データが公開される速度を確認できます。
$ ros2 topic hz /turtle1/pose
「/turtlesim」ノードが「/turtle1/pose」トピックにデータを公開している速度に関するデータを返します。
average rate: 62.545
min: 0.015s max: 0.017s std dev: 0.00064s window: 64
「/turtlesim」ノードの「/turtle1/pose」トピック公開速度は、「ros2 topic pub –rate 1 …」を実行して 1Hz(1秒間に1回)の間隔でメッセージを公開しているので、そのレートを反映した平均値が表示されます。
サービスを学ぶ
いつものように2つのターミナルで「ros2 run turtlesim turtlesim_node」と「ros2 run turtlesim turtle_teleop_key」を起動しておきます。
サービスのリスト
新しいターミナルで次のコマンドを実行すると、システムで現在アクティブな全てのサービスのリストが表示されます。
$ ros2 service list
/clear
/kill
/reset
/spawn
/teleop_turtle/describe_parameters
/teleop_turtle/get_parameter_types
/teleop_turtle/get_parameters
/teleop_turtle/get_type_description
/teleop_turtle/list_parameters
/teleop_turtle/set_parameters
/teleop_turtle/set_parameters_atomically
/turtle1/set_pen
/turtle1/teleport_absolute
/turtle1/teleport_relative
/turtlesim/describe_parameters
/turtlesim/get_parameter_types
/turtlesim/get_parameters
/turtlesim/get_type_description
/turtlesim/list_parameters
/turtlesim/set_parameters
/turtlesim/set_parameters_atomically
「teleop_turtle」と「turtlesim」の両方のノードに共通した7つのサービスが含まれていることが分かります。ROS2のほぼ全てのノードには、パラメータのベースとなるこれらのサービスがあります。
「/clear」についてはturtlesim固有のサービスなので、「/kill」に焦点を当てます。
サービスの型
サービスには、サービスの要求データと応答データがどのように構造化されるかを説明する型があります。サービス型はトピック型と同様に定義されますが、サービス型には要求用のメッセージと応答用のメッセージの 2 つの部分があります。
サービスの種類を確認するには、次のコマンドを使用します。
$ ros2 service type <service_name>
turtlesimの「/clear」サービスを見てみます。新しいターミナルで次のコマンドを入力します。
$ ros2 service type /clear
返される結果は次のとおりです。
std_srvs/srv/Empty
この「Empty」タイプは、サービス呼び出しが要求を行うときにデータを送信せず、応答を受信するときにデータを受信しないことを意味します。
サービスのリスト(型付き)
すべてのアクティブなサービスのタイプを同時に表示するには、-t(--show-typesの省略)
オプションをコマンドに追加します。
$ ros2 service list -t
ターミナルに表示される結果:
/clear [std_srvs/srv/Empty]
/kill [turtlesim/srv/Kill]
/reset [std_srvs/srv/Empty]
/spawn [turtlesim/srv/Spawn]
/teleop_turtle/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/teleop_turtle/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/teleop_turtle/get_parameters [rcl_interfaces/srv/GetParameters]
/teleop_turtle/get_type_description [type_description_interfaces/srv/GetTypeDescription]
/teleop_turtle/list_parameters [rcl_interfaces/srv/ListParameters]
/teleop_turtle/set_parameters [rcl_interfaces/srv/SetParameters]
/teleop_turtle/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
/turtle1/set_pen [turtlesim/srv/SetPen]
/turtle1/teleport_absolute [turtlesim/srv/TeleportAbsolute]
/turtle1/teleport_relative [turtlesim/srv/TeleportRelative]
/turtlesim/describe_parameters [rcl_interfaces/srv/DescribeParameters]
/turtlesim/get_parameter_types [rcl_interfaces/srv/GetParameterTypes]
/turtlesim/get_parameters [rcl_interfaces/srv/GetParameters]
/turtlesim/get_type_description [type_description_interfaces/srv/GetTypeDescription]
/turtlesim/list_parameters [rcl_interfaces/srv/ListParameters]
/turtlesim/set_parameters [rcl_interfaces/srv/SetParameters]
/turtlesim/set_parameters_atomically [rcl_interfaces/srv/SetParametersAtomically]
サービスの情報
特定のサービスの情報を表示するには、次のコマンドを使用します。
$ ros2 service info <service_name>
このコマンドでは、サービスタイプとサービスクライアントおよびサーバーの数を返します。
例えば、「/cliear」サービスのクライアントとサーバーの数を調べることが出来ます。
$ ros2 service info /clear
ターミナルに表示される結果:
Type: std_srvs/srv/Empty
Clients count: 0
Service count: 1
サービスの検索
特定のタイプのすべてのサービスを検索する場合は、次のコマンドを使用できます。
$ ros2 service find <type_name>
例えば、Empty 型の全てのサービスは、次のコマンドで見つけることが出来ます。
$ ros2 service find std_srvs/srv/Empty
返される結果:
/clear
/reset
インターフェースの表示
コマンドラインからサービスを呼び出すことができますが、まず入力引数の構造を知っておく必要があります。
$ ros2 interface show <type_name>
「/clear」サービスの型「Empty」でこれを試してください:
$ ros2 interface show std_srvs/srv/Empty
返される結果:
---
---は
、リクエスト構造 (上) とレスポンス構造 (下) を分離します。ただし、前に説明したように、このEmpty
型はデータを送受信しません。したがって、当然、その構造は空です。
「/spawn
」のように、データを送受信する 型のサービスを調査してみます。
「ros2 service list -t
」の結果から、「/spawn」の型が であることが分かります。
「/spawn」サービスのリクエスト引数とレスポンス引数を確認するには、次のコマンドを実行します。
$ ros2 interface show turtlesim/srv/Spawn
返される結果:
float32 x
float32 y
float32 theta
string name # Optional, A unique name will be created and returned if this is empty
---
string name
---
行の上の情報は、「/spawn
」を呼び出すために必要な引数を示し、x、y、thetaは、生成されたカメの 2D ポーズを決定しますが、nameは、明らかにオプションです。
この場合、—行の下の情報は知っておく必要はありませんが、呼び出しから取得する応答のデータ型を理解するのに役立ちます。
サービスをコールしてみる
サービス タイプとは何か、サービスのタイプの見つけ方、そのタイプの引数の構造を見つける方法がわかったので、次を使用してサービスを呼び出すことができます。
$ ros2 service call <service_name> <service_type> <arguments>
この<arguments>
部分はオプションです。たとえば、Empty
型指定されたサービスには引数がないことがわかります。
$ ros2 service call /clear std_srvs/srv/Empty
このコマンドは、タートルが描いた線を turtlesim ウィンドウから消去します。
次に、/spawn呼び出しと引数の設定によって新しいタートルを生成してみます。
<arguments>コマンドラインからのサービス呼び出しの入力は、YAML 構文である必要があります。
$ ros2 service call /spawn turtlesim/srv/Spawn "{x: 2, y: 2, theta: 0.2, name: ''}"
何が起こっているかについてのメソッド スタイルのビューと、サービスの応答が表示されます。
requester: making request: turtlesim.srv.Spawn_Request(x=2.0, y=2.0, theta=0.2, name='')
response:
turtlesim.srv.Spawn_Response(name='turtle2')
新しく生成されたカメがすぐに turtlesim ウィンドウに更新されます。
サービスのエコー
サービス クライアントとサービス サーバー間のデータ通信を確認するには、次のサービスを使用します。
$ ros2 service echo <service_name | service_type> <arguments>
「ros2 service echo」
は、サービス クライアントとサーバーのサービス の内容に依存しますが、これはデフォルトでは無効になっています。これを有効にするには、ユーザーは、サーバー クライアントまたはサーバーを作成した後に「configure_introspection
」を呼び出す必要があります。
$ ros2 launch demo_nodes_cpp introspect_services_launch.py
別のターミナルを開き、以下を実行して、introspection_client
および introspection_service
のサービス を有効にします。
$ ros2 param set /introspection_service service_configure_introspection contents
$ ros2 param set /introspection_client client_configure_introspection contents
これで、introspection_client
と introspection_service
の間のサービス通信を ros2 service echo
経由で確認できるようになりました。
$ ros2 service echo --flow-style /add_two_ints
info:
event_type: REQUEST_SENT
stamp:
sec: 1726068242
nanosec: 378442337
client_gid: [1, 15, 235, 125, 189, 0, 8, 147, 0, 0, 0, 0, 0, 0, 21, 3]
sequence_number: 734
request: [{a: 2, b: 3}]
response: []
---
info:
event_type: REQUEST_RECEIVED
stamp:
sec: 1709408301
nanosec: 423601471
client_gid: [1, 15, 0, 18, 250, 205, 12, 100, 0, 0, 0, 0, 0, 0, 20, 4]
sequence_number: 618
request: [{a: 2, b: 3}]
response: []
…
これにより送信側、受信側のサービスの状態が確認できました。
パラメータを学ぶ
パラメータはノードの設定値です。パラメータはノード設定と考えることができます。ノードはパラメータを整数、浮動小数点数、ブール値、文字列、リストとして保存できます。ROS 2 では、各ノードが独自のパラメータを維持します。
準備
ここでもturtlesimパッケージを使用します。
いつものように2つのターミナルで/turtlesimと/teleop_turtleノードを起動します。
$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key
パラメータのリスト
ノードに属するパラメータを表示するには、新しいターミナルを開いて次のコマンドを入力します。
$ ros2 param list
ノードの名前空間 /teleop_turtle と /turtlesim が表示され、その後、各ノードのパラメータが表示されます。
/teleop_turtle:
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
scale_angular
scale_linear
start_type_description_service
use_sim_time
/turtlesim:
background_b
background_g
background_r
holonomic
qos_overrides./parameter_events.publisher.depth
qos_overrides./parameter_events.publisher.durability
qos_overrides./parameter_events.publisher.history
qos_overrides./parameter_events.publisher.reliability
start_type_description_service
use_sim_time
全てのノードには use_sim_time パラメータがありますが、これは turtlesim に固有のものではありません。
名前から判断すると、/turtlesim のパラメータには、RGBカラー値を使用して turtlesimウィンドウの背景色を決定するようです。
パラメータの型を決定するには、「ros2 param get」を使用します。
パラメータの取得
パラメータのタイプと現在の値を表示するには、次のコマンドを使用します。
ros2 param get <node_name> <parameter_name>
「/turtlesim: background_g」パラメータの現在の値を確認してみます。
$ ros2 param get /turtlesim background_g
次の値が返されます。
Integer value is: 86
これでパラメータ「background_g」の型は、整数で値は、「86」が設定されていることが分かります。
「background_r」「background_b」も確認してみると、「69」「255」が設定されていることが分かります。
パラメータのセット
実行時にパラメータの値を変更するには、次のコマンドを使用します。
$ ros2 param set <node_name> <parame_name> <value>
端末から/turtlesimの背景色を変更してみます。
$ ros2 param set /turtlesim background_r 150
端末から次のメッセージが返されて、TurtleSimウィンドウの背景色が変わります。
Set parameter successful
「ros2 param set」コマンドでパラメータを設定すると、現在のセッションでのみ変更され、永続的に変更されるわけではありません。ただし、設定を保存して、次回ノードを起動するときに再読み込みすることができます。
パラメータのダンプ
次のコマンドを使用して、ノードの現在のパラメータ値をすべて表示できます。
$ ros2 param dump <node_name>
このコマンドは、デフォルトでは標準出力(stdou)に出力しますが、パラメータ値をファイルにリダイレクトして後で使用できるように保存することも出来ます。「/turtlesim」のパラメータの現在の構成を「turtlesim.yaml」ファイルに保存するには、次のコマンドを入力します。
$ ros2 param dump /turtlesim > turtlesim.yaml
現在の作業ディレクトリに新しいファイルが出来ています。このファイルを開くと、次の内容が表示されます。
/turtlesim:
ros__parameters:
background_b: 255
background_g: 86
background_r: 150
holonomic: false
qos_overrides:
/parameter_events:
publisher:
depth: 1000
durability: volatile
history: keep_last
reliability: reliable
start_type_description_service: true
use_sim_time: false
将来、同じパラメータでノードを再ロードする場合、パラメータをダンプしておくと便利です。
パラメータのロード
次のコマンドを使用して、ファイルから現在実行中のノードにパラメータをロードできます。
$ ros2 param load <node_name> <parameter_file>
生成された「turtlesim.yaml」ファイルをノードのパラメータにロードするには、次のコマンドを入力します。
$ ros2 param load /turtlesim turtlesim.yaml
端末から次のメッセージが返されます。
Set parameter background_b successful
Set parameter background_g successful
Set parameter background_r successful
Set parameter holonomic successful
Set parameter qos_overrides./parameter_events.publisher.depth failed: parameter 'qos_overrides./parameter_events.publisher.depth' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.durability failed: parameter 'qos_overrides./parameter_events.publisher.durability' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.history failed: parameter 'qos_overrides./parameter_events.publisher.history' cannot be set because it is read-only
Set parameter qos_overrides./parameter_events.publisher.reliability failed: parameter 'qos_overrides./parameter_events.publisher.reliability' cannot be set because it is read-only
Set parameter start_type_description_service failed: parameter 'start_type_description_service' cannot be set because it is read-only
Set parameter use_sim_time successful
ノード起動時にパラメータファイルをロードする
保存したパラメータ値を使用して同じノードを起動するには、次を使用します。
$ ros2 run <package_name> <executable_name> --ros-args --param-file <file_name>
これは、turtlesim を起動するために常に使用するコマンドと同じですが、--ros-args
と--params-file
が追加され、その後にロードするファイルが続きます。
実行中のturtlesim ノードを停止し、次のコマンドを使用して保存したパラメータで再ロードしてみます。
$ ros2 run turtlesim turtlesim_node --ros-args --params-file turtlesim.yaml
turtlesim ウィンドウは通常通り表示されますが、背景色は先ほど設定した紫色になります。
アクションを学ぶ
アクションは ROS 2 の通信タイプの 1 つであり、長時間実行されるタスクを対象としています。アクションは、目標、フィードバック、結果の 3 つの部分で構成されます。
アクションはトピックとサービスに基づいて構築されます。アクションの機能はサービスと似ていますが、アクションはキャンセルできます。また、単一の応答を返すサービスとは異なり、アクションは安定したフィードバックを提供します。
アクションは、パブリッシャー/サブスクライバーモデルに似たクライアント/サーバーモデルを使用します。「アクションクライアント」ノードは、ゴールを「サクションサーバー」ノードに送信し、アクションサーバーはゴールを確認し、フィードバックのストリームと結果を返します。
準備
ここでもturtlesimパッケージを使用します。
いつものように2つのターミナルで「/turtlesim」と「/teleop_turtle」ノードを起動します。
$ ros2 run turtlesim turtlesim_node
$ ros2 run turtlesim turtle_teleop_key
アクションを使ってみる
/teleop_turtle ノードを起動すると、ターミナルに次のメッセージが表示されます。
Use arrow keys to move the turtle.
Use g|b|v|c|d|e|r|t keys to rotate to absolute orientations. 'f' to cancel a rotation.
'q' to quit.
アクションに対応する 2行目に注目します。(最初の命令は、トピックのチュートリアルで以前に説明した「cmd_vel」トピックに対応しています。)
G|B|V|C|D|E|R|T キーは、Fキーの周囲に「ボックス」を形成しています。(下写真参照)
各キーの位置は、turtlesimの方向に対応しています。例えば、「E」キーはタートルの方向を左上隅に回転させます。
「/turtlesim」ノードが動作しているターミナルを確認します。これらのキーのいずれかをおすたびに、「/turtlesim」ノードの一部であるアクションサーバーに目標が送信されます。目標は、タートルを特定の方向に回転させることです。タートルの回転が完了すると、目標の結果を中継するメッセージが表示されます。
[INFO] [turtlesim]: Rotation goal completed successfully
「F」キーは、アクション実行中に目標をキャンセルします。
「C」キーを押してから、カメが回転を完了する前に「F」キーを押してみます。「/turtlesim」ノードが実行されているターミナルに、次のメッセージが表示されます。
[INFO] [turtlesim]: Rotation goal canceld
クライアント側(/teleop_turtle)だけでなく、サーバー側(/turtlesim)でも目標を停止できます。サーバ側が目標の処理を停止することを選択した場合、目標を「中止」すると言われます。
「D」キーを押してから、目標までの回転が完了する前に「G」キーを押してみます。「/tertlesim」ノードが実行されているターミナルに、次のメッセージが表示されます。
[WARN] [turtlesim]: Rotation goal received before a previous goal finished. Aborting previous goal
このアクション サーバーは、新しい目標を取得したため、最初の目標を中止することを選択しました。新しい目標を拒否したり、最初の目標が完了した後に 2 番目の目標を実行したりするなど、他の選択も可能でした。すべてのアクション サーバーが、新しい目標を取得した際に現在の目標を中止することを選択するとは想定しないでください。
ノードの情報
この場合、「/turtlesim」ノードが提供するアクションのリストを表示するには新しいターミナルを開いて次のコマンドを実行します。
$ ros2 node info /turtlesim
これにより、「/turtlesim」のサブスクライバー、パブリッシャー、サービス、アクションサーバー、およびアクションクライアントのリストが返されます。
/turtlesim
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/color_sensor: turtlesim/msg/Color
/turtle1/pose: turtlesim/msg/Pose
Service Servers:
/clear: std_srvs/srv/Empty
/kill: turtlesim/srv/Kill
/reset: std_srvs/srv/Empty
/spawn: turtlesim/srv/Spawn
/turtle1/set_pen: turtlesim/srv/SetPen
/turtle1/teleport_absolute: turtlesim/srv/TeleportAbsolute
/turtle1/teleport_relative: turtlesim/srv/TeleportRelative
/turtlesim/describe_parameters: rcl_interfaces/srv/DescribeParameters
/turtlesim/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/turtlesim/get_parameters: rcl_interfaces/srv/GetParameters
/turtlesim/get_type_description: type_description_interfaces/srv/GetTypeDescription
/turtlesim/list_parameters: rcl_interfaces/srv/ListParameters
/turtlesim/set_parameters: rcl_interfaces/srv/SetParameters
/turtlesim/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
Action Clients:
ノード「/turtlesim」のアクション「/turtle1/rotate_absolute」が「Action Servers:」の下に表示されています。これは、「/turtlesim」が「/turtle1/rotate_absolute」に応答し、アクションに対するフィードバックを提供することを意味します。
ノード「/teleop_turtle」には、アクションが「Action Clients:」の下に表示されるはずです。
それを確認するには、次のコマンドを実行します。
$ ros2 node info /teleop_turtle
以下の結果が返ってきます。
/teleop_turtle
Subscribers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
Publishers:
/parameter_events: rcl_interfaces/msg/ParameterEvent
/rosout: rcl_interfaces/msg/Log
/turtle1/cmd_vel: geometry_msgs/msg/Twist
Service Servers:
/teleop_turtle/describe_parameters: rcl_interfaces/srv/DescribeParameters
/teleop_turtle/get_parameter_types: rcl_interfaces/srv/GetParameterTypes
/teleop_turtle/get_parameters: rcl_interfaces/srv/GetParameters
/teleop_turtle/get_type_description: type_description_interfaces/srv/GetTypeDescription
/teleop_turtle/list_parameters: rcl_interfaces/srv/ListParameters
/teleop_turtle/set_parameters: rcl_interfaces/srv/SetParameters
/teleop_turtle/set_parameters_atomically: rcl_interfaces/srv/SetParametersAtomically
Service Clients:
Action Servers:
Action Clients:
/turtle1/rotate_absolute: turtlesim/action/RotateAbsolute
アクションのリスト
ROS グラフ内の全てのアクションを表示するには、次のコマンドを実行します。
$ ros2 action list
返される結果:
/turtle1/rotate_absolute
これは現在 ROS グラフ内の唯一のアクションです。前に見たように、これはカメの回転を制御します。また、コマンドを使用することで、このアクションには、1つのアクションクライアント(/teleop_turtle の一部)と1つのアクションサーバー(/turtlesim の一部)があることも既に分かっています。
アクションのリスト(型付き)
アクションには、トピックやサービスと同様にタイプがあります。「/turtle1/rotate_absolute」の対イプを確認するには、次のコマンドを実行します。
$ ros2 action list -t
返される結果:
/turtle1/rotate_absolute [turtlesim/action/RotateAbsolute]
各アクション名の右側に括弧内(この場合は /turtle1/rotate_absoluteのみ)には、アクションの型(/turtlesim/action/RotateAbsolute)が表示されます。これは、コマンドラインまたはコードからアクションを実行するときに必要になります。
アクションの型
アクション型を確認する場合は、次のコマンドを実行します。
$ ros2 action type /turtle1/rotate_absolute
返される結果:
turtlesim/action/RotateAbsolute
アクションの情報
次のコマンドを使用して、「/turtle1/rotate_absolute」アクションをさらに詳しく調べることができます。
$ ros2 action info /turtle1/rotate_absolute
返される結果:
Action: /turtle1/rotate_absolute
Action Clients: 1
/teleop_turtle
Action Servers: 1
/turtlesim
これは、各ノードで「ros2 node info」の実行から以前に学んだことを示しています。「/teleop_turtle」ノードには、アクションクライアントがあり、「/turtlesim」ノードには、「/turtle1/rotate_absolute」アクション用のアクションサーバーがあります。
インターフェースの表示
アクション目標を自分で送信または実行する前に必要なもう1つの情報は、アクション型の構造でしす。
「ros2 action list -t」コマンドを実行したときに「/turtle1/rotate_absolute」の型を識別しました。ターミナルでアクションの型を指定して次のコマンドを入力します。
$ ros2 interface show turtlesim/action/RotateAbsolute
返される結果:
# The desired heading in radians
float32 theta
---
# The angular displacement in radians to the starting position
float32 delta
---
# The remaining rotation in radians
float32 remaining
最初のセクションは目標リクエストの構造(データ型と名前)です。次のセクションは結果の構造です。最後のセクションはフィードバックの構造です。
アクション目標の送信
次のコマンドを使用して、コマンドラインからアクション目標を送信します。
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: 1.57}"
カメが回転し、ターミナルに次のメッセージが表示されます。
Waiting for an action server to become available...
Sending goal:
theta: 1.57
Goal accepted with ID: fc1f6a195122434a96f14f3adf5072f4
Result:
delta: -1.5679999589920044
Goal finished with status: SUCCEEDED
全ての目標には、一意のIDがあり、返されるメッセージに表示されます。また、開始位置への変異を示す。「delta」という名前のフィールドの結果も確認できます。
この目標のフィードバックを表示するには、「ros2 action send_goal」コマンドに「–feedback」オプションを追加します。
$ ros2 action send_goal /turtle1/rotate_absolute turtlesim/action/RotateAbsolute "{theta: -1.57}" --feedback
端末から次のメッセージが返されます:
Waiting for an action server to become available...
Sending goal:
theta: -1.57
Goal accepted with ID: 668df532756d488db44ae211767c8883
Feedback:
remaining: -3.126814842224121
Feedback:
remaining: -3.1108148097991943
...
Result:
delta: 3.119999885559082
Goal finished with status: SUCCEEDED
目標が達成されるまで、残りのラジアンのフィードバックを受け取り続けます。
rqt_console をログの表示に使ってみる
「rqt_console」
は、ROS 2 のログ メッセージを調査するために使用される GUI ツールです。通常、ログ メッセージはターミナルに表示されます。「rqt_console
」を使用すると、時間の経過とともにそれらのメッセージを収集し、詳細かつ整理された方法で表示し、フィルター処理して保存し、保存したファイルを再ロードして別の時間に調査することもできます。
ノードは、ログを使用して、さまざまな方法でイベントやステータスに関するメッセージを出力します。その内容は通常、ユーザー向けの情報です。
セットアップ
今回は、「rqt_console
」パッケージを使用します。
新しいターミナルを開いて「rqt_console
」を起動します。
$ ros2 run rqt_console rqt_console
「rqt_console
」画面が開きます。
コンソールの最初のセクションには、システムからのログ メッセージが表示されます。
中央には、重大度レベルを除外してメッセージをフィルタリングするオプションがあります。右側のプラス記号ボタンを使用して、除外フィルターをさらに追加することもできます。
下のセクションは、入力した文字列を含むメッセージを強調表示するためのものです。このセクションにさらにフィルターを追加することもできます。
新しいターミナルを開いて「/turtlesim
」ノードを起動します。
$ ros2 run turtlesim turtlesim_node
rqt_console のメッセージ
「/turtlesim
」ノードを起動すると、以下のように「Info
」メッセージが2件表示されます。
「rqt_console」
に表示するログメッセージを生成するには、カメを壁にぶつけてみましょう。新しいターミナルで、以下のコマンドを入力します(トピックのチュートリアルで詳しく説明します)。
$ ros2 topic pub -r 1 /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: { x: 0.0, y: 0.0, z: 0.0}}"
上記のコマンドはトピックを一定の速度で公開しているため、カメは継続的に壁にぶつかっています。
次のように、重大度レベルが「Warn」
で表示された同じメッセージが何度も「rqt_console」
に表示されます。
カメが壁にぶつかるのを止めるには、「ros2 topic pub」
コマンドを実行したターミナルで「Ctrl+C」
を押します。
ログレベルについて
ROS2 のログレベルは、重大度順に並べられています。
Fatal
Error
Warn
Info
Debug
各レベルが何を示すかについての正確な基準はありませんが、次のように想定しても問題ありません。
「Fatal」
メッセージは、システムが損害から身を守るために終了しようとしていることを示します。「Error」
メッセージは、必ずしもシステムに損害を与えるわけではないが、システムが正常に機能するのを妨げている重大な問題を示しています。「Warn」
メッセージは、予期しない動き、または理想的でない結果を示します。これらは深刻な問題を示している可能性がありますが、機能に直接悪影響を与えるものではありません。「Info」
メッセージは、システムが期待どおりに実行されていることを視覚的に確認するイベントとステータスの更新を示します。「Debug」
メッセージは、システム実行のプロセス全体が段階的に詳細に示されます。
デフォルトのレベルは、「Info」
です。デフォルトのレベルとそれよりも重大度の大きなレベルのメッセージのみが表示されます。
通常、「Info」
より重大度が低いレベルは 「Debug」
のメッセージのみであるため、「Debug」
のみが非表示になります。たとえば、デフォルト レベルを「Warn」
に設定すると、重大度が「Warn」
、「Error」
、「Fatal」
のメッセージのみが表示されます。
デフォルトのログレベルを設定する
「/turtlesim
」ノードを起動するときに、デフォルトのロガー レベルを設定できます。
ターミナルで次のコマンドを入力します。
$ ros2 run turtlesim_node --ros-args --log-level WARN
これで、前回「turtlesim
」を起動したときにコンソールに表示された「Info
」レベルのメッセージは表示されなくなります。これは、「Info
」メッセージの優先度が新しいデフォルトの重大度「Warn
」よりも低いためです。
ノードの起動方法
ほとんどの入門チュートリアルでは、実行する新しいノードごとに新しいターミナルを開いていました。同時に実行されるノードの数が増える複雑なシステムを作成すると、ターミナルを開いて構成の詳細を再入力するのは面倒になります。
起動ファイルを使用すると、ROS 2 ノードを含む複数の実行可能ファイルを同時に起動して構成できます。
「ros2 launch
」コマンドを使用して単一の起動ファイルを実行すると、システム全体 (すべてのノードとその構成) が一度に起動します。
起動ファイルの実行
新しいターミナルを開いて、以下を実行します。
$ ros2 launch turtlesim multisim.launch.py
このコマンドは、次の起動ファイル(コメントを削除)を実行します。
#!/usr/bin/env python3
from launch import LaunchDescription
import launch_ros.actions
def generate_launch_description():
return LaunchDescription([
launch_ros.actions.Node(
namespace='turtlesim1', package='turtlesim',
executable='turtlesim_node', output='screen'),
launch_ros.actions.Node(
namespace='turtlesim2', package='turtlesim',
executable='turtlesim_node', output='screen'),
])
Pythonこの起動ファイルは、次の場所に保存されていました。~/ros2_jazzy/install/turtlesim/share/turtlesim/launch/
これにより、2つの「/turtlesim
」ノードが実行されます。
Turtlesim ノードを制御する
これらのノードが実行されているので、他の ROS 2 ノードと同じように制御できます。たとえば、2 つの追加のターミナルを開いて次のコマンドを実行すると、カメを反対方向に移動させることができます。
2番目のターミナル:
$ ros2 topic pub -r 1 /turtlesim1/turtle1/cmd_vel geometry_msgs/msg/Twist "{ linear: { x: 2.0, y : 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: 1.8 }}"
3番目のターミナル:
$ ros2 topic pub -r 1 /turtlesim2/turtle1/cmd_vel geometry_msgs/msg/Twist "{ linear: { x: 2.0, y : 0.0, z: 0.0 }, angular: { x: 0.0, y: 0.0, z: -1.8 }}"
これらのコマンドを実行すると、次のような表示になります。
以上です。
コメント