Isaac Sim の ROS2 Transform Trees と Odometry を試す
「Isaac Sim」の「ROS2 Transform Trees」と「Odometry」を試したのでまとめました。
・Isaac Sim 5.1
前回
1. Transform Trees と Odometry
ROS 2 とロボットシミュレーションをつなぐとき、座標系の管理はとても重要です。たとえば、ロボット本体、車輪、LiDAR、IMU、カメラなどは、それぞれ異なる座標系を持っています。
Navigation や SLAM を動かすには、これらの座標系がどのような親子関係にあるのかを ROS 2 側で正しく把握できる必要があります。そのために使うのが Transform Trees (/tf) と Odometry (/odom) です。
1-1. Transform Trees(/tf)
「Transform Tree」は、ロボットやセンサーの座標系同士の関係を表す仕組みです。ROS 2 では、この座標変換情報が主に「/tf」トピックで配信されます。
たとえば TurtleBot3 の場合、次のような座標系があります。
・base_link
・base_footprint
・base_scan
・imu_link
・wheel_left_link
・wheel_right_link
これらは単独で存在しているのではなく、親子関係を持っています。
・base_footprint
・base_link
・base_scan
・imu_link
・wheel_left_link
・wheel_right_link
このように、各フレームの位置関係をツリー構造で表したものが「Transform Tree」です。
ROS 2 のノードは「/tf」を参照することで、次のようなことができます。
・LiDAR がロボット本体のどこに付いているかを知る
・カメラ座標系の点をロボット座標系に変換する
・odom から見た base_link の位置を取得する
・Navigation や SLAM で必要な座標変換を行う
1-2. Odometry(/odom)
「Odometry」は、ロボットが移動した結果として推定される、現在の位置・姿勢・速度の情報です。ROS 2 では、主に「/odom」トピックで配信されます。
Odometry を理解するときは、2つのフレーム「odom → base_link」を意識するとわかりやすいです。
・odom : Odometry の基準になる座標系
・base_link : ロボット本体の座標系
つまり Odometry は、odom フレームから見た base_link の位置・姿勢・速度 を表す情報です。ここでいう odom は、ロボットの移動開始時点や Odometry 計算開始時点を基準にした座標系です。そのため /odom は、必ずしもworld座標上の絶対位置ではありません。
たとえば、シミュレーション開始時にロボットがworld座標の x=3.0, y=2.0 に置かれていたとしても、Odometry ではその時点を基準として扱います。
そこからロボットが前に 1m 進むと、「/odom」には「基準位置から前に 1m 進んだ」という情報が出ます。
「/odom」には、主に以下の情報が含まれます。
・位置 : x, y, z
・姿勢 : quaternion
・線形速度 : vx, vy, vz
・角速度 : wx, wy, wz
Navigation では、この Odometry を使ってロボットの移動を追跡します。ただし、Odometry はあくまで移動量にもとづく推定です。実機では車輪の滑りやセンサー誤差によって、少しずつズレが蓄積します。
そのため、一般的な Navigation では「map → odom → base_link」のような「Transform Tree」を使います。
・map : 地図上の固定座標系
・odom : 短時間では滑らかにつながる、Odometry の基準座標系
・base_link : ロボット本体の座標系
2. ロボットと環境の準備
以下の記事の「2. URDF の準備」「4. URDF のインポート」と同様にロボットと環境を準備します。
3. Transform Trees のpublish
3-1. Transform Trees のpublish
(1) メニュー「Tools → Robotics → ROS 2 OmniGraphs → TF Publisher」を選択。
(2) 以下の項目を設定して、OKをクリック。
TF Publisher のAction Graphが追加されます。
・Target Prim : /World/turtlebot3_burger/base_footprint
/tfとして配信したい対象の Prim です。TurtleBot3 のような「Articulation Root」 を指定すると、その下にあるリンクの Transform Tree も配信されます。
・Parent Prim : /World
Target Prim の基準になる Prim です。未指定の場合は、「/World」を基準にした Transform として配信されます。


