feat(imitation): add profile-driven dual-arm collection - #3942
Conversation
737a8ec to
40001bb
Compare
❌ 63 Tests Failed:
View the top 3 failed test(s) by shortest run time
To view more test analytics, go to the Test Analytics Dashboard |
Generate concrete recorder and rollout ports from typed policy I/O profiles while preserving Blueprint autoconnect. Move LeRobot onto a shared safety runtime and add Dual OpenYAM two-camera collection plus three-camera Amazon ABC-DiT rollout in an isolated locked environment. Tests: 147 affected host tests; 11 isolated LeRobot tests; 3 isolated ABC tests; strict mypy; pre-commit; blueprint registry; wheel and sdist builds.
40001bb to
fd57995
Compare
| ) | ||
| from dimos.msgs.imitation_msgs.EpisodeStatus import EpisodeStatus | ||
| from dimos.porcelain.dimos import Dimos | ||
| from dimos.robot.manipulators.openyam.collection import OPENYAM_QUEST_COLLECTION |
There was a problem hiding this comment.
specific config appearing in general cli command file is a scope pollution, meaning that some design is wrong in implementation
| raise ValueError(f"unknown imitation {kind} {name!r}; choose one of: {choices}") from exc | ||
|
|
||
|
|
||
| def get_collection_workflow(name: str) -> CollectionWorkflow: |
There was a problem hiding this comment.
what is this weird helper function what is _get why is this needed...
| help="Repeat for every profile camera as STREAM=DEVICE", | ||
| ), | ||
| left_can_port: str | None = typer.Option(None, "--left-can-port"), | ||
| right_can_port: str | None = typer.Option(None, "--right-can-port"), |
There was a problem hiding this comment.
then these connection profile are also kind of static assumption.... I guess it's generally kind of hard to define a clean enough cli interface but it's worth thinking definitely
| coordinator_joint_state: In[JointState] | ||
| applied_joint_position_command: In[JointState] | ||
| status: In[EpisodeStatus] | ||
| def collection_recorder( |
There was a problem hiding this comment.
wtf how is this even python code.... why would the class factory be this awkward...
There was a problem hiding this comment.
can we make the implementation cleaner
| quality: QualityConfig = QualityConfig() | ||
|
|
||
| @model_validator(mode="after") | ||
| def validate_features(self) -> CollectionProfile: |
There was a problem hiding this comment.
why not put these validation logic in field validator
There was a problem hiding this comment.
bad naming for a helper function
Contribution path
Problem
Solution
CollectionProfilefor both typed recording inputs and dataset features.API shape
The public models, with validation and defaults omitted:
observation.images.overhead.streamnames the DimOS input;message_typesupplies its concrete Python type.fieldselects the message field.namesspecifies image axes or ordered joint names for joint vectors.The recorder factory declares typed
In[T]ports and adds the reservedstatus: In[EpisodeStatus]input:A robot-specific builder supplies the complete collection stack. The same profile configures dataset preparation:
To add an overhead camera, include this feature in a custom profile's
observationsand add"overhead_image": "/dev/video4"to the builder'scamerasmapping:How to Test
dimos imitation collect dual-openyam-quest --task "fold the towel" --left-can-port follower_l --right-can-port follower_r --camera left_wrist_image=/dev/video0 --camera right_wrist_image=/dev/video2AI assistance
Checklist