Skip to content

Ship EL05 motor firmware in firmware/; English-only source - #28

Merged
xensexyq merged 2 commits into
mainfrom
feat/motor-firmware-in-repo
Oct 20, 2026
Merged

xensexyq merged 2 commits into
mainfrom
feat/motor-firmware-in-repo

Conversation

@Vertax42

Copy link
Copy Markdown
Collaborator

Summary

Two commits:

  1. feat(firmware): ship EL05 motor firmware in firmware/, pick it by recorded model

    • firmware/EL05_1.0.5.0.4.bin added and listed under a new motors section of firmware/manifest.json (CRC32 0x845a0474).
    • motor_ota_update.py image argument is now optional: without one it uses the shipped image for the motor model recorded on the gripper. It refuses when only the compile-time default model is known, because RobStride's OTA accepts any model's image.
    • The shipped image is checked against the manifest CRC32; a bare image name also resolves under firmware/. Naming an image explicitly works as before.
    • No RS00 image ships yet.
    • New test python/tests/test_firmware_manifest_motors.py; docs (firmware/README.md, docs/MOTOR_OTA*.md, docs/EXAMPLES.md) and CHANGELOG updated.
  2. refactor: translate all Chinese in source code to English

    • Comments, docstrings, pybind11 docstrings and runtime text (logs, exceptions, example output, argparse help) across cpp/, python/, examples and tests. No logic changes.
    • Runtime text that tests match on changed with them (test_power_cycle_warnings_pty: "below 1.2.11"). Bilingual messages in follower_gripper.cpp keep one full English version. Example table headers use short English labels at the same widths.
    • Anything that filters logs on the old Chinese text needs updating (noted in CHANGELOG).

Test plan

  • C++: 471/471 ctest pass
  • Python: 148 passed, 2 skipped (taccap env, pybind11 from the env)
  • ruff check / ruff format --check clean
  • No CJK characters left in tracked non-Markdown files
  • Motor OTA on a real EL05 follower without an image argument

🤖 Generated with Claude Code

Vertax42 and others added 2 commits October 18, 2026 16:50
…orded model

Motor images now live next to the gripper images and are listed under a new
"motors" section of firmware/manifest.json (EL05_1.0.5.0.4.bin, CRC32
0x845a0474). motor_ota_update.py takes the image as optional: without one it
uses the shipped image for the motor model recorded on the gripper, refusing
when only the compile-time default is known (RobStride's OTA accepts any
model's image). The shipped image is checked against the manifest's CRC32,
and a bare image name also resolves under firmware/.

No RS00 image ships yet; naming an image explicitly works as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Comments, docstrings, pybind11 docstrings and runtime text (log and exception
messages, example output, argparse help) in cpp/, python/, the examples,
the tests, firmware/manifest.json and .git-blame-ignore-revs. Facts, numbers,
versions and units are kept as they were; no logic changes.

Runtime text that tests match on changed with them:
test_power_cycle_warnings_pty now looks for "below 1.2.11". Bilingual
messages in follower_gripper.cpp keep one full English version. Example table
headers use short English labels at the same widths. MOTOR_OTA-zh.md now
quotes follower_status.py's new "unreadable" output.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@xensexyq
xensexyq merged commit 29ac807 into main Oct 20, 2026
3 checks passed
@xensexyq
xensexyq deleted the feat/motor-firmware-in-repo branch October 20, 2026 02:21

@xensexyq xensexyq left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

Retrospective review and validation report

Adding the local test and physical-device acceptance results from 2026-10-20 (Asia/Shanghai) for the author. These checks were completed before merge; this comment records that evidence after merge and does not represent another flashing run.

  • Reviewed/tested head: 3b604da; original base: fd0d3a5.
  • Merge: 29ac807. Its tree matches the tested head. The isolated test source was also rechecked against all 170 tracked files in that head.

Software validation

Environment: Linux x86_64, CPython 3.12.14, GCC 14.4.0 and OpenCV 4.12.0. The native SDK was built from the isolated PR snapshot; its actual import path was checked to avoid accidentally testing the editable main checkout.

Check Observed result
Release build of the C++ core and Python bindings PASS
Full Python suite 148 passed, 2 skipped; both skips are leader-only IMU cases because no leader was connected
OTA-related tests (test_firmware_manifest_motors.py, test_motor_ota_update.py, test_ota_update_all.py) 27 passed, already included in the full-suite count
PR CI build + unit tests, lint and protocol mirror vs firmware: SUCCESS

The CI results above are the PR's recorded pre-merge checks, separate from the local test run.

Physical EL05 acceptance

Target: one right-hand EL05 follower (SN ending 0016s), MCU firmware 1.2.16. The selected image was the PR's bundled firmware/EL05_1.0.5.0.4.bin, chosen from the model recorded on the follower without supplying an image path.

Image identity: 92,584 bytes, CRC32 0x845a0474, SHA-256 fb232707a852f9144bdf4a744ee9c89d39c8d96695189f61ff1e6b8eac293f0f.

Procedure: run python python/examples/motor_ota_update.py <follower-SN> for stage 1, cycle 24 V for about 2 seconds and wait about 10 seconds, run the same command for stage 2, then cycle 24 V again and wait for homing. The test used a guarded launcher to ensure these commands loaded the PR-built native module. The operator confirmed both power cycles and final homing, with the jaws clear.

Step / acceptance check Observed result
Stage 1: persist MIT → private protocol selection PASS
Stage 2: transfer the bundled motor image PASS; 46.5 s. The log contained one initial OTA-start timeout, after which the transfer completed successfully
Live motor firmware read before/after transfer 1.0.5.0.4 → 1.0.5.0.4; version recorded in follower flash
Motion envelope Already at the motor rating; unchanged
After second power cycle MIT confirmed; EL05 model and motor-version flash records valid
Motor / latched / firmware fault codes 0 / 0 / 0
follower_status.py <follower-SN> --seconds 10 --hz 100 1,000 frames / 10.01 s = 99.9 Hz
Status freshness Firmware timestamp advanced 10,007 ms, matching 10,007 ms wall time; PASS

After merging, main was synchronized and the SDK was rebuilt/reinstalled in the existing environment. A separate import check outside the repository, without PYTHONPATH or LD_LIBRARY_PATH, returned taccap-gripper OK; version 0.4.3; the Python source and installed native-library paths were verified.

Review conclusion and limits

No confirmed blocking defects were identified in the reviewed scope. The recorded checks support bundled-image selection and the two-stage motor OTA/restart path on this EL05 follower. There are no confirmed code findings requiring inline comments in this report.

This was a same-version reflash, not an upgrade from an older motor firmware. This run did not exercise MCU OTA, RS00, Jetson hardware, interrupted-transfer recovery, or a post-upgrade commanded-motion/load test. Leader IMU acceptance remains untested in this run. Local C++ unit tests were not rerun on 2026-10-20; the separate CI result is linked above.

These results should not be generalized to those untested paths. Essential observations are included here so the report does not depend on local-only log paths.

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.

2 participants