ROS2 Jazzy 入門 (4) - TF
「SDF」で作ったシンプルな差動二輪ロボットに「TF」を追加して「rviz2」で視覚化します。
前回
1. TF
「/tf トピック」は、ROSで座標系 (フレーム) 間の関係 (位置や回転など) を管理・共有するための標準的な仕組みです。各関節・センサー・エンドエフェクターなどの相対座標が含まれています。
「tf ライブラリ」を使うことで、異なるロボットやセンサーの座標を統合的に管理し、簡単にトランスフォーメーションを計算できます。
主なフレームは次のとおりです。
2. Gazebo の起動
(1) ターミナルを開いて「Gazebo」を起動。
「ROS2 Jazzy 入門 (2) - ロボット操作」の「SDF」を使います。
$ gz sim simple_robot.sdf
(2) 別のターミナルを開いて「/cmd_vel」と「/tf」をROS2にブリッジ。
$ ros2 run ros_gz_bridge parameter_bridge /cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist
$ ros2 run ros_gz_bridge parameter_bridge /model/simple_robot/tf@tf2_msgs/msg/TFMessage[gz.msgs.Pose_V --ros-args -r /model/simple_robot/tf:=/tf
(3) 別のターミナルを開いて「teleop_twist_keyboard」を起動。
$ ros2 run teleop_twist_keyboard teleop_twist_keyboard
(4) 「Gazebo」左下の▶をクリック。
物理シミュレーションが開始します。
3. TF の動作確認
(1) 「/cmd_vel」と「/lidar」がトピックに追加されていることを確認。
ros2 topic list
/cmd_vel
/parameter_events
/rosout
/tf
(2) 「/tf」のデータ型を確認。
$ ros2 topic info /tf
Type: tf2_msgs/msg/TFMessage
Publisher count: 1
Subscription count: 0
(3)「/tf」のリアルタイムデータを確認。
simple_robot/odom → child_frame_id: simple_robot/base_link のtransformが公開されています。
$ ros2 topic echo /tf
transforms:
- header:
stamp:
sec: 150
nanosec: 0
frame_id: simple_robot/odom
child_frame_id: simple_robot/base_link
transform:
translation:
x: -5.804886482444662e-18
y: 6.513625605640465e-36
z: 0.0
rotation:
x: 0.0
y: 0.0
z: -1.0854177929225097e-18
w: 1.0
tf2_msgs/TFMessage のデータ型は次のとおりです。
4. rviz2 での視覚化
(1) rviz2 の起動。
$ rviz2
(2) 左側の設定項目を以下のように設定。
(2) 左下の「Add」をクリックし、「By display type → rviz_default_plugins → TF」を選択し、「OK」をクリック。
(3) 「Show Names」をクリック。
「simple_robot/odom → simple_robot/base_link」のTransformが表示されます。
(4) 「teleop_twist_keyboard」でロボットを移動。
「simple_robot/odom」と「simple_robot/base_link」の相対関係が変わることを確認します。
5. launchファイル
(1) launchファイルの作成。
・run_simple_robot_tf.py
from launch import LaunchDescription
from launch.actions import ExecuteProcess
def generate_launch_description():
return LaunchDescription([
# Gazeboの起動
ExecuteProcess(
cmd=['gz', 'sim', 'simple_robot.sdf'],
output='log',
log_cmd=True
),
# rviz2の起動
ExecuteProcess(
cmd=['rviz2'],
output='log',
log_cmd=True
),
# ブリッジの起動
ExecuteProcess(
cmd=[
'ros2', 'run', 'ros_gz_bridge', 'parameter_bridge',
'/cmd_vel@geometry_msgs/msg/Twist@gz.msgs.Twist'
],
output='log',
log_cmd=True
),
ExecuteProcess(
cmd=[
'ros2', 'run', 'ros_gz_bridge', 'parameter_bridge',
'/model/simple_robot/tf@tf2_msgs/msg/TFMessage[gz.msgs.Pose_V',
'--ros-args', '-r', '/model/simple_robot/tf:=/tf'
],
output='log',
log_cmd=True
),
# teleop_twist_keyboardの起動
ExecuteProcess(
cmd=['ros2', 'run', 'teleop_twist_keyboard', 'teleop_twist_keyboard'],
output='screen',
prefix='xterm -e'
),
])
(2) launchファイルの実行。
ros2 launch ~/run_simple_robot_tf.py