Skip to content

Commit 6b9e084

Browse files
committed
refactor(demos/ota): collapse to one component, keep apps + functions
The previous manifest split apps across seven components - lidar-sensor, robot-base, nav2-motion, nav2-localization, medkit-gateway-unit, fault-manager-unit, foxglove-unit - but none of those subdivisions correspond to anything you can actually OTA independently in this demo. They all run on a single host, the only swap target is the LiDAR app itself, and the seven-component tree just made the operator scroll past artificial boundaries. Replace with a single `turtlebot3` component that owns every app. The hierarchy the operator now sees is: - 1 Component: TurtleBot3 Robot (the OTA boundary). - 22 Apps: the ROS 2 nodes inside it. - 5 Functions: capability groupings (Autonomous Navigation / Localization / Perception / Fleet Diagnostics / Live Telemetry). Functions remain the cross-cutting view - "is Perception working?" pulls scan-sensor + ros-gz-bridge from the single component, no component partition needed to answer that question. Multi-component manifests still make sense in multi-host / multi-ECU scenarios; for this single-robot demo we don't fake them.
1 parent 7bd90be commit 6b9e084

1 file changed

Lines changed: 40 additions & 65 deletions

File tree

demos/ota_nav2_sensor_fix/manifest.yaml

Lines changed: 40 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -8,18 +8,22 @@
88
# automatically without needing a manifest entry.
99
#
1010
# Hierarchy used for this demo:
11-
# - Components are the OTA / hardware boundaries: a LiDAR sensor, the
12-
# Nav2 motion stack, the diagnostics services, etc. This is what
13-
# "you can swap" looks like.
14-
# - Apps are the ROS 2 nodes that live on a component.
11+
# - One Component: the robot itself. SOVD lets a manifest declare
12+
# multiple components (e.g. one per ECU on a vehicle), but here
13+
# everything runs on a single host so a flat single-component model
14+
# is honest and avoids fake "lidar-sensor / nav2-motion / ..."
15+
# subdivisions that don't correspond to anything you can actually
16+
# swap independently in this demo.
17+
# - Apps are the ROS 2 nodes - one entry per node we want the operator
18+
# to see. They all live on the single robot component.
1519
# - Functions are capability groupings - "Autonomous Navigation",
16-
# "Perception" - that pull apps from across components when the
17-
# capability is delivered by more than one node.
20+
# "Perception" etc. - that pull apps together by what they deliver,
21+
# orthogonally to where they run.
1822
#
1923
# Areas are intentionally left out. SOVD allows them, but they only add
20-
# value when there's a meaningful spatial / zone partition (powertrain /
21-
# body / chassis on a vehicle ECU mesh). On a single robot they just
22-
# regroup the same components a second time and clutter the tree.
24+
# value when there's a meaningful zone partition (powertrain / body /
25+
# chassis on a vehicle ECU mesh, or multi-robot tenancy). For a single
26+
# robot they just regroup the same component a second time.
2327

2428
manifest_version: "1.0"
2529

@@ -37,43 +41,14 @@ config:
3741
inherit_runtime_resources: true
3842

3943
# =============================================================================
40-
# COMPONENTS - OTA / hardware boundaries; the apps live on these
44+
# COMPONENTS - one per OTA boundary. For this demo there's a single host
45+
# so a single component owns every app.
4146
# =============================================================================
4247
components:
43-
- id: lidar-sensor
44-
name: "LiDAR Sensor"
45-
type: "sensor"
46-
description: "2D LiDAR (broken_lidar / fixed_lidar after OTA swap)"
47-
48-
- id: robot-base
49-
name: "TurtleBot3 Base"
48+
- id: turtlebot3
49+
name: "TurtleBot3 Robot"
5050
type: "platform"
51-
description: "Robot platform - URDF publisher and gz bridge"
52-
53-
- id: nav2-motion
54-
name: "Nav2 Motion"
55-
type: "controller"
56-
description: "BT navigator, planner, controller, behaviors, costmaps"
57-
58-
- id: nav2-localization
59-
name: "Nav2 Localization"
60-
type: "controller"
61-
description: "AMCL + map server + localization lifecycle manager"
62-
63-
- id: medkit-gateway-unit
64-
name: "ros2_medkit Gateway"
65-
type: "controller"
66-
description: "SOVD HTTP gateway with the OTA update plugin loaded"
67-
68-
- id: fault-manager-unit
69-
name: "Fault Manager"
70-
type: "controller"
71-
description: "Fault aggregation backend behind /faults"
72-
73-
- id: foxglove-unit
74-
name: "Foxglove Bridge"
75-
type: "controller"
76-
description: "WebSocket bridge for Foxglove Studio panels"
51+
description: "TurtleBot3 burger running headless Gazebo, Nav2, the ros2_medkit gateway, and the OTA-managed sensor stack."
7752

