XM10 Extension Module SDK v2.6.0¶
Release date: 2026-08-20 | Boards: Rev 1.1 · Rev 2.0 | Bundled KIT H10 firmware: v2.4.0
At a glance¶
A release focused on safe behavior.
- Turning control off actually turns it off. Returning to
MONITORnow ramps torque to zero and confirms zero before output stops. - The board restarts itself if the firmware hangs. A hardware watchdog (about 8 seconds) was added.
forwardVelocityis fixed. It was reporting 60× the real value.- Safety handling was reworked in 15 examples. Example numbers and what they teach are unchanged.
- KIT H10 firmware moves to v2.4.0.
For Rev 1.1 this is the first update since v2.5.0 (v2.5.1 was Rev 2.0 only).
Three things to check¶
1. Returning to MONITOR now takes 0.3–0.6 s¶
Previously, XM_SetControlMode(XM_CTRL_MONITOR) made XM10 stop transmitting on the spot. Because the H10 holds the last command it received when new ones stop arriving, torque could still be applied after you thought you had switched it off.
Now torque is ramped smoothly to zero → zero is sent several times over → vectors are released → output stops. During that window (typically 0.3–0.6 s) your torque commands are ignored.
- To stop immediately, call
XM_EmergencyDisengage()— it goes straight to zero with no ramp. - To read the state actually in effect, use
XM_GetAppliedControlMode()(CONTROL/MONITOR/TRANSITION). - In
MONITOR, no control command of any kind leaves the board — neither torque nor vectors.
2. forwardVelocity becomes 60× smaller (this is the correct value)¶
XM.status.h10.forwardVelocity was reporting 60× the real value. Walking at 1 m/s now reads about 1.0.
- If you only displayed it — nothing to do.
- If you fed it into control — you may have compensated with a very small gain. Re-tune it.
- Previously recorded data holds the 60× value. Do not mix it with new data.
- The stopped-detection in Ex.22 · 23 · 24 · 26 now works. The
forwardVelocity < 0.1condition was effectively never true before, so those examples always behaved as if walking.
3. Staying inside one call for over 8 seconds resets the board¶
The watchdog is refreshed on the 1 kHz cycle that runs Control_Loop. So if Control_Setup or Control_Loop takes more than 8 seconds, the watchdog restarts the board. Split long work into steps.
Tasks created with XM_Task_CreateOneShot() / XM_Task_CreatePeriodic() run at a lower priority than Control_Loop, so this does not apply to them. Move heavy computation there (see Ex.36).
⚠️ A watchdog is not an emergency stop. If your code keeps running while commanding the wrong torque, the watchdog does not fire. In wearer trials, a person stopping the suit is the primary safety net — see Wearable Safety.
New APIs¶
| API | Purpose |
|---|---|
XM_EmergencyDisengage() |
Zero torque immediately, no ramp |
XM_GetAppliedControlMode() |
Read the control mode actually in effect |
xm_api_safety.h |
Safe-torque helpers — XM_SafeTorque_*, XM_SafeAssistLevel(), XM_SafeIsFresh() |
xm_api_safety.h is already pulled in by xm_api.h, so no extra #include is needed.
One name changed¶
The mode covers P/I vectors as well as torque, so XM_CTRL_TORQUE became XM_CTRL_CONTROL. The old name remains as an alias for the same value, so existing code builds unchanged. Examples and docs now use the new name — use XM_CTRL_CONTROL in new code.
static XmSafeTorque_t s_safe;
void Control_Setup(void) {
/* limit 2.5 Nm | at least 500 ms from 0 to the limit | 500 ms soft-start */
XM_SafeTorque_Init(&s_safe, 2.5f, 500U, XM_SAFETY_DEFAULT_RAMP_MS);
}
void Control_Loop(void) {
/* reject bad values -> clamp -> soft-start -> slew limit */
float t = XM_SafeTorque_Step(&s_safe, my_desired_torque);
XM_SetAssistTorqueRH(t);
}
When you switch control off and back on, call XM_SafeTorque_Reset(&s_safe) to restart the soft-start. Call XM_SafeTorque_Step() exactly once per tick in Control_Loop.
Examples¶
| What | Which examples |
|---|---|
| Soft-start and slew limiting so nothing jumps when assist turns on | Ex.14 · 21 · 27 · 30 · 33 |
| Removed the jolt caused by a step change in the setpoint | Ex.14 |
| Broken stop-switch wire reads as stop · output clamps · stop ramps · stale-sensor timeouts | Ex.06 · 13 · 17 · 26 · 32 |
| Blocks entry into control before homing completes | Ex.11 · 12 · 15 · 35 · 36 |
Running them without wearing the suit¶
Ex.15 · 21 · 30 · 33 are tuned for a person wearing the suit. On the bench, with the leg hanging free, the much lower inertia makes them oscillate or diverge. The example is not broken.
Each of those files carries bench parameters at the top. Substitute the mass and center-of-mass of the link alone (0.184 kg / 0.1264 m) and they behave predictably.
Downloads¶
| File | Board |
|---|---|
| Rev2.0.zip | XM10 Rev 2.0 (has an RJ45 Ethernet port) |
| Rev1.1.zip | XM10 Rev 1.1 (no such port) |
Files attached alongside¶
| File | Purpose | Changed? |
|---|---|---|
AGR_Bootloader.bin |
XM10 bootloader (installed over SWD) | Updated — recovers on its own from a corrupted config area |
SUIT_H10_Binary_20260820.zip |
KIT H10 (CM · MD · ESP32) firmware | Updated — CM · MD v2.4.0 (ESP32 unchanged) |
SUIT_ContentsFiles_20260820.zip |
KIT H10 content files (motions, sounds) | Same content (filename now carries the date) |
- Bootloader: v2.6.0 firmware runs fine on the older one. This guards against a board that will not boot at all, so it is recommended, not required. → Bootloader Upload
- KIT H10 firmware: update it from a USB stick. → KIT H10 Firmware
The final build step uses Python. If you have not installed it, follow Software Setup to install Python 3.10+ (adding it to PATH is required).
Compatibility¶
| Item | Impact |
|---|---|
Your Control_Setup / Control_Loop |
Just rebuild. Nothing was removed; the older name XM_CTRL_TORQUE still works |
XM_SetControlMode(XM_CTRL_MONITOR) |
Blocks after 0.3–0.6 s instead of instantly |
MONITOR mode |
Torque and vectors are both fully blocked |
XM.status.h10.forwardVelocity |
Value is 60× smaller (this is correct) |
Control_Setup / Control_Loop |
Over 8 seconds in one call triggers a watchdog reset |
| Total Data packet | Size and channel positions unchanged (365 B) — existing receivers keep working |
| PhAI Studio | Works as before |
| Example count | Unchanged (Rev 2.0: 45 · Rev 1.1: 42) |