Repository navigation
Ship EL05 motor firmware in firmware/; English-only source - #28
Conversation
…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
left a comment
There was a problem hiding this comment.
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.
Summary
Two commits:
feat(firmware): ship EL05 motor firmware in
firmware/, pick it by recorded modelfirmware/EL05_1.0.5.0.4.binadded and listed under a newmotorssection offirmware/manifest.json(CRC320x845a0474).motor_ota_update.pyimage 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.firmware/. Naming an image explicitly works as before.python/tests/test_firmware_manifest_motors.py; docs (firmware/README.md,docs/MOTOR_OTA*.md,docs/EXAMPLES.md) and CHANGELOG updated.refactor: translate all Chinese in source code to English
cpp/,python/, examples and tests. No logic changes.test_power_cycle_warnings_pty:"below 1.2.11"). Bilingual messages infollower_gripper.cppkeep one full English version. Example table headers use short English labels at the same widths.Test plan
ruff check/ruff format --checkclean🤖 Generated with Claude Code