feat(imitation): add native OpenYAM collection - #3854
Conversation
❌ 5 Tests Failed:
View the top 3 failed test(s) by shortest run time
To view more test analytics, go to the Test Analytics Dashboard |
17256b0 to
933facf
Compare
933facf to
0307ebb
Compare
13940ff to
275e358
Compare
275e358 to
31dd683
Compare
31dd683 to
2ca3643
Compare
2ca3643 to
c871ce7
Compare
Greptile SummaryThis change adds OpenYAM-native MCAP collection, records post-arbitration position commands, and adds quality validation for episode conversion. Two recorded-data integrity failures were reproduced:
The affected command recording and fill-mode validation behavior should be corrected before using this path for training-data collection. Confidence Score: 3/5Not safe to merge for OpenYAM data collection until recorded applied commands include held targets and fill mode limits stale required streams. Focused executable reproductions confirmed two independent data-integrity failures in the collection and conversion paths. Files Needing Attention: dimos/control/tick_loop.py needs complete accepted position targets published for recording; dimos/imitation/dataprep/core.py needs a bounded forward-fill policy for required streams.
What T-Rex did
|
| for commands, mode in accepted_commands.values(): | ||
| if mode not in (ControlMode.POSITION, ControlMode.SERVO_POSITION): | ||
| continue | ||
| names.extend(commands) | ||
| positions.extend(commands.values()) |
There was a problem hiding this comment.
Applied-command events omit held joint targets
A partial OpenYAM position write is expanded by the whole-body hardware interface using its previously commanded values, but this callback publishes only the partial commands dictionary. Consequently, a gripper-only or single-joint update records an action missing the other configured OpenYAM joints, and DataPrep rejects the episode with JointState is missing configured joints. Publish the complete position target that hardware accepted, including held joints.
Artifacts
Focused OpenYAM partial-command repro source
- This review-authored script performs two accepted partial OpenYAM whole-body writes, publishes the second applied command, and submits it to the configured DataPrep action validator.
Focused OpenYAM partial-command repro output
- This executed-command log shows the hardware held and wrote all seven targets while the callback published only yam_joint2, which DataPrep rejected for six missing configured joints.
| previous = bisect.bisect_right(values, target) - 1 | ||
| if quality.mode == "fill" and previous >= 0: | ||
| indices[key] = previous | ||
| max_error_s = max(max_error_s, abs(values[previous] - target)) | ||
| filled = True | ||
| continue |
There was a problem hiding this comment.
Fill mode accepts indefinitely stale required data
When a required stream stops publishing, fill mode continually selects its last causal sample without any age limit. The quality check still accepts the episode, so a dataset can contain arbitrarily long runs of stale observations or actions. Enforce a maximum forward-fill age and reject frames or episodes once the held value exceeds it.
Artifacts
Executable repro source for a stopped required stream in fill mode
- Review-authored source constructs ten anchor frames and one required-stream frame, then executes the real sampler and quality inspector to assert stale emission and acceptance.
Successful stopped-stream fill-mode reproduction output
- Captured execution output shows ten frames, nine forward fills, a nine-second stale required value, and a valid quality report, confirming the failure.
This is layer 3 of the OpenYAM learning slice in the original stack. It adds native MCAP collection, OpenYAM collection composition, dataset validation, and isolated LeRobot data preparation.
Learning slice
Validation: 52 host-side and 18 isolated-runtime tests passed.