Select the backend
In the control panel, open Settings → Kinematics → IK solver and choosemink (or jax to go back). The setting applies to every operation started
from the panel and is stored as kinematics.backend in
~/.almond/settings.json.
The setting fans out to the config fields that name the backend:
On the CLI or in a
--config_path file, set the same fields directly, for
example axol teleop --kinematics.backend mink. Collection sessions refuse to
start when kinematics_config.backend and cartesian_controller differ. In the
SDK, pass KinematicsConfig(backend="mink") to teleop and
AxolRobotConfig(cartesian_controller="mink") to AxolRobot.
Cartesian policies also need robot_config.action_space: "cartesian". The robot
selector also selects MuJoCo forward kinematics, Mink reset paths and the Rust
mink execution profile when commands are already in joint space.
observe_cartesian selects observation representation independently of the
action representation. The JAX solver weights (position/orientation/elbow
weights, max_joint_delta, the Mantis profile) do not apply to Mink, which
keeps its fixed policy-compatible QP profile; a nonzero elbow_weight is
ignored with a warning, and box mode runs without its elbow hints.
For example, a custom Cartesian endpoint can use this configuration:
custom_protocol selector.
For DAgger, select hold_to_intervene, record_joint_actions, the matching Mink
teleop backend, and a dataset destination. Rest poses and contact thresholds for
collection live under teleop_config.vr_teleop_config.
Policy rollout actions are recorded in the configured action space. For Mink
Cartesian actions, the recorder (run-policy and both DAgger modes) uses forward
kinematics of the dispatched joint commands; an unreachable policy target is not substituted for the resolved
command. Remote DAgger can instead retain joint training actions with
record_joint_actions: true, independently of the policy’s action space.
Execution and coordinate frames
Public Cartesian actions and observations use the current Axol world frame and gripper-link pose convention. The tracking solver internally uses the bundled model frame; the adapter converts only that boundary. Model assets, dependency versions and numerical fixtures are recorded inalmond_axol/policy/mink_ik/PROVENANCE.md.
Mink policy outputs go directly to the Rust tracker without the additional Python
joint shaper used by JAX Cartesian execution. mink tracks literal targets,
uses measured time across overruns (capped at two control periods per tick, so a
long scheduling gap cannot snap the tracker past its target) and preserves
command derivatives. It retains the realtime core’s watchdog and command
validation. Changing backend therefore
changes tracking semantics, not just solver speed.
The default policy solver profile is calibrated for 30 Hz execution. run-policy
and collect-dagger pass their configured fps to Mink’s posture speed gate;
teleop passes its configured IK frequency. SDK callers can pass
AxolRobot(config, mink_solve_hz=60) for a 60 Hz policy. This copies the supplied
MinkIKConfig and changes only its cadence; omitting the keyword preserves an
explicit config’s cadence or the 30 Hz default. The cadence is fixed when the
robot is constructed. Validate physical tracking at the deployment’s chosen
rate; configuring the correct cadence does not guarantee a solve fits its budget.
To reproduce a deployment, record the effective camera order/resizing, world
frame, control rates, request interval, rest poses, gains, gripper torque limits,
and contact thresholds. Upstream defaults are not a deployment profile; in
particular, the default request interval is five ticks and the default reset
contact threshold is 6 Nm. The example above explicitly selects ten ticks and
4 Nm. Policy-specific gain overrides remain session configuration.
Reset and parking design
Mink resets use straight tool-position paths, shortest-path orientation interpolation and smooth time scaling. A dedicated planner uses a separate MuJoCo state so planning cannot modify the tracking solver’s seed or history. It resolves and validates the complete path before returning joint waypoints to the existing guarded playback loop. The planner retains joint-posture goals as well as tool poses. Seven-joint arms can reach the same tool pose with different elbows; a successful reset must reach the configured joint posture. Parking still performs rest and then the zero joint goal, and waits for measured settling before motor release. Every session’s shutdown park (rest, then zero with Park to zero on stop) and startup move (through zero to rest) are planned by the selected backend, so with Mink they are Cartesian paths too.run-policy with
soft_park_on_quit: true additionally preserves support on interrupt/error
exits.
A straight path is not always feasible. Joint limits, modeled self-collision,
unreachable targets, excessive steps or an unreached endpoint reject the plan.
Reset planning never retries with collision constraints removed. The model’s
collision geometry does not describe arbitrary objects on the work surface;
runtime contact monitoring, cancellation and deadlines still guard playback.
A rejected plan moves nothing. Mid-session, teleop, collection, DAgger and
policy returns treat it like a contact: the arms drop into the limp gravity-comp
hold so the operator can guide them somewhere the planner accepts, then retry
(the prompt reads “Return path rejected”). A rejected shutdown-park leg ends the
park, as a failed leg always has. A rejected startup move fails the session
start with the planner’s reason, before anything moves.
vr_teleop_config.mink_reset_collision_margin (or the top-level
mink_reset_collision_margin in run-policy) selects the Mink planner’s hard
clearance target (default 0.01 m). The JAX reset_collision_margin and reset
penalty weights configure the JAX planner’s soft costs and do not configure
Mink. Pairs close in the known home pose use home-relative limits. A start inside
the nominal clearance buffer must recover clearance without moving deeper into
it; a colliding start or blocked path is rejected.
Selecting Mink uses Cartesian reset paths instead of the JAX joint-space planner.
Tracking parity does not imply identical reset trajectories or physical behavior.
