Skip to content

ROS 2

The ROS 2 bridge allows you to put a live OmniLoop control plane on a running robot. This is where OmniLoop’s halt, live-mutate, and no-restart capabilities matter most — bringing up or debugging real hardware, not just tuning a simulation.

The bridge handles data in two directions:

  • Telemetry (Robot -> Dashboard): Subscribes to topics; each message is automatically flattened into scalar readouts.
  • Control (Dashboard -> Robot): Exposes parameters as sliders or toggles; edits in the dashboard are pushed as ROS 2 parameter updates.

Start the bridge with your desired telemetry topics and parameters:

import rclpy
from omniloop.integrations.ros2 import OmniLoopRosBridge
rclpy.init()
bridge = OmniLoopRosBridge(
node_name="omniloop_bridge",
telemetry_topics=[
("/imu/base_vel", "std_msgs/msg/Float64")
],
params=[
dict(name="max_speed", type="float", kind="slider",
min=0.0, max=2.0, step=0.05, default=1.0, target_node="/controller")
],
)
bridge.spin() # Blocks; publishes telemetry and applies dashboard edits
  • Message Flattening: OmniLoop automatically unwraps standard messages (like std_msgs .data) and walks nested fields to create clean, readable scalars in the dashboard.
  • Parameter Push: When you move a slider in the dashboard, the bridge uses an AsyncParameterClient to dynamically update the parameter on the target node.