Skip to main content
Version: 3.4.x

Node Topology and Data Flow

Node topology

To make the runtime easy to follow for new readers, this section is organized around who receives which inputs and produces which outputs.

NodeMain roleKey inputsKey outputs / behavior
cobiz_bridge_nodedevice registration/update + Track/action compositionconfig.yaml (videos, audios, speaker, lidar, topics, actions, control)publishes /device_info
manager_nodeautomatically starts/restarts child nodes based on /device_infosubscribes to /device_info, reads config.yamlmanages video_node, topic_node, audio_node, speaker_node, lidar_node, sensor_node, occupancy_grid_node, control_node, health_check_node, and request_manager
health_check_nodereceives and filters server eventsserver websocket (TASK_REGISTERED, TASK_ABORTED)publishes /task_event
request_managerforwards plugin status to centralized HTTP endpointssubscribes to /task_statePOST {COBIZ_API_ADDRESS}/api/tasks/{task_id}/{task_type}
video_nodeencodes and forwards RTSP/UVC video sourcestype=rtsp/uvc, source, format, width, height, fpswebsocket transfer (H.265/H.264/VP9)
topic_nodeencodes and forwards ROS image topicssource, format, width, height, fps, message_typewebsocket transfer + diagnostic logging
audio_nodeencodes and forwards ALSA/Pulse/RTSP audio sources with Opustype=alsa/pulse/rtsp, source, format, sample_rate, channelswebsocket transfer
speaker_nodereceives server-side Opus and plays it through speakerswebsocket audio stream, type, source, rate, channelsALSA/Pulse playback
lidar_nodecompresses and forwards PointCloud2topic (sensor_msgs/PointCloud2)Draco-compressed payload over websocket
sensor_nodeserializes and forwards arbitrary ROS topicstopic, topic_type (optional)websocket transfer
occupancy_grid_nodespecialized transmission for OccupancyGridtopic (nav_msgs/OccupancyGrid)PNG + metadata transfer
control_nodebridges remote control input to Joy topicswebsocket control messagespublishes sensor_msgs/Joy

Nodes started by manager_node per Track type

  • VIDEO Track
    • if videos[].type == topic, run topic_node
    • otherwise for rtsp and uvc, run video_node
  • AUDIO Track: audio_node
  • SPEAKER Track: speaker_node
  • LIDAR Track: lidar_node
  • CONTROL Track: control_node
  • MAP Track: occupancy_grid_node
  • TOPIC, BATTERY, ODOMETRY, TRAJECTORY Tracks: sensor_node

Key data flows

Core flow

cobiz_bridge_node/device_infomanager_node → child nodes

This path is how the endpoint declares the sensors, media, and control capabilities it owns and automatically starts the corresponding execution nodes.

Task-state flow

health_check_node/task_event → plugin → /task_staterequest_manager → Server API

This is the standard plugin path. A plugin receives /task_event, runs its domain logic, and publishes the result to /task_state. The actual server API call is handled by request_manager.

Role separation from an operational perspective

  • cobiz_bridge_node: the starting point for device registration and capability declaration
  • manager_node: the node lifecycle orchestrator
  • health_check_node: the adapter that converts server events into ROS 2 internal events
  • plugins: execute Task domain logic
  • request_manager: standardizes server reporting and owns the external HTTP boundary

Because of this structure, plugins can focus on execution results and state transitions, not on network implementation details.