This workspace contains an AutoAPMS-compatible Foxglove BT Ops stack:
btops_interfaces: ROS 2 messages and services exposed to Foxglove.btops_core: shared backend models, validation, and export helpers.btops_autoapms: AutoAPMS-aware provider for resource discovery and executor control.btops_groot2: BT.CPP v4 Groot2 transport and monitor hub.btops_gateway: ROS 2 gateway node that bridges AutoAPMS, Groot2, and Foxglove.btops_demo_trees: dedicated AutoAPMS tree resources used as stable Foxglove smoke tests.foxglove-btops-extension: Foxglove extension withResourceExplorer,RuntimeMonitor, andSourceEditor.
- Live AutoAPMS discovery is wired in through the provider.
- The provider now includes AutoAPMS internal mission trees in the catalog and clearly marks environments where no installed mission config resources are available.
btops_gatewayexposes the planned/btops/*topics and services.- Runtime execution uses AutoAPMS
StartTreeExecutor,CommandTreeExecutor, and parameter services. - Groot2 transport is live for
FULLTREE,STATUS, recording, transitions, and hook requests whenpyzmqis installed. - Foxglove extension packaging is on the official local-development flow and builds into a
.foxebundle. - The workspace now ships dedicated Foxglove-first demo resources so live monitoring no longer depends on the more fragile upstream sample trees.
RuntimeMonitornow renders a live BT graph from Groot2FULLTREEdata and colors nodes from recent transition state.RuntimeMonitornow shows per-node breakpoint and substitution badges directly on the graph and keeps hook state synchronized from backend execution snapshots.RuntimeMonitornow supports direct blackboard editing through/btops/set_blackboard.RuntimeMonitornow exposes/btops/set_recordingcontrols and a replay workflow note for recording/btops/*topics into MCAP.RuntimeMonitornow distinguishes live-control versus replay/view-only sessions and includes an operator-facing capture checklist plus aros2 bagcommand hint.SourceEditornow supports catalog-driven resource picking, validation markers, normalized source reuse, and diff preview.- End-to-end validation has been run with
tree_executor,simple_skill_server,btops_gateway, andfoxglove_bridge. - End-to-end mission validation and runtime apply were exercised against
auto_apms_mission'sorchestratornode. scripts/smoke_runtime.pynow exercises live start, transition delivery, recording toggle, and hook-state reflection against the running gateway.scripts/smoke_substitution_profiles.pynow verifies substitution profiles, hook-state persistence, and recording metadata reflection against a dedicated substitution demo tree.scripts/record_btops_topics.shnow records the replay-critical/btops/*topics into a rosbag/MCAP capture with one command.scripts/smoke_multi_executor.pynow verifies catalog mission roles, simultaneous tree/mission executor monitoring, distinct Groot2 ports, and the guarded mission-runtime diagnostic path.
- Fixed a resource refresh race that could cause
node_manifest_identities is emptyduring/btops/start_behavior. - Fixed gateway shutdown so
Ctrl-Cno longer emitsDestroyable because destruction was requested. - Verified live
/btops/transition_eventoutput from Groot2-backed monitoring, with aSTATUS-driven fallback when the installed BT.CPP runtime returns an empty Groot2 transition buffer. - Verified
/btops/set_blackboardround-trips back into/btops/blackboard_event. - Mission YAML validation now canonicalizes AutoAPMS mission keys like
mission:into the uppercase schema expected by the installed runtime. - Inline mission failures now surface an actionable diagnostic in
/btops/execution_snapshoteven when the installed AutoAPMS action result message is empty. - Verified backend-driven
hook_state_jsonupdates on/btops/execution_snapshotafter live breakpoint and substitution-profile requests. - Verified
/btops/set_recordingnow persists recording session metadata (session_id, start/stop times, event counts) intorecording_metadata_json. - The Resource Explorer now defaults to the dedicated
FoxgloveStableDemotree and hides the older AutoAPMS sample trees that rely on self-parameter lookups. - Mission starts are now guarded by default to avoid dispatching a known-broken orchestrator runtime path; guarded sessions still surface catalog and diagnostic context without crashing into the duplicate-registration failure.
- Mission validation and inline dispatch work, but the installed AutoAPMS mission runtime still fails while creating the tree due to upstream duplicate node registration inside
orchestrator. - The current workaround is a guard rail: the gateway blocks mission execution by default, returns a
guardedsnapshot, and reports the known runtime issue without dispatching the unsafe launch path. - Replay depends on externally recording
/btops/catalog,/btops/execution_snapshot,/btops/transition_event, and/btops/blackboard_eventinto MCAP through Foxglove orros2 bag; there is not yet a dedicated import/export wizard inside the extension. - Runtime substitution is now profile-based (
always_*,pulse_*), but still maps to Groot2 result forcing rather than swapping arbitrary node implementations at runtime.
source /opt/ros/jazzy/setup.bash
source /home/arl/btops_ws/install/setup.bash
export ROS_AUTOMATIC_DISCOVERY_RANGE=LOCALHOST
unset ROS_LOCALHOST_ONLYBuild the workspace:
cd /home/arl/btops_ws
colcon build --symlink-installRun the gateway:
source /opt/ros/jazzy/setup.bash
source /home/arl/btops_ws/install/setup.bash
ros2 run btops_gateway btops_gatewayRun Foxglove bridge:
source /opt/ros/jazzy/setup.bash
source /home/arl/btops_ws/install/setup.bash
ros2 launch foxglove_bridge foxglove_bridge_launch.xml port:=8765 address:=127.0.0.1Run the live runtime smoke test:
source /opt/ros/jazzy/setup.bash
source /home/arl/btops_ws/install/setup.bash
python3 /home/arl/btops_ws/scripts/smoke_runtime.py --transition-timeout 25Recommended first live demo in Foxglove:
- Executor:
tree_executor - Resource identity:
tree/btops_demo_trees::foxglove_stable_demo::FoxgloveStableDemo - Start mode:
auto(defaults to attached for the dedicated demo)
Additional focused demos:
tree/btops_demo_trees::foxglove_substitution_demo::FoxgloveSubstitutionDemofor substitution-profile validation.tree/btops_demo_trees::foxglove_replay_demo::FoxgloveReplayDemofor replay/recording sessions with repeated transitions.
Record the replay topics into a bag:
/home/arl/btops_ws/scripts/record_btops_topics.sh btops_captureRun the multi-executor and mission-diagnostic smoke test:
source /opt/ros/jazzy/setup.bash
source /home/arl/btops_ws/install/setup.bash
python3 /home/arl/btops_ws/scripts/smoke_multi_executor.pyRun the substitution-profile and recording-metadata smoke test:
source /opt/ros/jazzy/setup.bash
source /home/arl/btops_ws/install/setup.bash
python3 /home/arl/btops_ws/scripts/smoke_substitution_profiles.py --profile always_failureIf you must bypass the guarded mission runtime to reproduce the upstream failure directly:
export BTOPS_ALLOW_UNSTABLE_MISSION_RUNTIME=1- Keep mission execution on a guarded path until the installed AutoAPMS runtime duplicate-registration issue is fixed upstream or a safe external workaround is found.
- Decide whether true dummy-node substitution is worth a protocol extension beyond the current result-forcing substitution profiles.
- Consider a dedicated replay/import wizard inside the Foxglove extension if manual MCAP capture and reopen becomes a usability bottleneck.
- Add one-command local bringup/teardown helpers around the current smoke scripts if repeated operator validation becomes common.
See also:
/home/arl/btops_ws/docs/OPERATIONS.md/home/arl/btops_ws/docs/KNOWN_ISSUES.md