7853
# =============================================================================
7954
# APPS - one per ROS 2 node we care about (skip nav2-internal _rclcpp_node
@@ -84,159 +59,159 @@ apps:
8459
- id: scan-sensor
8560
name: "Scan Sensor"
8661
category: "sensor"
87-
is_located_on: lidar-sensor
62+
is_located_on: turtlebot3
8863
description: "LaserScan publisher (broken_lidar pre-OTA, fixed_lidar post-OTA)"
8964
ros_binding: { node_name: scan_sensor_node, namespace: / }
9065

9166
- id: ros-gz-bridge
9267
name: "ROS-Gazebo Bridge"
9368
category: "simulation"
94-
is_located_on: lidar-sensor
69+
is_located_on: turtlebot3
9570
description: "Bridges /scan_sim and /clock from gz-sim"
9671
ros_binding: { node_name: ros_gz_bridge, namespace: / }
9772

9873
# ── Robot platform ────────────────────────────────────────────────
9974
- id: robot-state-publisher
10075
name: "Robot State Publisher"
10176
category: "platform"
102-
is_located_on: robot-base
77+
is_located_on: turtlebot3
10378
description: "Publishes the robot URDF TF tree"
10479
ros_binding: { node_name: robot_state_publisher, namespace: / }
10580

10681
# ── Nav2 motion ───────────────────────────────────────────────────
10782
- id: bt-navigator
10883
name: "BT Navigator"
10984
category: "navigation"
110-
is_located_on: nav2-motion
85+
is_located_on: turtlebot3
11186
description: "Behavior Tree navigator - hosts navigate_to_pose action"
11287
ros_binding: { node_name: bt_navigator, namespace: / }
11388

11489
- id: planner-server
11590
name: "Planner Server"
11691
category: "navigation"
117-
is_located_on: nav2-motion
92+
is_located_on: turtlebot3
11893
description: "Global path planner"
11994
ros_binding: { node_name: planner_server, namespace: / }
12095

12196
- id: controller-server
12297
name: "Controller Server"
12398
category: "navigation"
124-
is_located_on: nav2-motion
99+
is_located_on: turtlebot3
125100
description: "Local path follower"
126101
ros_binding: { node_name: controller_server, namespace: / }
127102

128103
- id: smoother-server
129104
name: "Smoother Server"
130105
category: "navigation"
131-
is_located_on: nav2-motion
106+
is_located_on: turtlebot3
132107
description: "Path smoothing"
133108
ros_binding: { node_name: smoother_server, namespace: / }
134109

135110
- id: route-server
136111
name: "Route Server"
137112
category: "navigation"
138-
is_located_on: nav2-motion
113+
is_located_on: turtlebot3
139114
description: "Route planning"
140115
ros_binding: { node_name: route_server, namespace: / }
141116

142117
- id: behavior-server
143118
name: "Behavior Server"
144119
category: "navigation"
145-
is_located_on: nav2-motion
120+
is_located_on: turtlebot3
146121
description: "Recovery behaviors"
147122
ros_binding: { node_name: behavior_server, namespace: / }
148123

149124
- id: waypoint-follower
150125
name: "Waypoint Follower"
151126
category: "navigation"
152-
is_located_on: nav2-motion
127+
is_located_on: turtlebot3
153128
description: "Sequenced waypoint navigation"
154129
ros_binding: { node_name: waypoint_follower, namespace: / }
155130

