isaac-sim-ros2-bridge について
isaac-sim-ros2-bridgeは、OmniGraphを介してIsaac Sim 6のシミュレーションをROS 2に接続するスキルです。トピック通信、Nav2設定、複数ロボットの名前空間設定と、フリート構成スクリプトを説明します。
主な機能
- 01ROS 2トピックの送受信
- 02OmniGraphブリッジアクショングラフの構築
- 03シミュレーションデータと指令の接続
- 04Nav2との連携
- 05ロボットフリートの名前空間設定
- 06複数ロボット用ブリッジスクリプトの実行
活用シーン
- 01シミュレーションのセンサーデータをROS 2へ配信
- 02Nav2の速度指令をロボットへ送信
- 03複数ロボットのトピック名前空間を設定
- 04シミュレーション再生時にフリートのトピックを開始
MCP 対応
このスキルはIsaac SimのROS 2 Bridgeを説明するもので、MCPサーバーやクライアントではありません。MCP接続や公開するMCPツールについての記載はありません。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ isaac-sim/ isaacsim --skill isaac-sim-ros2-bridgeインストール後、Claude Code で/isaac-sim-ros2-bridgeを入力して読み込まれたか確認します。
同梱ファイルscripts/multi_robot_namespacing.pyscripts/prerequisites.sh
詳細
Isaac Sim ROS 2 ブリッジ
目的
OmniGraph ブリッジノードを使用して Isaac Sim から ROS 2 トピックをパブリッシュおよびサブスクライブします。Nav2 との統合や、複数ロボットの名前空間設定にも対応しています。
制限事項
- 特に記載がない限り、Isaac Sim 6 / Kit 110 を対象としています。
- サポート対象外のエッジケースについては、NVIDIA の公式ドキュメントに代わるものではありません。
トラブルシューティング
| エラー/症状 | 原因 | 解決策 |
|---|---|---|
| ROS トピックが表示されない | ブリッジグラフが再生されていない、またはドメインが正しくない | Play を押し、ROS_DOMAIN_ID を一貫して設定します |
| humble のライブラリが見つからない | プロセスの起動前に LD_LIBRARY_PATH が設定されていない | 親シェルを修正してから再起動します(ROS 環境を source するか、デフォルトのランチャーを使用してください)。実行中のプロセスに後からパッチを適用しないでください |
| 名前空間付きトピックが一致しない | フレームまたは名前空間のずれ | OmniGraph の名前空間を Nav2 の設定に合わせます |
利用可能なスクリプト
| スクリプト | 目的 | 引数 |
|---|---|---|
scripts/multi_robot_namespacing.py | フリートのデモ:ロボットごとに再生時のみ有効になるブリッジグラフ(odom、TF、scan、joint states、cmd_vel)と共有クロック | --robots NAME:PRIM_PATH [...] --usd_path --lidar_suffix --headless --test |
scripts/prerequisites.sh | 前提条件 | スクリプトのヘッダーに記載された位置引数(スクリプトを参照) |
スクリプトの実行
スキル実行ヘルパーを公開するエージェントランタイムからは、run_script() でヘルパーを呼び出します。
run_script("scripts/multi_robot_namespacing.py", args=["--help"])
ビルド済みの Isaac Sim ツリーからは、_build/*/release にある ./python.sh(Linux)または python.bat(Windows)を使って同じファイルを実行します。シミュレーターが不要なシェルヘルパーは、直接実行します。
アーキテクチャ
Isaac Sim 6.0 の ROS 2 ブリッジは拡張機能ベース(isaacsim.ros2.bridge)で、OmniGraph アクショングラフ上に構築されています。パブリッシャー、サブスクライバー、サービスは、Play を押したときにのみ有効になります。
拡張機能のスタック
| 拡張機能 | 目的 |
|---|---|
isaacsim.ros2.core | バックエンドライブラリ、設定、軽量 ROS 2 ライブラリ |
isaacsim.ros2.nodes | トピック/サービス用 OmniGraph ノード |
isaacsim.ros2.bridge | 最上位のブリッジ拡張機能(すべてを有効化) |
isaacsim.ros2.tf_viewer | TF ツリーの可視化 |
isaacsim.ros2.urdf | ROS 2 の規約に沿った URDF のインポート |
isaacsim.ros2.examples | サンプルシーン(Nova Carter、iw_hub、hospital、office) |
isaacsim.ros2.sim_control | ROS 2 サービスによるシミュレーション制御 |
前提条件
デフォルトのワークフローでは、手動でのセットアップは不要です。isaacsim.ros2.core の起動時に ROS_DISTRO を読み込み、設定されていない場合は拡張機能に同梱された軽量 ROS 2 ライブラリにフォールバックし、internal_lib_fallback=True を設定します。isaac-sim.sh/python.sh ランチャーは setup_ros_env.sh を自動で source し、プロセスの起動前に ROS_DISTRO、RMW_IMPLEMENTATION、同梱の ROS ライブラリパスをエクスポートします。
同梱ライブラリでは提供されないメッセージ型や RMW 実装が必要な場合に限り、親シェルでシステムの ROS 2 インストール(/opt/ros/<distro>/setup.bash)を source します。Linux では、LD_LIBRARY_PATH の変更は Isaac Sim の起動前に設定しておく必要があります。動的リンカーが値を読み込むのはプロセスの起動時であるため、プロセスの実行開始後に LD_LIBRARY_PATH を変更しても、ROS ライブラリの解決には反映されません。
自動 source を無効にするには --no-ros-env を渡します。この場合、親シェルで必要な LD_LIBRARY_PATH のエントリーを含め、動作する ROS 2 環境を用意する必要があります。
ROS 環境の選択ルール
ユーザーから ROS 2 ブリッジの起動またはシンボル解決に関する問題が報告された場合は、次の優先順位に従ってください。
- デフォルトの方法:
isaac-sim.sh/python.shで起動し、setup_ros_env.shにバンドルされた ROS 環境を設定させます。 - システム ROS を使用する方法: カスタムメッセージパッケージまたは別の RMW 実装が必要な場合は、起動する前に親シェルで
/opt/ros/<distro>/setup.bash(およびオーバーレイワークスペース)を source します。 LD_LIBRARY_PATHを実行中に修正しない: Isaac Sim がすでに誤ったローダー環境で実行されている場合、プロセス内で修復しようとせず、正しく source したシェルから再起動します。
「現在の Isaac Sim プロセス内で LD_LIBRARY_PATH を export して再試行する」ことはアンチパターンとして扱ってください。常に「親シェルを修正してから再起動する」ことが是正措置です。
[コード:scripts/prerequisites.sh]
OmniGraph ROS 2 ノード
ROS 2 通信はすべて OmniGraph アクショングラフを通じて設定します。主なノードタイプは次のとおりです。
パブリッシャー
| ノードタイプ | トピックの型 | 使用例 |
|---|---|---|
ROS2PublishClock | rosgraph_msgs/Clock | シミュレーション時刻の同期 |
ROS2PublishJointState | sensor_msgs/JointState | 関節の位置/速度 |
ROS2PublishOdometry | nav_msgs/Odometry | ロボットのオドメトリ |
ROS2PublishLaserScan | sensor_msgs/LaserScan | LiDAR データ |
ROS2PublishImage | sensor_msgs/Image | カメラの RGB/深度 |
ROS2PublishCameraInfo | sensor_msgs/CameraInfo | カメラの内部パラメーター |
ROS2PublishTransformTree | tf2_msgs/TFMessage | TF フレーム |
ROS2PublishSemanticLabels | std_msgs/String | セマンティックセグメンテーションのラベル |
ROS2PublishPointCloud | sensor_msgs/PointCloud2 | LiDAR/深度のポイントクラウド |
ROS2PublishImu | sensor_msgs/Imu | IMU データ |
サブスクライバー
| ノードタイプ | トピックの型 | 使用例 |
|---|---|---|
ROS2SubscribeJointState | sensor_msgs/JointState | 関節のコマンド |
ROS2SubscribeTwist | geometry_msgs/Twist | 速度コマンド(cmd_vel) |
ROS2SubscribeAckermannDrive | ackermann_msgs/AckermannDriveStamped | Ackermann ステアリングコマンド |
汎用/追加
| ノードタイプ | 使用例 |
|---|---|
ROS2Publisher / ROS2Subscriber | 任意のメッセージ型に対応する汎用パブリッシュ/サブスクライブ |
ROS2PublishBoundingBox2D / ROS2PublishBoundingBox3D | アノテーターの出力を ROS 2 に送信 |
ROS2PublishRgbd | RGB+D の同時パブリッシュ |
ROS2PublishSemanticSegmentation / ROS2PublishInstanceSegmentation | セグメンテーションの出力 |
ROS 2 ブリッジグラフの設定(Python)
このリポジトリには、og.Controller.edit(...) を使って ROS 2 パブリッシングアクショングラフを構築する標準的なリファレンスが含まれています。これには、OnPlaybackTick をパブリッシャーノードに接続する方法、IsaacReadSimulationTime を ROS2PublishClock に接続する方法、同じスクリプト内で対応する rclpy サブスクライバーを作成する方法が含まれます。
- リファレンス例:
source/standalone_examples/api/isaacsim.ros2.bridge/clock.py
このパターンを拡張する場合は、現行の isaacsim.ros2.bridge.ROS2Publish* / ROS2Subscribe* ノード名を使用してください(従来の omni.isaac.ros2_bridge.* 名前空間は非推奨であり、Kit 110 では読み込まれません)。
移行: ノードごとの名称変更対応表については、ROS 2 OmniGraph ノードの移行を、
omni.isaac.*からisaacsim.*へのより広範なマッピングについては、拡張機能の名称変更を参照してください。
マルチロボットの名前空間
マルチロボットのシーンでは、各ロボットに ROS 2 トピック用の独自の名前空間が必要です。このリポジトリのマルチロボットシナリオ(hospital/office の Carter)では、手動での読み込みとロボットごとのセットアップパターンを示しています。このスキルの scripts/multi_robot_namespacing.py には、フリート全体のブリッジファクトリーが用意されています。
- シナリオの参照先:
source/standalone_examples/api/isaacsim.ros2.bridge/carter_multiple_robot_navigation.py - フリートグラフファクトリー:
scripts/multi_robot_namespacing.py
Play によるアクティベーション
すべてのブリッジグラフは、実行トリガーとして OnPlaybackTick を使用します。つまり、次のようになります。
- ステージが停止状態のときにグラフが作成されます(トピックはパブリッシュされません)。
app_utils.play()が呼び出されると(または GUI で Play が押されると)、OnPlaybackTickが各フレームで発火し、接続されているすべてのパブリッシャー/サブスクライバーを駆動します。- 再生を停止すると、すべてのトピックがただちに停止します。
これはフリートのデモに適したパターンです。トピックが現れる前に Nav2 ノードを起動して待機させることができ、Play の開始と同時にフリート全体のパブリッシュが一斉に始まります。
API の使用方法
from multi_robot_namespacing import setup_fleet, create_ros2_bridge_for_robot
# Full fleet setup (clock + per-robot graphs)
setup_fleet([
("carter1", "/World/Carter1"),
("carter2", "/World/Carter2"),
("carter3", "/World/Carter3"),
])
# Or create individual robot graphs
create_ros2_bridge_for_robot(
robot_name="carter1",
robot_prim_path="/World/Carter1",
lidar_prim_path="/World/Carter1/Lidar",
publish_joint_states=True,
)
ロボットごとにパブリッシュされるトピック(Play 後)
| トピック | メッセージ型 | フレーム |
|---|---|---|
/<name>/odom | nav_msgs/Odometry | <name>/odom → <name>/base_link |
/<name>/scan | sensor_msgs/LaserScan | <name>/lidar_link |
/<name>/joint_states | sensor_msgs/JointState | — |
/tf | tf2_msgs/TFMessage | ロボットのサブツリー |
/clock | rosgraph_msgs/Clock | 共有、グラフは 1 つ |
サブスクライブするトピック
| トピック | メッセージ型 | 用途 |
|---|---|---|
/<name>/cmd_vel | geometry_msgs/Twist | Nav2 からの速度指令 |
Nav2 との統合
Isaac Sim ROS 2 Bridge で Nav2 を使用するには、次の手順に従います。
- 必要なトピックをパブリッシュします:
/odom、/tf、/scan(または/pointcloud)、/joint_states - 次のトピックをサブスクライブします:
/cmd_vel - シミュレーションのクロックを
/clockでパブリッシュし、Nav2 のパラメーターでuse_sim_time: trueを設定します
既知の問題(Isaac Sim 6.0 rc.22)
- ROS 2 ブリッジは
timeline.play()でのみ有効になります。停止状態ではトピックはパブリッシュされません - カメラパブリッシャーを使用するには、カメラ prim にレンダリングプロダクトをアタッチする必要があります
- 実行時にロボット prim のパスを変更すると、TF ツリーに不整合が生じることがあります
- 同梱されている ROS 2 ライブラリには、カスタムトピックに必要なメッセージ型が含まれていない場合があります。Isaac Sim を起動する前に、親シェルでシステムの ROS 2 インストールを source してください
サンプルシーン
ビルド済みのサンプル USD ファイル(isaacsim.ros2.examples 由来):
| シーン | パス | 説明 |
|---|---|---|
| Nova Carter Navigation | /Isaac/Samples/ROS2/Scenario/carter_warehouse_navigation.usd | 単一ロボットの Nav2 |
| Nova Carter Joint States | /Isaac/Samples/ROS2/Scenario/carter_warehouse_navigation_joint_states.usd | ジョイント状態のパブリッシュあり |
| iw_hub Navigation | /Isaac/Samples/ROS2/Scenario/iw_hub_warehouse_navigation.usd | iw_hub AMR |
| Multi-Robot Navigation | ROS2/Navigation/Multiple Robots category | フリートの Nav2 |
| Hospital Scene | /Isaac/Samples/ROS2/Scenario/hospital_scene.usd | Perceptor と hospital |
| Office Scene | /Isaac/Samples/ROS2/Scenario/office_scene.usd | オフィス内のナビゲーション |