Roadmap
Control page and website (handed over 2026-10-04)
Section titled “Control page and website (handed over 2026-10-04)”- Confirm moving the real arm from the Control page (2026-10-05: GitHub Pages in Chrome on a laptop,
mycobot.local). - Away from home: a TCP forward on the Pi (Tailscale :8282 → ATOM :80), so the page reaches the ATOM over Tailscale.
- Browser flasher with Improv WiFi setup and a Search button (Setup page, firmware 4.3.0). Tested on the real ATOM on 2026-10-05: install with Erase, WiFi set up over USB, Search found 4.3.0 at
mycobot.local, and the Control page moved the arm. - Test the CI firmware build (it runs on the first push to GitHub) and an update over 4.3.0 that keeps the WiFi network.
- An address sweep when
mycobot.localdoes not resolve. - End-effector jog (the page has joint jog only).
- Live mode with TRACK (firmware 4.4): used on the real arm on 2026-10-05, up to 90 °/s; a blocked joint stops the arm with a following error. Still to check: the joints settle on the goal without hunting.
- Test Chrome’s local-network prompt for real users on GitHub Pages (2026-10-05: works from the public page; the laptop webcam works too).
- The page assumes the real robot until the first status-log line arrives (the simulator’s starts with “atom-sim”).
Tracking accuracy
Section titled “Tracking accuracy”- More ILC iterations: does the error continue to go down, or does it stop near 1 mm? Try ILC on a faster circle.
- Feedforward through the servo model instead of a pure time shift: command
q(t+τ) + T·q̇(t+τ)with the fitted τ and T per joint. - Step and chirp tests per joint: delay, bandwidth and overshoot in position mode.
- Repeat with other PID gains (registers 21–23), acceleration (41) and speed caps (46–47). Can the ~120 ms lag of J1–J3 be smaller?
- A friction model (Coulomb, viscous, and the sticking after reversals).
Vibration
Section titled “Vibration”- Set the servo acceleration register to 50 (as the stock firmware does) instead of 0. Compare the IMU vibration.
- Use the IMU (vibration, jerk) as a cost in planning or learning.
ATOM firmware
Section titled “ATOM firmware”- A watchdog for streamed commands, before PWM mode (plans that are stored onboard do not need the laptop during the run).
- Higher loop rates (600 Hz or more, reads of positions only) if a controller needs them.
- Streaming mode: setpoints from the laptop in real time, for replanning and MPC.
- Optional: a subset of the stock protocol (
FE FEframes), so that myStudio and pymycobot basics work.
- An allocation-free laptop loop (7.3 KB per cycle now, which causes 30–80 ms GC stalls). Preallocate buffers, use fixed-size arrays, and optionally
GC.enable(false)during a run. See Koolen & Deits, ICRA 2019. - Use the SYNC WRITE gap for work instead of a busy wait. Check if 0.5 ms is enough.
- Live MeshCat view from the telemetry.
- Connect TORA.jl to the players.
State estimation
Section titled “State estimation”- Better joint velocity estimates. The servo speed register moves in steps of 50 steps/s (≈ 4.4°/s), and differentiating the position at 500 Hz turns one count (0.088°) into ~44°/s of noise. Estimate the velocity with a filter (e.g. a Kalman filter) that combines position, servo speed, the command and the servo model (
src/servo_model.jl), and the IMU gyro for the wrist joints. Needed for MPC and learning.
Accuracy and calibration
Section titled “Accuracy and calibration”See IMU calibration and encoder errors (2026-10-06).
- Check the pitch zero offsets with the IMU (2026-10-06: δ2 + δ3 + δ4 = 0.2–0.3°, no correction needed).
- One robot description for the firmware, the Control page, the simulator and Julia (Robot description).
- J5 encoder correction in the Julia package (2026-10-06): 3.7° → 0.18° peak to peak over ±148°.
- Store the calibration on each ATOM (NVS) and apply it in the firmware and the Control page. The public firmware and the GitHub Pages site serve every user’s arm, so the values cannot be built in.
- J1 (0.56° peak to peak) and J4 (1.0°): add their corrections if a task needs them. J4’s axis is always horizontal, so its play is in every J4 sweep: separate the play from the encoder error first.
- Gravity model for the play of J2–J4 and the bending of J2: identify the masses and centres of mass (
inertials.yaml) from the IMU and the encoders, not from the load register. Then predict which side of the play each link rests on. - J2 and J3 oscillate at rest in some poses with the integral gains (9 of 60 holds, 0.3–0.5°). Find gains or a deadband that stop it. Check whether this is the hunting in Live mode.
- J4 and J5 settle up to 1° and 2.4° from their goal (no integral action). Try integral action on J4–J5.
- Calibration file per robot: the IMU mounting and accelerometer calibration, encoder corrections, play.
- Separate δ2, δ3 and δ4 with a second IMU (a phone) on link 2 or 3, if a tool needs it.
- Measure the flange accuracy with an external reference (pen on paper, dial gauge, a cone plate milled on the CNC).
Beyond position control
Section titled “Beyond position control”- PWM mode (mode 2) on J1 (no gravity load), with a watchdog. It is the closest mode to torque control.
- Find what the load register measures, with a known load. The data suggests PWM duty.
- Real inertial data for the URDF (weigh the links, or identify them). Elephant’s URDFs have placeholders only (checked 2026-10-06). See Gravity model above.
Hardware
Section titled “Hardware”- Measure the logic level of base pins 13/14 and the
IORpin. - Check if the base
TRVGport carries the same serial line as pins 13/14. - An emergency stop on the 12 V line.
- Connect the gripper. Check the side port and the cable, then PING ID 7 and read its registers.
- Add the gripper to the Julia model (mass at the flange, and the
mimicfinger joints).
Loose ends
Section titled “Loose ends”- Why did the stock ATOM ignore
send_anglebefore it froze? - Is a mode change (EEPROM area, lock = 1) lost at power-off?
- Identify the servo models (label, Feetech’s FD software, or Feetech).
- Read the factory registers 80–86 (2026-10-04, register map).
- Find what acceleration the servos use when register 41 is 0 (register 86 differs per servo type: 1 on J1–J3, 4–5 on J4–J6). Step tests with 41 = 0, 50 and 254.
- Record the stock firmware’s bus traffic at power-up and during
send_angles(registers 19 and 41, gripper ID 7). This is easier than reverse engineering the binary. - Post the findings on elephantrobotics/myCobot#53. A draft is in
~/myCobot/issue-53-reply-draft.md.