Skip to content

Trossen WidowX AI and SO-ARM101 support - #7

Merged
Adnanpi merged 5 commits into
mainfrom
stability-compatibility-fixes
Jul 24, 2026
Merged

Trossen WidowX AI and SO-ARM101 support#7
Adnanpi merged 5 commits into
mainfrom
stability-compatibility-fixes

Conversation

@Adnanpi

@Adnanpi Adnanpi commented Jul 24, 2026

Copy link
Copy Markdown
Contributor

Ports the Trossen and SO-ARM101 hardware families onto main in five independently buildable commits:

  1. build: pinned libtrossen_arm v1.10.0 provisioning; idempotent build_deps.sh; trossen-arm + pyserial deps
  2. config: EthernetConnection / SerialConnection / connection_for_interface / catalog_baudrate
  3. servos: ethernet + serial bus sessions; FeeTech (SMS/STS) and Trossen (discovery/zeroing/IP-provisioning) drivers; WHOLE_ARM_ZERO registry contract
  4. native+models — Trossen WidowX AI: iNerve Ethernet driver via an isolation shim around the vendor's static lib (its bundled pinocchio SIGSEGVs if linked directly), vendor-neutral whole-arm-controller base with a stall watchdog, Trossen_wai_ctrl/E_Trossen_ctrl models (gripper protective-stop at ±120, effort is Newtons)
  5. native+models — SO-ARM101: protocol-neutral serial driver + FeeTech STS3215 stack, nello device types with a Servo::enable_torque virtual, end-to-end baud plumbing, 5-DOF SO101/E_SO101 models + movements-test CSV

Preserves all main-only fixes (parent-liveness monitor, lock hygiene, SIL quarantine); the new-feature hunks were applied around them.

🤖 Generated with Claude Code

Adnanpi and others added 5 commits July 24, 2026 13:39
- 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>
@Adnanpi
Adnanpi merged commit 9b450e7 into main Jul 24, 2026
8 checks passed
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