feat(dc_measurements): add the Mission Measurement Open-RMF adapter - #417
Merged
Minipada merged 3 commits intoAug 21, 2026
Merged
Conversation
…391) Adds MissionOpenRmf, consuming Open-RMF's TaskState stream (via #390's WebSocketJsonClient) and emitting mission_start/mission_end Records in called for explicitly: `skipped` is treated as task-terminal and mapped to outcome `cancelled`; `blocked`/`error` are treated as transient, not terminal. Status enum and TaskState field names verified against the real rmf_api_msgs task_state.json schema. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Dsswe9mDB56HKL5x9igcma Signed-off-by: David Bensoussan <d.bensoussan@proton.me>
Minipada
force-pushed
the
feature/391-add-the-mission-measurement-open-rmf-ada
branch
from
August 20, 2026 22:53
36a1449 to
bc47332
Compare
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## jazzy #417 +/- ##
==========================================
+ Coverage 70.47% 70.80% +0.34%
==========================================
Files 112 114 +2
Lines 7221 7440 +219
==========================================
+ Hits 5088 5267 +179
- Misses 2133 2173 +40
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
… test The MeasurementServer fixture's constructor creates a LifecycleNode before rclcpp::init() had ever run, since this test file was missing the int main() every other ROS-node test in this package has -- CI failed all 9 cases with "failed to create guard condition: context argument is null". Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Dsswe9mDB56HKL5x9igcma Signed-off-by: David Bensoussan <d.bensoussan@proton.me>
PushServer (the mission_open_rmf integration test's mock websocket server) never issues a second async_accept and never reads from the established connection, so once the handshake completed there was no outstanding async operation left to keep io_context::run() from returning on its own -- its background thread exited right after the first connection formed. send()'s asio::post() then queued onto a dead io_context and fut.wait() blocked forever, which is what CI's "test did not generate a result file" (killed by CTest's timeout) actually was. Verified with a standalone repro (PushServer + the real WebSocketJsonClient, run under a 20s watchdog outside colcon/ctest): hung indefinitely before this fix, completes and round-trips a message correctly after adding the executor_work_guard. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Dsswe9mDB56HKL5x9igcma Signed-off-by: David Bensoussan <d.bensoussan@proton.me>
github-actions
Bot
deleted the
feature/391-add-the-mission-measurement-open-rmf-ada
branch
August 21, 2026 00:06
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Adds
mission_open_rmf(classMissionOpenRmf), the Open-RMF adapter of the MissionMeasurement: it consumes Open-RMF's
TaskStatestream over a plainws://connection(
dc_common::WebSocketJsonClient, #390) and emitsmission_start/mission_endRecords in#305/#387's contract —
mission_idfrombooking.id,mission_typefromcategory.Open-RMF's task model is a continuously-updated 12-value
statusenum rather than a flatstart/end pair; the status names and
TaskStatefield shapes used here (booking,category,cancellation.labels,killed.labels,dispatch.errors,unix_millis_start_time/unix_millis_finish_time) were verified against the realrmf_api_msgstask_state.jsonschema, not guessed.
Per the acceptance criteria, two judgment calls are resolved explicitly (see
MissionOpenRmfCore's doc comment anddoc/src/dc/measurements/mission_open_rmf.md) rather thansilently defaulted:
skippedis treated as task-terminal, mapping to outcomecancelled(DC's outcome contracthas four values, not five).
blocked/errorare treated as transient, not terminal — the task stays open until a realterminal status arrives.
reason/error_codeare populated best-effort from whichever field Open-RMF actually supplied(unlike nav2's always-present
error_msg), andduration_secprefers Open-RMF's ownunix_millis_start_time/unix_millis_finish_timeover locally observed timestamps when both arepresent.
Note on #305: this issue lists #305 (the still-open mission-lifecycle-contract design issue)
as a blocker. #388/#389, which share that same dependency, already implemented and merged against
the same
mission_start/mission_endcontract, so this PR follows that established precedentrather than waiting on #305's tracking issue to be formally closed.
Note on build verification: local disk space constraints prevented a full
colcon build/colcon testrun of the whole workspace in this environment. The new ROS-freeMissionOpenRmfCorelogic (the actual status-mapping/outcome decisions) was independentlycompiled and unit-tested (16/16 passing) with g++ against gtest directly.
dc_common,dc_lifecycle_manager, anddc_bridgeall compiled successfully during the interruptedworkspace build attempts, so CI's clean-runner
colcon build/colcon testis the outstandingsignal for the full plugin + integration test.
Closes #391
Test plan
MissionOpenRmfCoreunit tests (test_mission_open_rmf_core.cpp, 16 cases) — compiled andrun standalone with g++/gtest, all passing
prek run --all-files --skip build-doc— cleancolcon build+colcon testfordc_measurements(new plugin + integration testtest_measurement_mission_open_rmf.cppagainst a mock websocket TaskState fixture)🤖 Generated with Claude Code
https://claude.ai/code/session_01Dsswe9mDB56HKL5x9igcma