156131
- id: velocity-smoother
157132
name: "Velocity Smoother"
158133
category: "navigation"
159-
is_located_on: nav2-motion
134+
is_located_on: turtlebot3
160135
description: "/cmd_vel smoothing"
161136
ros_binding: { node_name: velocity_smoother, namespace: / }
162137

163138
- id: collision-monitor
164139
name: "Collision Monitor"
165140
category: "navigation"
166-
is_located_on: nav2-motion
141+
is_located_on: turtlebot3
167142
description: "Emergency stop on imminent collision"
168143
ros_binding: { node_name: collision_monitor, namespace: / }
169144

170145
- id: docking-server
171146
name: "Docking Server"
172147
category: "navigation"
173-
is_located_on: nav2-motion
148+
is_located_on: turtlebot3
174149
description: "Approach + dock action"
175150
ros_binding: { node_name: docking_server, namespace: / }
176151

177152
- id: global-costmap
178153
name: "Global Costmap"
179154
category: "navigation"
180-
is_located_on: nav2-motion
155+
is_located_on: turtlebot3
181156
description: "Static + obstacle costmap for planning"
182157
ros_binding: { node_name: global_costmap, namespace: /global_costmap }
183158

184159
- id: local-costmap
185160
name: "Local Costmap"
186161
category: "navigation"
187-
is_located_on: nav2-motion
162+
is_located_on: turtlebot3
188163
description: "Local rolling costmap for control"
189164
ros_binding: { node_name: local_costmap, namespace: /local_costmap }
190165

191166
- id: lifecycle-manager-navigation
192167
name: "Lifecycle Manager (Navigation)"
193168
category: "navigation"
194-
is_located_on: nav2-motion
169+
is_located_on: turtlebot3
195170
description: "Nav2 motion lifecycle orchestration"
196171
ros_binding: { node_name: lifecycle_manager_navigation, namespace: / }
197172

198173
# ── Nav2 localization ─────────────────────────────────────────────
199174
- id: amcl
200175
name: "AMCL"
201176
category: "localization"
202-
is_located_on: nav2-localization
177+
is_located_on: turtlebot3
203178
description: "Adaptive Monte Carlo Localization"
204179
ros_binding: { node_name: amcl, namespace: / }
205180

206181
- id: map-server
207182
name: "Map Server"
208183
category: "localization"
209-
is_located_on: nav2-localization
184+
is_located_on: turtlebot3
210185
description: "Static map publisher"
211186
ros_binding: { node_name: map_server, namespace: / }
212187

213188
- id: lifecycle-manager-localization
214189
name: "Lifecycle Manager (Localization)"
215190
category: "localization"
216-
is_located_on: nav2-localization
191+
is_located_on: turtlebot3
217192
description: "Localization lifecycle orchestration"
218193
ros_binding: { node_name: lifecycle_manager_localization, namespace: / }
219194

220195
# ── Diagnostics ───────────────────────────────────────────────────
221196
- id: medkit-gateway
222197
name: "ros2_medkit Gateway"
223198
category: "gateway"
224-
is_located_on: medkit-gateway-unit
199+
is_located_on: turtlebot3
225200
description: "SOVD REST gateway, hosts the OTA plugin"
226201
ros_binding: { node_name: ros2_medkit_gateway, namespace: / }
227202

228203
- id: medkit-fault-manager
229204
name: "Fault Manager"
230205
category: "diagnostics"
231-
is_located_on: fault-manager-unit
206+
is_located_on: turtlebot3
232207
description: "Fault aggregation + storage"
233208
ros_binding: { node_name: fault_manager, namespace: / }
234209

235210
# ── Visualization ─────────────────────────────────────────────────
236211
- id: foxglove-bridge
237212
name: "Foxglove Bridge"
238213
category: "visualization"
239-
is_located_on: foxglove-unit
214+
is_located_on: turtlebot3
240215
description: "WebSocket bridge on :8765"
241216
ros_binding: { node_name: foxglove_bridge, namespace: / }
242217

0 commit comments

Comments
 (0)