Skip to content

feat(manipulation): UFactory Lite 6 support - #4053

Open
leshy wants to merge 1 commit into
mainfrom
ivan/feat/lite6
Open

feat(manipulation): UFactory Lite 6 support#4053
leshy wants to merge 1 commit into
mainfrom
ivan/feat/lite6

Conversation

@leshy

@leshy leshy commented Sep 10, 2026

Copy link
Copy Markdown
Member

The Lite 6 speaks the xArm SDK

New blueprints: coordinator-lite6, lite6-planner-coordinator, keyboard-teleop-lite6. Address comes from --lite6-ip

The Lite 6 speaks the xArm SDK, so it rides the existing XArmAdapter — the
adapter now detects it on connect (axis 6 + device_type 9) and drives its
gripper over tool GPIO, which is open/close with no position feedback, so
reads echo the last command. Model config selects robot_type=lite in the
xacro (no xArm gripper collision pairs, they don't exist on this arm).

Blueprints: coordinator-lite6, lite6-planner-coordinator,
keyboard-teleop-lite6. Address comes from --lite6-ip.

Review: mypy + pytest-fast green.
Test plan: unit tests cover Lite 6 detection, the GPIO gripper path and the
lite model config; ran keyboard-teleop-lite6 against the arm at 10.55.1.40.
@codecov

codecov Bot commented Sep 10, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 98.43750% with 1 line in your changes missing coverage. Please review.
✅ All tests successful. No failed tests found.

Files with missing lines Patch % Lines
dimos/hardware/manipulators/xarm/adapter.py 93.75% 0 Missing and 1 partial ⚠️
@@           Coverage Diff           @@
##             main    #4053   +/-   ##
=======================================
  Coverage   78.22%   78.22%           
=======================================
  Files        1431     1428    -3     
  Lines      135204   135141   -63     
  Branches    11711    11712    +1     
=======================================
- Hits       105762   105713   -49     
+ Misses      26167    26105   -62     
- Partials     3275     3323   +48     
Components Coverage Δ
Tests 94.72% <100.00%> (+0.06%) ⬆️
Flag Coverage Δ
OS-ubuntu-24.04-arm 74.54% <89.06%> (+<0.01%) ⬆️
OS-ubuntu-latest 75.11% <89.06%> (+<0.01%) ⬆️
Py-3.10 75.10% <89.06%> (+<0.01%) ⬆️
Py-3.11 75.10% <89.06%> (+<0.01%) ⬆️
Py-3.12 75.10% <89.06%> (+<0.01%) ⬆️
Py-3.13 75.10% <89.06%> (+<0.01%) ⬆️
Py-3.14 74.54% <89.06%> (-0.56%) ⬇️
Py-3.14t ?
SelfHosted-Large 30.77% <43.75%> (-0.03%) ⬇️
SelfHosted-Linux 35.58% <56.25%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
dimos/core/global_config.py 88.52% <100.00%> (+0.09%) ⬆️
dimos/hardware/manipulators/xarm/test_adapter.py 100.00% <100.00%> (ø)
dimos/robot/all_blueprints.py 100.00% <ø> (ø)
dimos/robot/manipulators/xarm/blueprints/basic.py 100.00% <100.00%> (ø)
dimos/robot/manipulators/xarm/blueprints/teleop.py 100.00% <100.00%> (ø)
dimos/robot/manipulators/xarm/config.py 93.18% <100.00%> (+0.49%) ⬆️
dimos/robot/manipulators/xarm/test_model_config.py 100.00% <100.00%> (ø)
dimos/hardware/manipulators/xarm/adapter.py 52.04% <93.75%> (+3.36%) ⬆️

... and 8 files with indirect coverage changes

🚀 New features to boost your workflow:
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@leshy
leshy marked this pull request as ready for review September 10, 2026 08:50
@greptile-apps

greptile-apps Bot commented Sep 10, 2026

Copy link
Copy Markdown
Contributor

RetriggerConfidence Score: 4/5

Not safe to merge until the Lite 6 gripper command cache is reset across reconnects.

Findings

  1. P1 Reset Lite 6 cache

Summary

  • This PR adds UFACTORY Lite 6 support through the existing xArm integration, including configuration, blueprints, robot-description selection, and gripper support. One reconnect defect remains: a newly connected Lite 6 controller does not receive the first gripper command when it matches the command sent before reconnecting.

Reviews (1) · Last reviewed commit: "feat(manipulation): UFactory Lite 6 supp..."

Comment on lines +445 to +446
if target == self._lite6_gripper and self._lite6_gripper_sent:
return True # tool GPIO write per tick spams the controller; send transitions only

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Reset Lite 6 cache

After a Lite 6 gripper command succeeds, disconnecting and reconnecting creates a new controller but retains the previous command as sent. When the first command to the new controller has the same target, this branch returns success without issuing its GPIO command, so the physical gripper can remain in its prior or unknown state. Reset the sent-command state during disconnect or after connecting.

Knowledge Base Used: Hardware adapters and device interfaces

Artifacts

Evidence from the check

  • The authored pytest installs a mocked xArm SDK, issues the command-disconnect-reconnect-command sequence, and checks both current and reset-flag behavior, proving the controller-local delivery difference.

Command output from the check

  • Executed focused pytest against the unchanged adapter and recorded one open call on the original controller and zero on the newly connected controller, confirming the defect.

Command output from the check

  • Executed the same sequence with only a test-local disconnect flag reset and recorded one open call on each controller, demonstrating the required lifecycle reset.

View artifacts

T-Rex Ran code and verified through T-Rex

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant