見出し画像

ROS2 Jazzy 入門 (5) - Odometry

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

・Ubuntu 24.04
・ROS2 Jazzy
・Gazebo Harmonic


前回

1. Odometry

/odom トピック」は、ロボットの自己位置推定に関する位置・姿勢・速度に関する情報を提供します。これは、ロボットがどこにいるのか、どのように動いているのかを推定するために使用します。

【メモ】「/odom トピック」は、「/tfトピック」の「/odom フレーム」は関連はありますが別のデータになります。

2. Gazebo の起動

(1) ターミナルを開いて「Gazebo」を起動。
ROS2 Jazzy 入門 (2) - ロボット操作」の「SDF」を使います。

$ gz sim simple_robot.sdf

(2) 別のターミナルを開いて「/cmd_vel」と「/odom」を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/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry --ros-args -r /model/simple_robot/odometry:=/odom

(3) 別のターミナルを開いて「teleop_twist_keyboard」を起動。

$ ros2 run teleop_twist_keyboard teleop_twist_keyboard

(4) 「Gazebo」左下の▶をクリック。
物理シミュレーションが開始します。

3. Odometry の動作確認

(1) 「/cmd_vel」と「/odom」がトピックに追加されていることを確認。

ros2 topic list
/cmd_vel
/odom
/parameter_events
/rosout

(2) 「/odom」のデータ型を確認。

$ ros2 topic info /odom
Type: nav_msgs/msg/Odometry
Publisher count: 1
Subscription count: 1

(3)「/odom」のリアルタイムデータを確認。

$ ros2 topic echo /odom
header:
  stamp:
    sec: 4
    nanosec: 580000000
  frame_id: simple_robot/odom
child_frame_id: base_link
pose:
  pose:
    position:
      x: -1.0267009973536991e-19
      y: 2.0570663312770103e-38
      z: 0.0
    orientation:
      x: 0.0
      y: 0.0
      z: -5.432027051799655e-20
      w: 1.0
  covariance:
  - 0.0
    :
  - 0.0
twist:
  twist:
    linear:
      x: -6.423618365069177e-20
      y: 0.0
      z: 0.0
    angular:
      x: 0.0
      y: 0.0
      z: -1.5164891305854554e-20
  covariance:
  - 0.0
    :
  - 0.0

4. rviz2 での視覚化

(1) rviz2 の起動。

$ rviz2

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

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

(2) 左下の「Add」をクリックし、「By topic → /odom → Odometry」を選択し、「OK」をクリック。

(3) 矢印が表示されるのを確認。

(4) 「teleop_twist_keyboard」でロボットを移動。
矢印の位置が変わることを確認します。
「Keep」(デフォルト100)の数だけ矢印履歴が表示されます。

5. launchファイル

(1) launchファイルの作成。

・run_simple_robot_odom.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/odometry@nav_msgs/msg/Odometry@gz.msgs.Odometry',
                '--ros-args', '-r', '/model/simple_robot/odometry:=/odom'
            ],
            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_odom.py

【おまけ】 /tf と /odom の比較

・/tf
 ・データ型 : tf2_msgs/TFMessage
 ・目的 : フレーム間の位置・姿勢 (Transform) の配列を提供
 ・主な用途 : 座標変換、ロボットのフレームツリーの構築

・/odom
 ・データ型 : nav_msgs/Odometry
 ・目的 : ロボットの位置 (Pose) と速度 (Twist) を提供
 ・主な用途 : ロボットの移動の追跡、SLAMやナビゲーションでの利用

次回



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