Without a calibration
An uncalibrated Axol runs on the coded defaults: the joint gains inAxolConfig, and the friction measured on our in-house Axol as a fallback for every joint. That beats no friction model, but gearboxes differ from unit to unit. Calibrate before relying on slow, precise motion.
Calibrate
With both arms clear of obstacles, the E-Stop in reach, and Axol otherwise idle, run:- Friction, in the realtime core’s own law: sliding friction that grows with the gravity load, viscous drag, an offset, and the low-speed Stribeck excess (cancelled on
shoulder_1,shoulder_2, andelbow). - Gravity: the link’s centre of mass.
tune.factory for the flags: one arm, raw sweep capture, and the older quick profile.
The result applies on this machine at once (~/.almond/calibration.json). When the upload key is configured, it is also uploaded under Axol’s serial number, which stays with the arms across compute-host swaps.
calibration.push. Pass --dry-run first to see what goes up.
Every machine that drives Axol
A machine picks up its Axol’s calibration automatically at the end ofcan.setup, or with axol calibration.pull at any time. No credentials are needed to pull.
Configuration values layer in this order: coded defaults, then the uploaded factory calibration, then this machine’s local calibration file.
Check the result
Replay the built-in slow-motion reference and read the wrist IMU’s shake score. Inslow_osc the arm is bent up in front while shoulder_1 sweeps slowly back and forth. It is generated in code, so it is the same on every Axol.
wrist IMU (right): … vertical X mm = 1-3 Hz … + 3-15 Hz … line. Compare it against the same command run before calibrating, in the same session, since the score drifts 10 to 20% over a day. The numbers above were measured on an earlier recorded version of slow_osc, so treat them as an order of magnitude rather than a target. The wrist IMU only measures here. Nothing feeds back from it.
To calibrate one joint at a time:
tune.friction --profile slow fits a single joint’s friction (--fit-csv re-fits a saved sweep), and tune.gravity fits its gravity. Push the result with calibration.push.