mcpField
I
isaac-sim-ros2-bridge

isaac-sim-ros2-bridge

github.com/isaac-sim開発4.4k39 回インストール5 日前に更新
リポジトリ

isaac-sim-ros2-bridge について

isaac-sim-ros2-bridgeは、OmniGraphを介してIsaac Sim 6のシミュレーションをROS 2に接続するスキルです。トピック通信、Nav2設定、複数ロボットの名前空間設定と、フリート構成スクリプトを説明します。

主な機能

  1. 01ROS 2トピックの送受信
  2. 02OmniGraphブリッジアクショングラフの構築
  3. 03シミュレーションデータと指令の接続
  4. 04Nav2との連携
  5. 05ロボットフリートの名前空間設定
  6. 06複数ロボット用ブリッジスクリプトの実行

活用シーン

  1. 01シミュレーションのセンサーデータをROS 2へ配信
  2. 02Nav2の速度指令をロボットへ送信
  3. 03複数ロボットのトピック名前空間を設定
  4. 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_viewerTF ツリーの可視化
isaacsim.ros2.urdfROS 2 の規約に沿った URDF のインポート
isaacsim.ros2.examplesサンプルシーン(Nova Carter、iw_hub、hospital、office)
isaacsim.ros2.sim_controlROS 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 ブリッジの起動またはシンボル解決に関する問題が報告された場合は、次の優先順位に従ってください。

  1. デフォルトの方法: isaac-sim.sh / python.sh で起動し、setup_ros_env.sh にバンドルされた ROS 環境を設定させます。
  2. システム ROS を使用する方法: カスタムメッセージパッケージまたは別の RMW 実装が必要な場合は、起動する前に親シェルで /opt/ros/<distro>/setup.bash(およびオーバーレイワークスペース)を source します。
  3. LD_LIBRARY_PATH を実行中に修正しない: Isaac Sim がすでに誤ったローダー環境で実行されている場合、プロセス内で修復しようとせず、正しく source したシェルから再起動します。

「現在の Isaac Sim プロセス内で LD_LIBRARY_PATH を export して再試行する」ことはアンチパターンとして扱ってください。常に「親シェルを修正してから再起動する」ことが是正措置です。

[コード:scripts/prerequisites.sh]

OmniGraph ROS 2 ノード

ROS 2 通信はすべて OmniGraph アクショングラフを通じて設定します。主なノードタイプは次のとおりです。

パブリッシャー
ノードタイプトピックの型使用例
ROS2PublishClockrosgraph_msgs/Clockシミュレーション時刻の同期
ROS2PublishJointStatesensor_msgs/JointState関節の位置/速度
ROS2PublishOdometrynav_msgs/Odometryロボットのオドメトリ
ROS2PublishLaserScansensor_msgs/LaserScanLiDAR データ
ROS2PublishImagesensor_msgs/Imageカメラの RGB/深度
ROS2PublishCameraInfosensor_msgs/CameraInfoカメラの内部パラメーター
ROS2PublishTransformTreetf2_msgs/TFMessageTF フレーム
ROS2PublishSemanticLabelsstd_msgs/Stringセマンティックセグメンテーションのラベル
ROS2PublishPointCloudsensor_msgs/PointCloud2LiDAR/深度のポイントクラウド
ROS2PublishImusensor_msgs/ImuIMU データ
サブスクライバー
ノードタイプトピックの型使用例
ROS2SubscribeJointStatesensor_msgs/JointState関節のコマンド
ROS2SubscribeTwistgeometry_msgs/Twist速度コマンド(cmd_vel)
ROS2SubscribeAckermannDriveackermann_msgs/AckermannDriveStampedAckermann ステアリングコマンド
汎用/追加
ノードタイプ使用例
ROS2Publisher / ROS2Subscriber任意のメッセージ型に対応する汎用パブリッシュ/サブスクライブ
ROS2PublishBoundingBox2D / ROS2PublishBoundingBox3Dアノテーターの出力を ROS 2 に送信
ROS2PublishRgbdRGB+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 を使用します。つまり、次のようになります。

  1. ステージが停止状態のときにグラフが作成されます(トピックはパブリッシュされません)。
  2. app_utils.play() が呼び出されると(または GUI で Play が押されると)、OnPlaybackTick が各フレームで発火し、接続されているすべてのパブリッシャー/サブスクライバーを駆動します。
  3. 再生を停止すると、すべてのトピックがただちに停止します。

これはフリートのデモに適したパターンです。トピックが現れる前に 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>/odomnav_msgs/Odometry<name>/odom → <name>/base_link
/<name>/scansensor_msgs/LaserScan<name>/lidar_link
/<name>/joint_statessensor_msgs/JointState—
/tftf2_msgs/TFMessageロボットのサブツリー
/clockrosgraph_msgs/Clock共有、グラフは 1 つ
サブスクライブするトピック
トピックメッセージ型用途
/<name>/cmd_velgeometry_msgs/TwistNav2 からの速度指令

Nav2 との統合

Isaac Sim ROS 2 Bridge で Nav2 を使用するには、次の手順に従います。

  1. 必要なトピックをパブリッシュします:/odom、/tf、/scan(または /pointcloud)、/joint_states
  2. 次のトピックをサブスクライブします:/cmd_vel
  3. シミュレーションのクロックを /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.usdiw_hub AMR
Multi-Robot NavigationROS2/Navigation/Multiple Robots categoryフリートの Nav2
Hospital Scene/Isaac/Samples/ROS2/Scenario/hospital_scene.usdPerceptor と hospital
Office Scene/Isaac/Samples/ROS2/Scenario/office_scene.usdオフィス内のナビゲーション

コメント