Repository navigation
feat(teleop): generic Feetech leader teleop module and coordinator port - #5177
Draft
KrishnaH96 wants to merge 5 commits into
Draft
KrishnaH96 wants to merge 5 commits into
KrishnaH96 wants to merge 5 commits into
Conversation
Add dimos/teleop/leader: a robot-agnostic leader teleop module whose motor-to-joint mapping is config (SideMapping per side), a Feetech reader with per-side calibration under STATE_DIR/teleop/leader, a mock reader for --simulation, and LeaderCoordinator plus leader_task/leader_gripper_tasks that bind the leader's targets to their own trajectory task at priority 20. Mount the calibrate/joint-tui/setup-motor-id commands under dimos hardware feetech-leader and add the leader-teleop extra for the SDK.
Contributor
There was a problem hiding this comment.
go2 replay realtime (arm64)
Details
| Benchmark suite | Current: 7969c63 | Previous: 14c62ab | Ratio |
|---|---|---|---|
peak memory |
1768.02 MB |
1762.355 MB |
1.00 |
peak threads |
374 threads |
385 threads |
0.97 |
network (transport) |
2728.406 MB |
2731.013 MB |
1.00 |
disk write |
1.867 MB |
1.605 MB |
1.16 |
instructions |
137.172 G |
138.791 G |
0.99 |
This comment was automatically generated by workflow using github-action-benchmark.
…r tasks Calibrate records a gripper trigger servo at the ID after the arm joints when one answers, and the joint TUI reads whatever motors the calibration names. leader_gripper_tasks now takes the robot's DamiaoGripper list so each task carries the jaw's open_at instead of the gripper task default.
Blueprint parsing validates every module config before the command line supplies the leader ports, so the side check only covers sides that are already selected; sides() still refuses to connect with none.
A coordinator has one trajectory task and addresses it by name, so a second instance for the leader is refused at start. leader_task now returns the joint_trajectory task bound to the leader's port.
Codecov Report❌ Patch coverage is @@ Coverage Diff @@
## main #5177 +/- ##
==========================================
+ Coverage 83.73% 83.77% +0.04%
==========================================
Files 1864 1884 +20
Lines 181729 183104 +1375
Branches 14967 15077 +110
==========================================
+ Hits 152168 153400 +1232
- Misses 25583 25687 +104
- Partials 3978 4017 +39
Flags with carried forward coverage won't be shown. Click here to find out more.
... and 4 files with indirect coverage changes 🚀 New features to boost your workflow:
|
Sharing a Python process with cameras, Viser and the recorder cost the 100 Hz tick loop a quarter of its ticks on a Jetson, so the arm moved in steps. With its own worker the coordinator publishes at a clean 100 Hz.
This was referenced Nov 11, 2026
This branch has not been deployed
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.
Why
Leader-arm teleop (Feetech leaders driving a Damiao follower) exists only as the OpenArm Mini module on #4326, and a second copy was being written for dual OpenYAM. DIM-129 asks for one module where the robot is config. This PR is that shared module. OpenArm Mini and dual OpenYAM follow as two stacked PRs that add only a mapping table and a blueprint each.
What
New package
dimos/teleop/leader/:mapping.py:SideMappingper side =JointMapping(motor, joint, lower, upper, scale, offset)list + optionalGripperMapping(motor, travel_radians). Target isscale * reading + offset, clamped.module.py:LeaderTeleopModulereads each enabled side every 20 ms and publishesleader_joint_command(JointState, framedimos/guarded-joint) andleft_gripper_command/right_gripper_command(Float32, 1 = open). Jump guard, optional low-pass,reader="mock"for--simulation.coordinator.py:LeaderCoordinator(DamiaoCoordinator)adds theleader_joint_commandinput.leader_task()is atrajectorytask at priority 20 bound to that port withstream_bind, so the leader outranks a policy on the joints it publishes and releases them 0.4 s after it stops.leader_gripper_tasks()gives one gripper task per side.feetech.py,calibration.py: serial reader with multi-turn wrap, per-side calibration JSON underSTATE_DIR/teleop/leader/<side>/(same format as the OpenArm Mini files), mock reader.cli/:dimos hardware feetech-leader {calibrate, joint-tui, setup-motor-id}, moved from the OpenArm Mini branch and made robot-agnostic.Wiring:
leader-teleopextra (ftservo-python-sdk), registry entries, README note.dimos/controlis untouched.Not in this PR
How to test
With a leader arm on a serial port:
Checks
pytest dimos/teleop/leader dimos/cli/hardware dimos/robot/test_all_blueprints_generation.py: 102 passedpytest dimos/codebase_checks: 162 passedChecklist