見出し画像

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: 166667822

6-3. Clock (/clock) を RViz2 で利用

Isaac Simから /clock をpublishしている場合、RViz2側で use_sim_time=true を設定すると、RViz2はPCのシステム時間ではなく、/clock のシミュレーション時間を使うようになります。

(1) シミュレーション時間を利用してRViz2 の起動

ros2 run rviz2 rviz2
ros2 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 /topic
data: 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 を試すのが分かりやすいです。

次回



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