Repository navigation
Highlights
- Leg overload guard.
Palmimo.step()now polls leg current at up to 30 Hz and reacts before a held or blocked axis latches the servo's own Overload error and goes limp. An axis that holds|current|at or above its threshold for 3 consecutive samples trips the guard. On by default. See "Overload Guard" indoc/reference/api-reference.md. (#66) - A gripped waving arm softens and returns. On the arm channel (the raised leg of
wave/wave_both/clap, threshold 700) a trip drops the motion toIDLE, holds the three arm axes atPosition_P_Gain100 and eases them back to neutral, then restores the gain. If the gain write fails, only that arm's torque is cut. (#66) - A strained leg motion stops. On the leg channel (every other leg axis, threshold 1200) a trip drops the motion to
IDLE; gains are untouched. (#66) - Trips are readable from the API.
drain_overload_trips(),last_overload_tripandOverloadTripreport what tripped;arm_overload_current/leg_overload_currenton thePalmimoconstructor set the thresholds, and passingNonedisables a channel. (#66)
Upgrade notes
- The guard is active with the default thresholds as soon as you update: a motion that strains now ends in
IDLEinstead of running on. Code that assumed a motion always runs to completion should checkdrain_overload_trips(). - The change only adds API, so it stays in the 0.1 line; the
palmimo-sdk>=0.1.3,<0.2pin in the examples picks it up without an edit. - A driver that has no
read_telemetry(), or that does not carry every leg motor, disables the guard with one warning. The neck thermal guard now behaves the same way for a driver without the neck motors, instead of logging every 5 s. ServoDrivergainsset_torque_enabled(), used to cut one arm's torque when the soft return cannot be started.
Known issues
- A leg strained while no leg motion is running (idle, or during a neck gesture — for example a leg snagged after a wave) is only recorded in
drain_overload_trips(). Nothing is stopped or softened, and the servo's own Overload latch remains the only protection there. - A soft-returning arm is record-only on the leg channel: strain on it is recorded, but no further reaction is taken.
- The guard does not watch
wake(),sleep()orreturn_to_neutral(), which write the driver directly. wake()still steps a soft-returning arm from gain 100 to 300 before ramping.- Trips are not yet surfaced in agent tool or MCP results (#76).
- There is still no thermal protection on the legs; the guard acts on current, not temperature.
Verified on hardware (Raspberry Pi, XC330, 60 fps) with the robot held in the air at the default thresholds: no trip across forward / backward / rotate_left / rotate_right / wave / wave_both / clap / dance (5 s each), peak arm current 374 (53% of 700), peak leg current 417 (35% of 1200). Gripping the waving arm tripped at 858 on leg_6_pitch1; the soft return started and the gain was restored 1.5 s later. The 18-axis read took 7.8 ms median and 10.8 ms max; step() p99 was 9.0 ms.
What's Changed
SDK & motions
- feat(sdk): leg overload guard with soft arm return (0.1.4) by @isaka1022 in #66
Other changes
- chore(examples): require palmimo-sdk 0.1.3 by @DoskoiYuta in #73
Full Changelog: v0.1.3...v0.1.4