Isaac Sim で ROS 2 Clock を試す
「Isaac Sim」で「ROS 2 Clock」を試したのでまとめました。
・Isaac Sim 5.1
前回
1. ROS 2 Clock
ROS 2でシミュレータを使うときに重要になるのが「時間」の扱いです。
実機ロボットでは「システム時間」 (PCが持つ現実世界の時刻) に合わせてノードが動きます。一方、Isaac Simなどのシミュレータでは「シミュレーション時間」(シミュレータ内で進む仮想的な時間) に合わせて動きます。「システム時間」と「シミュレーション時間」は同じ速度で進むとは限りません。
そこで使うのが、ROS 2の「/clock」「use_sim_time」「RTF」(Real Time Factor) です。
2. システム時間 ・ シミュレーション時間
ROS 2で扱う時間には、「システム時間」と「シミュレーション時間」があります。
2-1. システム時間
・PCが持つ現実世界の時刻
・実機ロボットでは基本こちらを使う
・use_sim_time=false のときに使われる
・センサ、モータ、カメラなど実機の時間と合いやすい
・例:実機制御、通常のROS 2ノード、実時間ログ
2-2. シミュレーション時間
・シミュレータ内で進む仮想的な時間
・Isaac Sim、Gazebo、rosbag再生などで使う
・/clock トピックでROS 2ノードに配信される
・use_sim_time=true のときに使われる
・シミュレータの一時停止・倍速・低速に合わせて時間も変わる
・例:RViz2、Nav2、SLAM、TF、センサ処理
3. /clock
「/clock」は、シミュレーション時間をROS 2に配信するためのトピックです。Isaac Simなどのシミュレータでは、シミュレータ内の現在時刻を「/clock」としてpublishできます。
流れは次のようになります。
Isaac Sim のシミュレーション時間
↓
ROS 2 Publish Clock
↓
/clock トピック
↓
RViz2 / Nav2 / SLAM / TF を使うノード
この仕組みにより、ROS 2側のノードはシミュレータ内の時間に同期して動けます。
4. use_sim_time
「use_sim_time」は、ROS 2ノードが「システム時間」ではなく「シミュレーション時間」を使うためのパラメータです。
4-1. 実機ロボットでは use_sim_time=false
実機ロボットでは、基本的に use_sim_time は false のままです。実機では、センサ、モータ、カメラなどが現実世界の時間で動いています。そのため、ノードもPCのシステム時間を基準に動けば問題ありません。
4-2. シミュレーションでは use_sim_time=true
Isaac Sim、rosbag再生などでは、基本的に関連ノードを use_sim_time=true にします。理由は、センサデータ、TF、ロボットの状態、RVizの表示などを、すべてシミュレーション時間にそろえるためです。
特に次のようなノードは、シミュレーション時間に合わせるのが基本です。
・RViz2
・robot_state_publisher
・Nav2
・SLAM
・localization
・TF
・センサー
一部のノードだけ use_sim_time=false のままだと、TFの時刻が合わず、表示ずれや外挿エラーの原因になります。
4-3. use_sim_time の設定
「RViz2」で「use_sim_time」を設定するコマンドは、次のとおりです。
ros2 param set /rviz use_sim_time true「use_sim_time=true」にすると、そのノードは「/clock」を購読し、ROS時間として「/clock」の時刻を使います。
5. RTF
「RTF」(Real Time Factor) は、シミュレーションで経過した時間が、現実に経過した時間に対してどれくらい速く、または遅く進んでいるかを確認するための指標です。
RTF = シミュレーションで経過した時間 / 現実に経過した時間
「RTF」の主な用途は次のとおりです。
・シミュレータが重くなっていないか確認する
・実時間どおりに動いているか確認する
・学習や大量テストで、実時間より速く回っているか確認する
・デバッグ時に、どれくらい低速で動いているか確認する
シミュレーションが重い場合、「RTF」は 1.0 を下回ります。
・RTF = 1.0 実時間どおり
・RTF = 0.5 実時間の半分の速度
・RTF = 0.1 かなり重い
6. ROS 2 Clock を試す
6-1. /clock のPublish
(1) Isaac Sim を起動。
(2) メニュー「Tools → Robotics → ROS 2 OmniGraphs → Clock」を選択し、確認ダイアログでOKをクリック。
「/clock」をpublishするAction Graphが追加されます。


(3) Playで実行。
6-2. Clock (/clock) のSubscribe
(1) ROS2をセットアップ済のターミナルを開く。
(2) トピックの確認。
ros2 topic list/clock(3) 「/clock」の確認。
ros2 topic echo /clock---
clock:
sec: 22
nanosec: 150001155
---
clock:
sec: 22
nanosec: 1666678226-3. Clock (/clock) を RViz2 で利用
Isaac Simから /clock をpublishしている場合、RViz2側で use_sim_time=true を設定すると、RViz2はPCのシステム時間ではなく、/clock のシミュレーション時間を使うようになります。
(1) シミュレーション時間を利用してRViz2 の起動
ros2 run rviz2 rviz2ros2 param set /rviz use_sim_time true(2) ROS Timeの確認。
RViz2では、画面下部のステータスバーを見ると、シミュレーション時間を使っているか確認できます。
・ROS Time : ROS 2が現在使っている時刻
・ROS Elapsed : ROS時間での経過時間 (RViz2起動後の実時間の経過秒数)


6-3. RTF (/topic) のPublish
(1) Isaac Sim を起動。
(2) メニュー「Tools → Robotics → ROS 2 OmniGraphs → Generic Publisher」を選択し、確認ダイアログで「Publish RTF as Float 32」を選択し、OKをクリック。


(3) Playで実行。
6-3. RTF (/topic) のSubscribe
(1) ROS2をセットアップ済のターミナルを開く。
(2) トピックの確認。
ros2 topic list/topic(3) 「/topic」の確認。
ros2 topic echo /topicdata: 0.9656910300254822
---
data: 0.99383544921875
---
data: 1.012662649154663
---7. フレームレート ・ 物理ステップ
7-1. フレームレート ・ 物理ステップ
Isaac Simでシミュレーションが重い場合、よく調整する項目に「フレームレート」と「物理ステップ」があります。
・フレームレート
1秒間に何回、画面を描画するか
描画の滑らかさと負荷に関係
・物理ステップ
1秒間に何回、物理計算を行うか
シミュレーションの精度に関係
シミュレーションが重いときは、まず描画側から下げるのがおすすめです。
(1) フレームレートを下げる
(2) カメラ解像度やセンサ更新頻度を下げる
(3) それでも重い場合に物理ステップを見直す
7-2. フレームレートの設定
(1) Layerで「Root Layer」を選択。
(2) Propertyの「Timecodes per Second」を変更。
デフォルトは60step/secです。

7-3. 物理ステップの設定
(1) メニュー「Create → Physics → Physics Scene」を選択。
(2) Stageで「PhysicsScene」を選択。
(3) Propertyの「Time Steps Per Second」を変更。
デフォルトは60step/secです。まずは 60 を基準にし、接触や制御が不安定な場合に 120 を試すのが分かりやすいです。