(3) Playボタン (▶) をクリック。
3-2. Transform Trees の確認
(1) ROS環境のセットアップ済みのターミナルを開く。
(2) /tf の確認。
ros2 topic echo /tftransforms:
- header:
stamp:
sec: 122
nanosec: 450006386
frame_id: World
child_frame_id: base_footprint
transform:
translation:
x: 8.6011212260928e-05
y: -7.156713400036097e-05
z: 0.015263657085597515
rotation:
x: -1.310438392465585e-06
y: -0.002601725049316883
z: -0.000370661960914731
w: 0.999996542930603
- header:
stamp:
sec: 122
nanosec: 450006386
frame_id: base_footprint
child_frame_id: base_link
transform:
translation:
x: -3.322554176232728e-10
y: 2.226485662504274e-11
z: 0.009999998845160007
rotation:
x: 5.159108695806935e-10
y: 2.095681628233592e-09
z: -6.3169149910891065e-09
w: 0.9999999403953552
- header:
stamp:
sec: 122
nanosec: 450006386
frame_id: base_link
child_frame_id: caster_back_link
transform:
translation:
x: -0.08099998533725739
y: 1.879237210289375e-09
z: -0.00400000112131238
rotation:
x: -0.7068250179290771
y: -4.407201270595351e-09
z: -6.05359673500061e-09
w: 0.7073882222175598
- header:
stamp:
sec: 122
nanosec: 450006386
frame_id: base_link
child_frame_id: base_scan
transform:
translation:
x: -0.031999994069337845
y: 1.2735767995764036e-10
z: 0.1719999462366104
rotation:
x: 2.3294433049159124e-10
y: -1.3968998180402536e-09
z: 9.307223880483662e-10
w: 0.9999998807907104
- header:
stamp:
sec: 122
nanosec: 450006386
frame_id: base_link
child_frame_id: wheel_left_link
transform:
translation:
x: -7.020381498357153e-10
y: 0.07999996840953827
z: 0.022999994456768036
rotation:
x: -0.7068250775337219
y: -0.00028285806183703244
z: -0.0002831231104210019
w: 0.707388162612915
- header:
stamp:
sec: 122
nanosec: 450006386
frame_id: base_link
child_frame_id: wheel_right_link
transform:
translation:
x: 1.5143212239721038e-09
y: -0.07999998331069946
z: 0.022999996319413185
rotation:
x: -0.7068250775337219
y: 0.00036742817610502243
z: 0.00036768452264368534
w: 0.7073882222175598
---(3) Transform Trees全体の確認。
ros2 run tf2_tools view_frames以下の2つのファイルを出力します。
・frames_XXXX-XX-XX_XX.XX.XX.gv
Graphviz 用の元ファイル。TF ツリー構造をテキストで表したもの
・frames_XXXX-XX-XX_XX.XX.XX.pdf
.gv を図としてレンダリングした確認用ファイル

4. Odometry のpublish
4-1. Odometry のpublish
(1) メニュー「Tools → Robotics → ROS 2 OmniGraphs → Odometry Publisher」を選択。
(2) 以下の項目を設定して、OKをクリック。
Odometry Publisher のAction Graphが追加されます。
・Articulation Root : /World/turtlebot3_burger/base_footprint
ロボット全体を表す Prim
・Chassis Prim : /World/turtlebot3_burger/base_link
ロボット本体の基準になる Prim


4-2. Odometry の確認
(1) ROS環境のセットアップ済みのターミナルを開く。
(2) /odom の確認。
/odom は、odom 座標系から見た base_link の位置・姿勢・速度を表します。
ros2 topic echo /odomheader:
stamp:
sec: 181
nanosec: 183342782
frame_id: odom
child_frame_id: base_link
pose:
pose:
position:
x: 3.586948259978826e-09
y: -3.937237479952689e-09
z: 3.037065806226913e-06
orientation:
x: 1.7471796262639784e-05
y: 2.2032909829450666e-05
z: 4.903551199178982e-06
w: 0.9999999995926212
covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
twist:
twist:
linear:
x: -1.1270090283233003e-07
y: -3.3559405210326076e-07
z: -1.9951801277784398e-06
angular:
x: -4.480965435504913e-05
y: 1.4838282368145883e-05
z: -2.7358501029084437e-06
covariance:
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
- 0.0
---(3) Transform Trees全体の確認。
ros2 run tf2_tools view_frames4-3. Odometry の更新タイミング
通常の Odometry では、odom はロボット移動に合わせて動くものではありません。ただし、Navigation 全体では次のような Transform Tree になることがあります。
・map
・odom
・base_link
この場合、「odom -> base_link」は Odometry が更新します。一方で、「map -> odom」は AMCL や SLAM などの Localization が更新することがあります。つまり、map から見た odom の位置は補正によって変わることがあります。
