見出し画像

ROS2 Jazzy 入門 (4) - TF

「SDF」で作ったシンプルな差動二輪ロボットに「TF」を追加して「rviz2」で視覚化します。

・Ubuntu 24.04
・ROS2 Jazzy
・Gazebo Harmonic


前回

1. TF

/tf トピック」は、ROSで座標系 (フレーム) 間の関係 (位置や回転など) を管理・共有するための標準的な仕組みです。各関節・センサー・エンドエフェクターなどの相対座標が含まれています。

tf ライブラリ」を使うことで、異なるロボットやセンサーの座標を統合的に管理し、簡単にトランスフォーメーションを計算できます。

主なフレームは次のとおりです。

・/map : 環境全体を基準とする固定されたグローバル座標系
・/odom : ロボットが動き始めた初期位置を基準とする座標系
・/base_link : ロボット自体の中心を基準とする座標系

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 のデータ型は次のとおりです。

・tf2_msgs/TFMessage
 ・geometry_msgs/TransformStamped[] transforms : 配列形式で複数のトランスフォームを格納

・geometry_msgs/TransformStamped
 ・std_msgs/Header header

  ・uint32 seq : シーケンス番号(ROSで生成)
  ・time stamp : メッセージのタイムスタンプ
  ・string frame_id : フレームの名前 (base_linkなど)
 ・string child_frame_id : 子フレームの名前 (camera_linkなど)
 ・geometry_msgs/Transform transform : 親フレームから子フレームへの座標変換データ

4. rviz2 での視覚化

(1) rviz2 の起動。

$ rviz2

(2) 左側の設定項目を以下のように設定。

・Fixed Frame : simple_robot/odom
「ros2 topic echo /tf」の「frame_id」を指定します。

・Background Color : 48;48;48
見やすさのため指定しました。

(2) 左下の「Add」をクリックし、「By display type → rviz_default_plugins → TF」を選択し、「OK」をクリック。

(3) 「Show Names」をクリック。
「simple_robot/odom → simple_robot/base_link」のTransformが表示されます。

・TF
 ・Show Names
: チェック

(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

次回



いいなと思ったら応援しよう!