diff --git a/demos/ota_nav2_sensor_fix/README.md b/demos/ota_nav2_sensor_fix/README.md index e6480c8..f3cc757 100644 --- a/demos/ota_nav2_sensor_fix/README.md +++ b/demos/ota_nav2_sensor_fix/README.md @@ -4,6 +4,15 @@ End-to-end demo: a `ros2_medkit` gateway with a dev-grade OTA plugin that demonstrates a real update / publish-a-hotfix loop on a ROS 2 node without SSH-ing into the robot. +## Architecture + +Off-board tooling drives the on-board robot over one SOVD REST API: the gateway +registers and applies OTA updates (the OTA Update Agent hot-swaps the lidar +node), while the fault bridges and the Fault Manager turn Nav2's own failures +into SOVD faults. + +![OTA over SOVD - nav2 sensor-fix demo architecture](docs/architecture.svg) + ## What this shows The headline scene is a diagnostic loop, not just a button-press update: @@ -168,7 +177,7 @@ curl -X DELETE "${API}/apps/controller-server/faults" # 8. Resume the mission (or use ./send-goal.sh). ``` -## Foxglove Studio visualization +## Foxglove visualization The gateway container bakes in a Robotnik RB-Theron AMR + Nav2 stack running on top of headless Gazebo in the AWS small-warehouse world. `foxglove_bridge` @@ -177,7 +186,7 @@ runs on port `8765` and exposes the full topic set: `/tf`, `/tf_static`, `/local_costmap/costmap`, etc. - so a Foxglove **3D** panel renders the actual robot in the warehouse out of the box. -1. Open Foxglove Studio -> **Open connection** -> **Foxglove WebSocket** -> +1. Open Foxglove -> **Open connection** -> **Foxglove WebSocket** -> `ws://localhost:8765`. The Topics panel should list all of the topics above. 2. Drop in a **3D** panel. In its settings set **Scene -> Mesh up axis -> diff --git a/demos/ota_nav2_sensor_fix/docs/architecture.svg b/demos/ota_nav2_sensor_fix/docs/architecture.svg new file mode 100644 index 0000000..85ddbc4 --- /dev/null +++ b/demos/ota_nav2_sensor_fix/docs/architecture.svg @@ -0,0 +1,4 @@ +OTA over SOVD· nav2 sensor-fix demoFix a broken robot by shipping a new node over the network - diagnose and update over one SOVD REST API, no SSH.Components:ros2_medkitFoxglovedemo-onlyNav2SOVD · OTA · faultsNode hot-swapFoxglove telemetryROS 2 · observeOFF-BOARDFoxglove UI · update backendON-BOARD · robot (Gazebo sim)our ros2_medkit stack + the robot's ROS 2 appUpdate serverhosts the OTA update packagesthe agent pulls catalog + artifactsbroken_lidar 3.0.0 · fixed_lidar 3.0.1Foxglovelive 3D via WebSocketros2_medkit extensionSOVD diagnostics panels (faults / updates)OTA Update Agentupdate provider (gateway plugin)the gateway registers updates here,then it pulls & swaps the noderos2_medkit GatewaySOVD REST API · :8080 — the diagnostic hubone API: faults · updates · data · operations · logsfoxglove_bridge:8765 · WebSocketstreams robot data to Foxglovehealth_checkon-demand diagnostic appchecks lidar · localization · drivetrain · costmapLidar componentreads the laser sensorpublishes /scan for Nav2fixed_lidar ⇄ broken_lidarNav2autonomy · navigatebt-navigator · costmapsaborts when path blockedFault bridgeslog + nav-goalwatch rosout + nav goal→ report the faultFault Manageraggregate · latchconfirms the incoming faultfreeze-frame + MCAP capturefaults DBSQLitepull updateregisterWebSocket · :8765SOVD REST · :8080hot-swaprun_health_checkschecks live state/scanreads faultsstores \ No newline at end of file diff --git a/demos/ota_nav2_sensor_fix/ros2_packages/ota_nav2_sensor_fix_demo/launch/demo.launch.py b/demos/ota_nav2_sensor_fix/ros2_packages/ota_nav2_sensor_fix_demo/launch/demo.launch.py index ddd937b..0f4dbaa 100644 --- a/demos/ota_nav2_sensor_fix/ros2_packages/ota_nav2_sensor_fix_demo/launch/demo.launch.py +++ b/demos/ota_nav2_sensor_fix/ros2_packages/ota_nav2_sensor_fix_demo/launch/demo.launch.py @@ -8,7 +8,7 @@ # - the Robotnik RB-Theron AMR spawned in that world, driven through # gz_ros2_control + a stock diff_drive_controller # - the full Nav2 stack (bringup_launch.py) with the warehouse map -# - foxglove_bridge on :8765 so Foxglove Studio can render /tf, /scan, /map etc. +# - foxglove_bridge on :8765 so Foxglove can render /tf, /scan, /map etc. # - ros2_medkit fault_manager (the gateway's /faults endpoint depends on it) # - the gateway with our ota_update_plugin loaded via gateway_config.yaml # - ros2_medkit_log_bridge + ros2_medkit_action_status_bridge, started diff --git a/demos/ota_nav2_sensor_fix/run-demo.sh b/demos/ota_nav2_sensor_fix/run-demo.sh index 7d13f8b..7781801 100755 --- a/demos/ota_nav2_sensor_fix/run-demo.sh +++ b/demos/ota_nav2_sensor_fix/run-demo.sh @@ -201,7 +201,7 @@ echo " Web UI (ros2_medkit_web_ui):" echo " npm install && npm run dev" echo " open http://localhost:5173 -> Connect -> ${GATEWAY_URL}" echo "" -echo " Foxglove Studio (recommended for the 3D narrative):" +echo " Foxglove (recommended for the 3D narrative):" echo " Open connection -> Foxglove WebSocket -> ws://localhost:${OTA_FOXGLOVE_BRIDGE_PORT:-8765}" echo " Add a 3D panel: TurtleBot3 in the world, /scan cone shows the phantom" echo " Install ros2_medkit_foxglove_extension (npm run local-install) for the"