Isaac Sim physics validation

The colcon tests validate the controllers on mock_components hardware — they prove the artifact loads, the interfaces bind, the law computes the right command, and the chain wires up. They do not prove the controller stabilizes anything, because mock hardware has no dynamics.

Physics stabilization — the same exported artifact balancing the real (simulated) cart–double-inverted-pendulum — can run in NVIDIA Isaac Sim, locally against a GPU. The assets live in the repo’s isaac/ directory and are intentionally outside the colcon build and CI.

Note

For a headless, GPU-free physics check that also runs in CI, use Gazebo Fortress physics validation. Isaac is the higher-fidelity / photorealistic option when a GPU is available.

Architecture

Isaac Sim (physics + articulation)
  ├─ publishes  /isaac_joint_states   (sensor_msgs/JointState)
  ├─ publishes  /clock                (use_sim_time)
  └─ subscribes /isaac_joint_commands (effort)
        ▲                    │
        │ topic_based_ros2_control (hardware plugin in the Isaac URDF variant)
        │                    ▼
controller_manager → lqr_controller → effort command

The URDF used on the ROS 2 side is the topic_based_ros2_control variant of the robot (identical geometry, hardware plugin swapped), so the same controller config and artifact drive both mock hardware and Isaac.

Run it (two terminals)

Terminal 1 — Isaac + bridge (the wrapper sets the ROS 2 bridge environment; do not source system ROS here):

cd .../kontrolem_controllers/isaac
./run_isaac_sim.sh            # add --headless to run without the GUI

Isaac runs Python 3.11 while system ROS 2 Humble is 3.10, so the bridge uses Isaac’s bundled Humble libraries — sourcing /opt/ros/humble here breaks import rclpy. See isaac/README.md for the details.

Terminal 2 — controller stack (a sourced ROS 2 workspace):

ros2 launch .../kontrolem_controllers/isaac/lqr_isaac.launch.py

The pendulum holds upright; perturb it in the viewport and watch the cart recover. Full prerequisites, gotchas (effort-only joints, physics rate ≥ 2× controller rate, use_sim_time, topic-name matching), and the LQG/H∞ variants are in isaac/README.md.