Skip to main content
Measures one joint’s friction by sweeping it back and forth at several speeds. Gravity comes from the robot model (see Gravity compensation), so this command fits only friction and a constant offset. You can also run it from the diagnostics dashboard (axol serve). To calibrate every joint at once, use tune.factory. Friction model: τ = Fc·tanh(0.1·k·v) + Fv·v + Fo Friction differs from motor to motor, and the built-in defaults are only a starting point. Pass --save to store the fit in this computer’s calibration file, ~/.almond/calibration.json. Every operation on the robot then uses it. Values you set explicitly in the config still take priority.

Profiles

The slow profile sweeps the speeds under 8°/s twice: once where the joint carries the least load, and once where it carries the most. With --save it stores the friction fit and the stribeck_* fields. On shoulder_1, shoulder_2 and elbow, a saved slow-profile fit also switches the joint to stiffer slow-motion gains. A joint without one keeps the standard gains. The standard profile doesn’t switch them.

Sweep safety

The tool poses the other joints so the arm stays clear of the robot:
  • shoulder_2 sweeps only outboard of rest, because inboard travel swings into the base.
  • wrist_2 sweeps with the elbow raised to its midpoint, which keeps the gripper clear of the base over its full range.
  • shoulder_3 and wrist_1 sweep with shoulder_2 held 10° outboard, clear of the chest cameras.
tune.gravity uses the same poses, plus extra poses that load the test joint with gravity. The friction fit doesn’t depend on the pose, so it works in either.

Calibration gains

The calibration tools (tune.factory, tune.friction, tune.gravity, tune.breakaway) move the arm under impedance control at these fixed gains, with gravity fed forward. They never use the motors’ firmware position loops or the production gains. Every joint is held before anything moves.