Repository navigation
Conversation
There was a problem hiding this comment.
go2 replay realtime
Details
| Benchmark suite | Current: b50b226 | Previous: 576d547 | Ratio |
|---|---|---|---|
first frame wall |
9.845 s |
9.922 s |
0.99 |
first frame cpu |
20.474 s |
20.847 s |
0.98 |
run cpu |
31.902 s |
29.144 s |
1.09 |
run cpu (user) |
24.498 s |
21.535 s |
1.14 |
run cpu (system) |
7.404 s |
7.609 s |
0.97 |
peak memory |
2718.402 MB |
2715.977 MB |
1.00 |
peak threads |
414 threads |
409 threads |
1.01 |
disk read |
32.402 MB |
29.492 MB |
1.10 |
disk write |
720.887 MB |
753.289 MB |
0.96 |
This comment was automatically generated by workflow using github-action-benchmark.
There was a problem hiding this comment.
⚠️ Performance Alert ⚠️
Possible performance regression was detected for benchmark 'go2 replay realtime'.
Benchmark result of this commit is worse than the previous benchmark result exceeding threshold 1.08.
| Benchmark suite | Current: b50b226 | Previous: 576d547 | Ratio |
|---|---|---|---|
run cpu |
31.902 s |
29.144 s |
1.09 |
run cpu (user) |
24.498 s |
21.535 s |
1.14 |
disk read |
32.402 MB |
29.492 MB |
1.10 |
This comment was automatically generated by workflow using github-action-benchmark.
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #4304 +/- ##
==========================================
+ Coverage 82.28% 82.43% +0.15%
==========================================
Files 1693 1694 +1
Lines 158389 158953 +564
Branches 13235 13316 +81
==========================================
+ Hits 130326 131031 +705
+ Misses 24428 24248 -180
- Partials 3635 3674 +39
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 22 files with indirect coverage changes 🚀 New features to boost your workflow:
|
|
| # Leave a faulted robot in damping; graceful cleanup must not replace | ||
| # a latched stop with a different actuator mode. Normal shutdown keeps | ||
| # its existing motor-disable behavior. | ||
| if self._publisher is not None and self._low_cmd is not None and self._crc is not None: |
There was a problem hiding this comment.
Shutdown commands before handoff
If the connection stops before accepting a command, sport mode has not been released. stop() nevertheless publishes a motor-disable LowCmd on rt/lowcmd, sending an actuator command while the native controller is still in charge. Skip the final LowCmd when handoff has not occurred; this must be fixed before merging.
Artifacts
Mock DDS start-and-stop reproduction script
- The executed script loads the parent or PR source, calls start and stop without supplying a motor command, and records DDS writes and handoff requests.
Parent behavior with no motor command
- The parent run requested sport-mode release before publishing one 35-motor disable frame; assertions passed.
PR behavior with no motor command
- The PR run published the same disable frame with no release request and handoff still false; assertions passed.
There was a problem hiding this comment.
stop() now sends a final motor command only after controller handoff, while still closing the DDS connections in either case.
| if self._last_feedback_at is None: | ||
| return |
There was a problem hiding this comment.
If the first LowState never arrives, valid commands return without reporting a fault. The writer checks feedback freshness only after handoff, which cannot happen without an accepted command. The connection remains inactive with no fault reason, making a missing feedback stream harder to diagnose. This diagnostic issue is non-blocking.
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
Artifacts
Authored missing-feedback runtime test
- The authored script drives real G1 handler and writer methods with mocked DDS feedback and time, and contains both comparison commands.
- The executed candidate handler received five commands over 0.8 seconds without feedback and reported no fault, confirming the silent stall.
In-memory guard comparison with no first LowState
- The same executed sequence with an in-memory guard change reported robot feedback timeout, showing the fault can be surfaced before handoff.
There was a problem hiding this comment.
Commands received before the first feedback frame now produce a warning, and command_stream_status() exposes feedback_received, without taking control or latching a startup fault.
Comments Outside DiffThese findings sit on lines the diff does not cover, so they could not be posted inline. Each one leaves this list once its file changes.
|
There was a problem hiding this comment.
go2 replay realtime (arm64)
Details
| Benchmark suite | Current: f1c5558 | Previous: 0ea05f6 | Ratio |
|---|---|---|---|
peak memory |
1823.395 MB |
1699.445 MB |
1.07 |
peak threads |
359 threads |
357 threads |
1.01 |
network (transport) |
2731 MB |
2725.914 MB |
1.00 |
disk write |
1.477 MB |
1.469 MB |
1.01 |
instructions |
137.539 G |
136.571 G |
1.01 |
This comment was automatically generated by workflow using github-action-benchmark.
What is this feature?
Keep G1 motor delivery independent of policy computation. An independent 500 Hz DDS publisher refreshes motor targets, checks feedback and configured command timeouts, and latches damping on control faults. Typed Zenoh subscriptions can retain only the latest frame to avoid accumulating stale motor commands.
MuJoCo waits for a complete PD command before advancing physics, can attach the G1 robot and its meshes to scene packages, and uses state-only native viewer synchronization to preserve physics timing with large scenes. Shared G1 motor fault checks live in
dimos/robot/unitree/g1/control_safety.py. The driver acceptscontroller_fault: In[String], not a policy-specific fault port.Layer 1 of the SONIC stack: #4304 -> #4305 -> #3557. This layer contains hardware, transport and simulation changes and their tests: 12 files, +782/-56. SONIC's policy lifecycle belongs to the standalone module in #3557; this layer does not change ControlCoordinator or the whole-body transport adapter.
Why do we need this?
SONIC needs fresh motor commands and simulation timing that keeps up with the policy. Keeping command delivery and simulation support separate makes their effect on existing robots independently reviewable.
How to Test
At
5142a49ba, all 23 motor/fault tests pass, including controller-neutral fault reasons and latched damping. Targeted mypy and commit hooks pass. Earlier evidence at the preceding checkpoint comprised 60 focused checks. The hardware checks use fake IO; physical-robot watchdog timing has not been validated by these tests.Which issue(s) does this PR close?
Part of #3557; no separate issue is closed.
Checklist
Stack update (2026-10-22)
Review and merge in order:
Controller app companion: jeff-hykin/dim-controller#1, separate repository.
Main at
42ca50dfefis merged through the original three branches without rewriting history. No sim2 or unmerged ControlCoordinator dependency was introduced. The native Pico/XRoboToolkit workaround is excluded.Previous checkpoint, before the Mac CPU fix: 224 focused Python checks passed (SONIC/WebXR/movement, gateway/G1 safety/clocks/sim adapter, composition and registry); one hardware-specific check was skipped. Targeted mypy and commit hooks passed. The companion UI passed 290 tests and production-bundle desktop/mobile browser checks using mocked gateway replies.
Mac CPU simulation is now supported and verified with the actual SONIC models in MuJoCo (walking, stopping and staying upright). Hardware still requires CUDA. Enterprise-Pico tracking and physical-robot acceptance remain pending; no robot deployment or actuation was performed.