Trossen WidowX AI and SO-ARM101 support - #7
Merged
Conversation
- build_deps.sh gains a pinned libtrossen_arm section (v1.10.0, prebuilt static lib + headers): the iNerve controller rejects a driver whose major.minor doesn't match its firmware, so the SDK ref is pinned and verified like the other native deps. - Per-dep skip: an existing install artifact at the pinned ref means the dep is done, so re-runs are idempotent instead of rebuilding Pinocchio from scratch every time. - CMake learns the trossen prefix; pyproject adds trossen-arm==1.10.0 (Python-side discovery/zeroing/IP provisioning, pinned to the same SDK release) and pyserial>=3.5 (USB-serial bus-servo sessions). No consumer of the new deps yet; the build is unchanged until the driver stacks land. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Two new connection forms alongside SocketCAN: - EthernetConnection: a whole-arm Ethernet controller (e.g. Trossen iNerve) at a fixed IPv4 address. - SerialConnection: a USB-serial bus-servo chain (e.g. SO-ARM101 FeeTech) at a /dev tty path. connection_for_interface() dispatches the interface part of a runtime bus spec onto the right type -- the three forms never overlap (IPv4 literal -> Ethernet, /dev path -> serial, otherwise SocketCAN) -- so runtime configs can drive all bus families through one entry point. ArmConfig.catalog_baudrate() surfaces the model catalog's bus baud rate (required for serial buses). Model-catalog entries for the new arms land with their driver stacks. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… drivers - buses.py grows ethernet (Trossen iNerve reachability/session) and USB-serial (pyserial) session types beside SocketCAN, with the same check/open/receive surface the zeroing tools drive. - New per-family drivers: ft_serial (FeeTech SMS/STS protocol -- ping/scan/register read/write/checksum, EEPROM-lock-wrapped calibrate-middle set_zero, baudrate get/set) and trossen_eth (controller discovery, reachability probe, whole-arm EEPROM zeroing, IP provisioning and host-subnet helpers). - The registry gains a WHOLE_ARM_ZERO contract: controller-managed arms zero in one whole-arm operation instead of per-servo; the existing CAN/serial families declare False. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New TROSSEN_ETHERNET driver stack for whole-arm-controller hardware:
- pi_trossen_shim: isolation .so around the prebuilt libtrossen_arm.a.
The vendor archive statically bundles its own pinocchio/urdfdom/
tinyxml2; linking it into the node directly interposes those symbols
with the node's shared pinocchio and SIGSEGVs in ModelTpl::addJoint
during configure. The archive links into a dedicated shared library
with every archive symbol hidden (--exclude-libs,ALL), so only the
shim API is exported.
- DriverController: vendor-neutral whole-arm-controller Driver base
with a stall watchdog -- vendor stacks keep streaming the last
command from a driver-internal daemon even when the host loop hangs,
so a watchdog thread idles the arm after 1 s of driver silence.
- DriverTrossen: the iNerve Ethernet driver (leader/follower mass
profiles, clear_error recovery, configure timeout); ServoController /
DeviceEffectorController map controller joints onto the existing
device model ('controller' arm/effector types).
- Trossen_wai_ctrl + E_Trossen_ctrl model assets. The gripper
protective-stop limit is +-120 (gripper effort is Newtons, not Nm;
firm ~75 N grasps tripped a +-30 threshold).
- Python: EthernetConnection reachability validation and the controller
IP as the node's --control_port; get_field_value_optional() silences
missing-optional-field warnings shared by the new stacks.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
New FEETECH driver stack for USB-serial bus-servo arms:
- DriverSerial: protocol-neutral serial bus driver (a future Dynamixel
port slots in beside it); DriverFt speaks the FeeTech SMS/STS
protocol; ServoFt maps STS3215 registers (position/velocity/load,
torque enable, profile acceleration via prof_accel).
- DeviceArmNello / DeviceEffectorNello: the hobby bus-servo device
types ('nello' arm/effector); the effector toggles gripper torque
through the new Servo::enable_torque() virtual, which fast-fails on
families without a torque-enable register.
- Baud plumbing end to end: --baud_rate (default 3,000,000 bps) beside
the existing node options, start(cla.baud_rate), and the Python
backend passing the model catalog's declared baud with the serial
device path.
- SO101 + E_SO101 model assets (5-DOF; the catalog's only non-6-DOF
arm) and a dedicated movements-test trajectory CSV.
- SerialConnection device-existence validation client-side. Inference
configs are not included -- this lands the hardware bring-up path.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
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.
Ports the Trossen and SO-ARM101 hardware families onto main in five independently buildable commits:
Preserves all main-only fixes (parent-liveness monitor, lock hygiene, SIL quarantine); the new-feature hunks were applied around them.
🤖 Generated with Claude Code