Impedance & Admittance Control — Robotics Reference
Scope. Position control assumes a known, rigid environment; the moment a robot touches anything compliant — a workpiece, a human, an uncertain peg-in-hole — the position-tracking regulator fights the contact and the contact wins (force grows without bound until something yields). This note covers the canonical fix: regulate the relationship between motion and force instead of either one in isolation. The control-theoretic background (MIMO state-space, passivity, port-Hamiltonian) lives in
[[Engineering/classical-control]]and[[Engineering/state-space-methods]]; here we deal with what shows up in libfranka examples, ros2_control’scartesian_admittance_controller, KUKA FRI, and the legged-robot impedance layer used by Spot, Cassie, and Digit.
1. At a glance
Impedance control (Hogan 1985) makes a robot’s end-effector behave like a programmable spring-mass-damper at the contact point. The control engineer picks the desired dynamic relationship between deviation from a reference trajectory and the force exerted on the environment:
The robot, in effect, becomes a mass M_d connected to its commanded trajectory by a spring of stiffness K_d and a damper of B_d. Push it, and it pushes back with a force determined entirely by those three matrices.
Why every contact-rich robotic task needs this:
- Contact-rich manipulation — peg-in-hole assembly, polishing, deburring, screw driving, wiping, drawer opening. Pure position control over-constrains the geometry; the robot either flexes its own structure or breaks the part.
- Physical human-robot interaction (pHRI) — cobot hand-guiding, exoskeletons, prosthetics, surgical-robot bilateral teleoperation. Touching a human with a position-controlled arm is at best uncomfortable and at worst injurious.
- Safety in unknown environments — a position-controlled arm that hits an obstacle pushes through it; an impedance-controlled arm absorbs the contact and ramps force linearly with intrusion depth.
- Haptic rendering — virtual walls and constraints for teleoperation and VR; the operator-side device renders impedance at high rate so that real and simulated interactions feel identical.
Two implementations of the same idea:
- Impedance control proper — torque-controlled robot; control law outputs
τ = J^⊤·(K·Δx + B·Δẋ)plus dynamics compensation. The robot is causal force-out, motion-in: push it, force responds. Native impedance robots (Franka Panda, KUKA iiwa, MIT Mini Cheetah, Spot, Digit) live here. - Admittance control — position-controlled robot wrapped with an F/T sensor and an integrator that maps measured force to a position correction. The robot is causal motion-out, force-in: apply force, motion responds. Used to bolt compliant behaviour onto industrial position-controlled arms (UR e-series force_mode, ABB GoFa, Yaskawa HC, Doosan in position mode).
Where it sits in the design stack. Sensors → state estimation → trajectory generator → impedance/admittance outer loop → joint torque or position commands → joint servo (often PID, see [[Robotics/pid-control]]) → motor drivers → mechanical plant. The impedance layer runs at 100 Hz – 1 kHz in cobots, up to 2 kHz in haptic devices.
Common variants:
- Cartesian (operational-space) impedance —
K,Bare 6×6 matrices in task space. Standard for manipulation tasks. - Joint impedance —
K,Bdiagonal in joint space. Simpler; used for gravity-comp / hand-guiding modes. - Variable impedance —
K(t),B(t)modulated by task phase or learned policy (Calinon, Khansari). - Passive (mechanical) compliance — Remote Center of Compliance (RCC, Whitney 1982), Series Elastic Actuator (SEA, Pratt-Williamson 1995). Hardware compliance, not control.
First ask before applying: Is the robot torque-controllable? If yes → impedance. If only position-controllable → admittance with F/T sensor. Is the contact light or heavy? Light (paint-brush, finger) → impedance is more transparent. Heavy (drilling, press-fit) → admittance is more robust (Volpe-Khosla 1995). Is there a network or comm delay? If the round trip exceeds a few ms → passivity becomes critical; use wave variables (Niemeyer-Slotine 1991). Is the loop discrete-time? If yes → there is a hard limit K·T_s ≤ B on how stiff you can render (Colgate-Hogan 1997 Z-width).
2. First principles
Mechanical impedance — the electrical analogy
Hogan’s 1985 framing borrows directly from electrical-circuit impedance. Electrical impedance Z(s) = V(s)/I(s) relates voltage (effort) to current (flow). Mechanical impedance Z(s) = F(s)/v(s) relates force (effort) to velocity (flow). Its inverse, admittance Y(s) = 1/Z(s) = v(s)/F(s), is the dual.
A mass-spring-damper has impedance
This second-order pole-pair behaviour is what the control engineer wants to render with the robot. The set of (M_d, B_d, K_d) chosen for the controller becomes the apparent mechanical impedance felt at the end-effector. The environment provides the dual relationship F = Z_env(s)·v; the closed-loop dynamics are the interconnection of the two ports.
The Hogan formulation (Hogan 1985)
For a robot whose joint dynamics are the manipulator equation ([[Robotics/dynamics-rigid-body]]),
the Cartesian impedance controller picks joint torques τ such that the end-effector’s deviation from a reference Cartesian trajectory x_d(t) obeys
The simplest (and most-used) closed form is the PD-plus-gravity impedance controller, valid when M_d is not shaped (i.e. we accept whatever inertia the manipulator naturally projects to the task frame):
This is dynamically passive: it stores no energy beyond the spring potential ½·x̃^⊤·K_d·x̃ and dissipates through B_d·ẋ̃, so under-damped but bounded behaviour is guaranteed in contact with any passive environment (Colgate-Hogan 1988). The price: the apparent end-effector mass is whatever the geometric Jacobian projects from M(q),
— the operational-space mass matrix (Khatib 1987). This is configuration-dependent and anisotropic; tasks needing isotropic apparent inertia must add inertia shaping (next).
Inertia shaping — the full Khatib operational-space controller
To render a chosen M_d (not just K_d, B_d), invert the Jacobian-projected dynamics and command
where μ is the operational-space Coriolis/centripetal (Khatib 1987). Setting M_d = Λ(q) recovers the simple PD-plus-gravity case; setting M_d = m·I_6 gives the operator a homogeneous “virtual mass m” feel. Inertia shaping needs F_ext measurement — a wrist-mounted F/T sensor — and is not passive in general (it injects energy when M_d < Λ). Production cobots (Franka, iiwa) leave M_d = Λ(q) and tune only K_d and B_d for this reason.
Joint impedance
The same idea in joint space drops the Jacobian:
K_q, B_q are diagonal n×n. Joint impedance is the default mode on Franka Panda (JointImpedanceController in libfranka), used for hand-guiding (set K_q ≈ 0 along the joints you want to guide), gravity-comp teaching mode (K_q = 0 everywhere), and free-space motions where Cartesian impedance is unnecessary.
Admittance control — the dual
For a robot that cannot command torque (position-controlled industrial arm), the same compliant behaviour is synthesised externally. An F/T sensor measures F_ext at the wrist; an admittance filter integrates the deviation:
where x_c is the commanded position sent to the robot’s inner position loop, and F_d is a desired force setpoint (zero for free-floating compliance, non-zero for force-tracking). The robot’s position loop tracks x_c; the admittance filter is the outer wrapper. This is the architecture of UR e-series force_mode(), ABB GoFa SoftMove, Yaskawa HC FunctionAddOn, and ros2_control’s cartesian_admittance_controller.
Stability — the Colgate-Hogan Z-width limit
In discrete time with sample period T_s, rendering an arbitrarily stiff virtual spring is not possible. Colgate-Hogan 1997 (“Factors affecting the Z-width of a haptic display”) show that the maximum passively-renderable stiffness obeys
where b is the device’s intrinsic mechanical damping. The intuition: between sample times the controller is open-loop; the spring impulse delivered at one sample reaches the user/environment before the next correction, and if the spring is too stiff (relative to the available damping over one sample period) the loop generates energy — active behaviour, oscillation, possibly violent. The bound is universally why haptic devices ship with mechanical dampers (eddy-current brakes, viscous bearings) and why production impedance robots run their inner torque loop at 1 kHz+.
Active vs passive compliance
- Active compliance — control-loop synthesis as above. Tunable in software; can be variable, time-varying, learned.
- Passive compliance — mechanical, no controller required.
- Remote Center of Compliance (RCC) (Whitney 1982, ATI / Sintokogio products). A passive plate of elastomer + steel that places a compliance centre at the tooltip; a chamfered peg slides into a hole without any active control. Used since the 1980s for SCARA insertion stations.
- Series Elastic Actuator (SEA) (Pratt-Williamson 1995). A torsion spring placed between motor and load; force is measured as spring deflection × known stiffness. Inherently safe (the spring is the impedance), backdrivable, naturally low-impedance at high frequencies. Backbone of legged robots and exoskeletons (Spot, Cassie, Digit, ANYmal, Sarcos Guardian XO).
The two are complementary: SEA + active joint impedance gives both bandwidth (active) and inherent safety (passive). Native impedance robots (Franka, iiwa) instead use rigid joint torque sensing (strain gauges in each joint) and pure active impedance.
3. Practical math & worked examples
Example A — Peg-in-hole assembly with Cartesian impedance
Task. Insert a 25 mm steel peg into a 25.05 mm hole (radial clearance 25 µm), chamfer 1 mm at 30°. Robot: Franka Emika Panda with libfranka 0.13.x Cartesian impedance interface (released 2024-Q3).
Frame. Tool frame at the peg tip; +z along the insertion axis, x and y lateral.
Stiffness selection.
K_d = diag(K_xy, K_xy, K_z, K_rx, K_ry, K_rz) [N/m, N/m, N/m, N·m/rad, N·m/rad, N·m/rad]
= diag(200, 200, 5000, 50, 50, 50)
- Lateral
K_xy = 200 N/m— low. A 50 mm lateral peg-edge contact will deflect the commanded tip 50 mm @ 10 N (the cobot’s HRC force limit) before fighting the constraint. The chamfer geometry guides the peg in. - Insertion
K_z = 5000 N/m— stiff. Need positive force to seat the peg; 5 mm of compression yields 25 N press-fit. - Rotational
K_r = 50 N·m/rad— modest. Allows the peg to align with the hole axis on contact (≈10° wiggle at 10 N·m).
Damping ratio ζ = 0.7 (slightly under-damped) for all axes. The Franka setCartesianImpedance API takes stiffness K and computes damping internally as B = 2·ζ·√(K·Λ̂) using the current operational-space inertia estimate. At the wrist, Λ̂_translation ≈ 5 kg typical → B_xy = 2·0.7·√(200·5) ≈ 44 N·s/m. The user can override damping for tasks needing more bite.
Sample rate. libfranka exposes the 1 kHz torque-control loop directly; the Cartesian impedance computation runs in the user’s callback at that rate.
Sequence.
- Approach: free-space Cartesian impedance with low
K_xy = K_z = 200 N/m. Robot drifts under hand-guiding. - First contact:
K_zramps to 5000 N/m over 100 ms while the controller monitorsF_z. - Search: command a spiral motion in
x-yof radius 2 mm, period 0.5 s, at lowK_xy = 100 N/m. Lateral force deflects the spiral path; chamfer captures the peg. - Drop-in detection: watch
F_zfor a sudden drop (>2 N decrease in 50 ms — peg fell off the rim of the hole). Trigger phase 5. - Insert: high
K_z, lowK_xy = 50 N/m(slip lubrication), commandx_d.z += 25 mmover 2 s.
Stability check. Worst-case stiffness on lateral axis 5000 N/m; estimated joint torque sensor noise ~0.1 N·m RMS at 1 kHz; reflected to wrist via worst-case Jacobian (singular value ≈ 5 m⁻¹ at typical poses) → force noise ≈ 0.5 N RMS. Z-width bound K·T_s ≤ 2·B: at B ≈ 100 N·s/m, T_s = 1 ms, max passive K ≈ 200 kN/m. The 5000 N/m operating point sits comfortably below the passivity limit.
Example B — Series Elastic Actuator torque control
Hardware. Custom SEA leg actuator: NEMA-23 BLDC + planetary 10:1 + torsion spring K_s = 1000 N·m/rad + load. Motor-side incremental encoder 4096 cpr; load-side absolute encoder 16-bit (RLS Orbis BR10) reading shaft angle past the spring.
Measurement. Spring deflection Δθ = θ_motor/N − θ_load, where N = 10 is the gear ratio. Output torque on the load shaft:
with K_s calibrated empirically by hanging a known mass at a known lever arm. The torque-sensing resolution is set by the load-side encoder noise (~0.005° RMS for the RLS Orbis) → τ_resolution = K_s · 0.005·(π/180) ≈ 0.087 N·m.
Closed-loop torque PI. Target output torque τ_d from the leg-level controller; PI on torque error commands motor current via the inner FOC loop (see [[Robotics/motors-electric]] §3 and [[Robotics/pid-control]] §3):
e_τ[k] = τ_d[k] − K_s·Δθ[k]
i_d[k] = K_p·e_τ[k] + K_i·T_s·Σ e_τ
with K_p = 5 A/(N·m), K_i = 200 A/(N·m·s), T_s = 0.5 ms.
Bandwidth. The closed-loop torque bandwidth is limited by the SEA natural frequency
with J_eff the effective inertia between the spring and the load. For Spot’s leg actuator (Boston Dynamics 2019 release notes), J_eff ≈ 0.05 kg·m² and K_s ≈ 800 N·m/rad → ω_n ≈ 126 rad/s ≈ 20 Hz. Cassie and Digit (Agility Robotics) sit at 30–50 Hz. You cannot get more bandwidth than the SEA’s mechanical eigenfrequency without going to a stiffer spring (trading off compliance) or eliminating the spring (rigid joint).
Trade-off curve. Lower K_s → softer, safer, but slower; higher K_s → faster, less compliant. The Pratt-Williamson 1995 paper identifies the sweet spot at the joint inertia matched to the load inertia at the dominant operating frequency.
Example C — Haptic teleoperation virtual wall
Device. 3D Systems Touch X (formerly SensAble Phantom Premium), 6-DOF, 3-DOF active force feedback, workspace 160 × 120 × 70 mm, max force 7.9 N, position resolution 23 µm, USB-2 1 kHz update.
Task. Render a virtual rigid wall at x = 0.1 m (along the device’s x axis). When the operator’s hand pushes past the wall, the device should resist with a force proportional to penetration.
Spring-damper virtual wall.
Stability — Hannaford passivity criterion. For a discrete-time virtual wall sampled at T_s with device intrinsic damping b, the Colgate-Hogan / Hannaford 1989 bound
dictates the design. The Touch X has intrinsic damping b ≈ 5 N·s/m (estimated from spec sheet’s “minimum exertable force”); sample period T_s = 1 ms; user-set B = 10 N·s/m. Then
Practical setting. K = 20 000 N/m, B = 10 N·s/m — passive with margin. The operator feels a hard wall (penetration of 0.5 mm gives 10 N back-force — the device’s saturation limit) without limit-cycle vibration.
Wave-variable extension (Niemeyer-Slotine 1991). For teleoperation through a delay (master-slave separated by network), the same virtual-wall passivity is broken by the round-trip lag. Encoding force-velocity pairs as wave variables u = (B·v + F)/√(2B), v_wave = (B·v − F)/√(2B) and transmitting those preserves passivity regardless of delay (within bandwidth limits). Standard pattern for surgical telerobotics and remote-presence platforms.
4. Design heuristics
Impedance vs admittance — the decision
| Criterion | Impedance | Admittance |
|---|---|---|
| Robot type | Torque-controllable (joint torque sensors) | Position-controlled (industrial servos) |
| Hardware | Franka, KUKA iiwa, Kinova Gen3, custom QDD | UR, ABB, Fanuc, Yaskawa, Doosan position mode |
| Contact stiffness suited | Light/medium (Volpe-Khosla 1995) | Heavy/stiff contact, press-fit |
| Latency tolerance | Tight inner loop required (1 kHz+) | Wraps existing 8–125 ms position loop |
| F/T sensor needed | Optional (joint torque sensors substitute) | Mandatory (wrist-mount) |
| Free-space behaviour | Naturally backdrivable | Sluggish (admittance filter dynamics) |
| Implementation effort | Need full dynamics model | F/T sensor + integrator; quick to retrofit |
Heuristic decision tree: torque-controllable robot → impedance. Position-controlled robot with F/T sensor → admittance. Heavy press / drilling → admittance regardless. Human-contact, light manipulation → impedance preferred.
Stiffness selection by task phase
| Phase | Translational K (N/m) | Rotational K (N·m/rad) | Notes |
|---|---|---|---|
| Free-space motion | 50 – 200 | 10 – 50 | ”Float” — robot follows the commanded path without fighting small disturbances |
| Approach to contact | 200 – 500 | 20 – 100 | Compliant enough to absorb first contact |
| Tracking with contact | 500 – 2 000 | 50 – 200 | Light polishing, wiping |
| Press / push / insert | 2 000 – 20 000 | 200 – 500 | Stiff in the insertion direction; lateral often stays compliant |
| Hand-guiding (zero-G) | ≤ 10 | ≤ 5 | Effectively K = 0 along the guided axis |
Cobot HRC ceiling. Under ISO/TS 15066, transient (collision) contact forces must stay below body-region-specific limits (Table A.2 of the spec). At a maximum 50 mm position deflection, hardware-limited F_max ≈ 250 N (head, free-floating) implies K ≤ 250/0.05 = 5 000 N/m worst-case translational for an HRC mode. In quasi-static (clamping) the limit is lower; many cobot integrators cap impedance gains at 1000 N/m globally for HRC zones.
Damping ratio
Default ζ = 0.7 (slight under-damping) — the standard second-order optimum balancing rise time and overshoot. ζ = 1 (critical) for safety-critical contact phases (no overshoot into the workpiece). ζ > 1 (over-damped) for haptic rendering where any oscillation is felt sharply by the user. Compute from B = 2·ζ·√(K·M_eff) with M_eff either set explicitly (inertia-shaped controller) or estimated from Λ(q) (Khatib operational-space).
Stability gotchas
- High K + low B → resonance peaking; oscillation on contact. Increase
Bor reduceK. - Discrete-time stiffness limit (Colgate-Hogan 1997):
K·T_s ≤ 2·B. Faster control rate buys more renderable stiffness. - Compliance close to a mechanical eigenfrequency of the robot link or gripper amplifies vibration. Notch-filter the offending mode or stay well below its frequency in your bandwidth.
- Active inertia reduction (
M_d < Λ) is non-passive. Use only when contact environments are known to be stiff (so the closed loop’s net energy budget is bounded by the environment).
Gravity compensation is non-negotiable
Without g(q) in the torque path, an impedance-controlled arm drifts under its own weight unless K_d is high enough to fight gravity — defeating the purpose of low impedance. Production stacks (libfranka, KUKA FRI, ros2_control’s cartesian_compliance_controller) compute g(q) online from the URDF; if a tool is mounted, the user provides m_tool, c_tool, I_tool to update the gravity model. Errors of 20–50 g in tool mass are visible as drift at low K.
Variable impedance during task
Modern manipulation pipelines (NIST insertion benchmark, OpenAI Rubik’s-cube, dishwasher loading) schedule K(t) over task phases — soft approach, stiff press, compliant retract — either from hand-tuned state machines or learned from human demonstration (Calinon DMP-with-stiffness, Khansari LWR). The infrastructure is in place in cartesian_compliance_controller (ros2_control) via runtime parameter updates; the policy is task-dependent.
Coriolis & inertia compensation
For slow motions (cobot teaching, < 0.3 m/s end-effector), g(q) alone is enough. For fast motions (pick-and-place at 1 m/s), include C(q,q̇)·q̇ (RNEA-based, O(n), [[Robotics/dynamics-rigid-body]]). For full inertia shaping include the operational-space mass matrix Λ(q). The marginal benefit of each term roughly tracks task speed.
Friction is the silent killer
Joint friction (especially in harmonic-drive joints) hides small contact forces below the friction floor. Even a Franka with rigid joint torque sensors has ~0.3 N·m stiction per joint; cheap UR-style robots without joint torque sensing have ~1–3 N·m stiction. Translated to wrist force resolution: ~1 N for Franka, ~5–10 N for UR-class. This is the lower bound of what you can servo on without a wrist F/T sensor.
5. Components & sourcing
Native-impedance robots (joint torque sensing in every joint)
| Robot | Payload | Joints | Reach | Torque sensors | Native impedance API |
|---|---|---|---|---|---|
| Franka Emika Panda / FR3 | 3 kg | 7 | 855 mm | Per-joint strain gauge | libfranka + franka_ros2 cartesian_impedance_example, joint_impedance_example |
| KUKA LBR iiwa 7 / 14 R820 | 7 / 14 kg | 7 | 800 / 820 mm | Per-joint cross-flexure strain gauge | FRI (Fast Research Interface), JointImpedanceController, CartesianImpedanceController in Sunrise.OS |
| Kinova Gen3 / Gen3 lite | 4 / 0.5 kg | 7 / 6 | 902 / 760 mm | Per-joint torque sensing | Kortex API LowLevelControl torque mode |
| KUKA LBR Med | 7 kg medical-certified | 7 | 800 mm | Same as iiwa | FRI Med |
Admittance-mode add-ons (position-controlled robot + F/T sensor)
| Robot | Add-on | Comment |
|---|---|---|
| UR3e / UR5e / UR10e / UR16e / UR20 | Built-in force_mode() URScript primitive | Admittance under the hood; FT300 / built-in joint current observer for force estimation |
| ABB GoFa CRB 15000 / CRB 1100 | SoftMove option | Admittance with optional external ATI F/T |
| Yaskawa HC10/HC20 | FunctionAddOn force control | Admittance |
| Doosan A0509 / M0609 / M1013 | Position or torque mode; set_compliance_ctrl() API | Hybrid |
| Fanuc CRX-10iA | Force Sensor Function package | Admittance + payload ID |
| Techman TM5 / TM12 | Built-in compliance mode | Vision-integrated cobot |
F/T sensor compatible with custom impedance/admittance
- ATI Industrial Automation — Mini40 (40 mm, 60 N range), Mini45, Gamma (75 mm, 130 N), Delta. F/T resolution down to 1/100 N depending on calibration.
- Bota Systems Rokubi mini / SensONE / Medusa — high-bandwidth (2 kHz native), EtherCAT.
- Robotous RFT — Korean lower-cost line, ~$3–8k.
- Onrobot HEX-E / HEX-H — bolt-on hex sensors for UR/Doosan.
- OptoForce / Sintokogio — 3-axis optical, cheaper for asymmetric tasks.
Companion deep note: [[Robotics/sensors-force-tactile]] (planned).
SEA / QDD hardware (compliant by design)
| Implementation | Hardware | Compliance type |
|---|---|---|
| Boston Dynamics Spot | Proprietary leg actuators | SEA per joint |
| Agility Robotics Cassie / Digit | Proprietary harmonic + leaf-spring SEA | SEA |
| ANYbotics ANYmal | ANYdrive (BLDC + harmonic, joint torque sensor) | Rigid + active impedance |
| MIT Mini Cheetah / Unitree A1 / Go1 / Go2 | T-Motor AK-series quasi-direct-drive | QDD (low gear ratio, intrinsic backdrivability) |
| MJBots qdd100 / moteus | T-Motor / MAD frame BLDC + integrated FOC | QDD |
| HEBI Robotics X5 / X8 | Modular SEA modules with bus interface | SEA |
| Berkeley Open Robotics OpenSEA | Open-hardware reference SEA | SEA |
| Sarcos Guardian XO exoskeleton | Hydraulic SEA | Hydraulic compliance |
Haptic devices
| Device | Workspace | Max force | Update rate | Use |
|---|---|---|---|---|
| 3D Systems Touch | 160×120×70 mm | 3.3 N | 1 kHz | Education, light VR |
| 3D Systems Touch X | 160×120×70 mm | 7.9 N | 1 kHz | Surgical training, VR |
| Force Dimension omega.3 | 160×160×110 mm | 12 N | 4 kHz | Surgical-robot master |
| Force Dimension omega.6 / 7 | + rotation + grip | 12 N | 4 kHz | High-end teleop |
| Geomagic Touch (legacy) | 160×120×70 mm | 3.3 N | 1 kHz | Replaced by Touch |
| HaptX Gloves G1 | Per-finger | 4 N/finger | 200 Hz | Industrial VR |
Software libraries & frameworks
- libfranka —
cartesian_impedance_example.cpp,joint_impedance_example.cpp(Franka Robotics, current ≥0.13). - franka_ros2 — ROS 2 bindings to libfranka;
cartesian_impedance_example_controller. - ros2_control
cartesian_compliance_controller— operational-space PD-plus-gravity impedance (https://control.ros.org/). - ros2_control
cartesian_admittance_controller— admittance wrapper for position-controlled robots. - Drake (MIT / TRI) —
OperationalSpaceControllerLeafSystem; symbolic dynamics forΛ,C,g. - Pinocchio + custom — fast RNEA / CRBA / ABA; lets you build impedance controllers atop OCP solvers.
- MIT OCS2 — operational-space + MPC for legged robots.
- MuJoCo MPC — Google DeepMind contact-rich MPC toolbox; impedance as cost-function shaping.
- KUKA FRI — Sunrise.Connectivity Fast Research Interface; impedance access at 200 Hz – 1 kHz.
6. Reference data
Stiffness range by application
| Application | Translational K (N/m) | Rotational K (N·m/rad) | Damping ζ |
|---|---|---|---|
| Free space / hand-guiding | 0 – 50 | 0 – 10 | 0.5 – 1.0 |
| Light surface contact (polish, wipe) | 200 – 1 000 | 20 – 100 | 0.7 |
| Insertion (peg-in-hole) z-axis | 3 000 – 10 000 | 100 – 300 | 0.7 – 1.0 |
| Press-fit / drill | 5 000 – 20 000 | 200 – 500 | 1.0 |
| Surgical interaction | 100 – 1 000 | 10 – 100 | ≥ 1.0 |
| Haptic virtual wall | 2 000 – 30 000 | 100 – 1 000 | ≥ 0.7 |
Cobot family impedance capability matrix
| Robot family | Joint torque sensing | Native impedance | Admittance fallback | Typical impedance rate |
|---|---|---|---|---|
| Franka FR3 / Panda | yes | yes (libfranka) | n/a | 1 kHz |
| KUKA iiwa 7/14 | yes | yes (FRI) | n/a | 1 kHz |
| Kinova Gen3 | yes | yes (Kortex) | n/a | 1 kHz |
| UR e-series / UR20 | no (current observer) | partial via force_mode | yes (FT sensor) | 125–500 Hz |
| ABB GoFa CRB 15000 | no | no | yes (SoftMove + FT) | 250 Hz |
| Yaskawa HC10/20 | no | no | yes (FunctionAddOn + FT) | 250 Hz |
| Fanuc CRX-10iA | no | no | yes (Force Sensor option) | 125 Hz |
| Doosan A/M-series | partial | yes (compliance_ctrl) | yes | 250 Hz |
| Techman TM5/12 | no | partial | yes | 250 Hz |
SEA implementations in production robots
| Robot | Joint spring K_s (N·m/rad) | Bandwidth (Hz) | Source |
|---|---|---|---|
| Boston Dynamics Spot leg | ≈ 800 | ~20 | BD release notes 2019 |
| Agility Cassie/Digit | 1 000 – 1 500 | 30–50 | Hurst et al. 2019 |
| HEBI Robotics X5-9 module | 800 | 25 | HEBI datasheet |
| Sarcos Guardian XO | hydraulic equivalent | 10–20 | Sarcos technical brief |
| Edinburgh Centaur (ANYmal predecessor) | 600 | 15 | Hutter et al. 2016 |
| MIT Cheetah 3 (rigid + impedance) | ∞ (rigid) | 100+ | Bledt et al. 2018 |
Haptic device specs (selected)
| Device | DOF active | Max force (N) | Resolution (µm) | Update (kHz) |
|---|---|---|---|---|
| 3D Systems Touch | 3 | 3.3 | 55 | 1.0 |
| 3D Systems Touch X | 3 | 7.9 | 23 | 1.0 |
| Force Dimension omega.3 | 3 | 12 | 9 | 4.0 |
| Force Dimension omega.6 | 6 | 12 (trans) | 9 | 4.0 |
| Force Dimension omega.7 | 7 (+grip) | 12 | 9 | 4.0 |
| Quanser HD² | 6 | 19.7 | 8 | 5.0 |
ISO/TS 15066:2025 quasi-static collision force limits (Table A.2 excerpt)
| Body region | Quasi-static F_max (N) | Transient F_max (N) | Pressure quasi-static (N/cm²) |
|---|---|---|---|
| Skull / forehead | 130 | 175 | 30 |
| Face | 65 | 90 | 20 |
| Neck (sides) | 150 | 190 | 50 |
| Upper arm | 150 | 190 | 70 |
| Hand / fingers (back) | 140 | 280 | 140 |
| Abdomen | 110 | 220 | 20 |
| Thigh | 250 | 500 | 80 |
Source: ISO/TS 15066:2025 (revised; supersedes 2016). Used to cap impedance K and damping B in HRC zones.
Operational-space mass matrix Λ(q) typical magnitudes
| Robot | Λ translational magnitude (kg) | Λ rotational magnitude (kg·m²) |
|---|---|---|
| Franka Panda mid-workspace | 3 – 8 | 0.05 – 0.3 |
| KUKA iiwa 7 mid-workspace | 4 – 10 | 0.1 – 0.5 |
| UR5e mid-workspace | 6 – 14 | 0.1 – 0.6 |
7. Failure modes & debugging
| Symptom | Likely cause | Fix |
|---|---|---|
| Sustained oscillation on contact | K too high relative to B (under-damped) | Raise B until ζ ≈ 0.7; or reduce K |
| Buzzing / chattering at rest | Sensor noise feedback through K_d or B_d | Filter ẋ, F_ext; reduce N in derivative filter |
| Slow drift away from x_d under steady external force | No integral term in impedance; gravity error | Add tiny K_i cautiously; verify gravity-comp tool mass |
| F/T sensor saturates during contact | Underspec’d sensor | Move to higher-range sensor; reduce contact force; pre-load with admittance |
| Lost contact detection (false negative) | Compliance/flex between sensor and contact point | Add hysteresis; or move sensor closer to contact (e.g. fingertip force) |
| Unstable virtual wall (telop) | Passivity violated by delay | Wave variables (Niemeyer-Slotine); reduce K within K·T_s ≤ 2·B bound |
| Cartesian impedance feels “heavy” along one axis | Operational-space Λ(q) anisotropic at this pose | Inertia shape with M_d = m·I; or re-pose to better-conditioned region |
| Coordinate frame mismatch (control feels wrong) | K_d expressed in tool but applied in base frame, or vice versa | Verify frame convention in libfranka / KUKA FRI docs; transform K_d by R^T·K_d·R |
| Drift after tool change | Gravity model uses old tool mass | Update m_tool, c_tool, I_tool; re-zero F/T sensor with new tool |
| Joints fight each other in joint impedance | Off-diagonal C(q,q̇)·q̇ neglected at high speed | Add Coriolis comp; or reduce trajectory speed |
| Audible whine, current spike on contact | K_d exciting a structural mode | Notch-filter at the resonance; reduce K_d in that axis |
| Robot “ghost-pushes” in free space | M_d < Λ shaped without inertia feedback | Cap M_d ≥ Λ_min; verify F_ext signal is active |
| Sticky behaviour at low speed | Joint stiction below sensor floor | Coulomb friction feedforward; or accept floor and don’t servo below it |
| Discretization-induced loss of passivity | T_s too long for chosen K | Increase loop rate; or reduce K to satisfy K·T_s ≤ 2·B |
Detailed failure modes
-
Contact oscillation is the canonical “did I get impedance right?” failure. The mass-spring-damper has two parameters that fight:
Kfor response,Bfor damping. A new user picksK = 5000,B = 50and the robot rings at ~50 Hz against the workpiece. Computeζ = B / (2·√(K·M_eff)); forM_eff = 5 kg,ζ = 50/(2·158) ≈ 0.16— wildly under-damped. Fix:B = 2·0.7·√(K·M_eff) ≈ 220 N·s/m. -
Integrator drift in admittance loops. The admittance filter
M_d·ẍ_c + B_d·ẋ_c + K_d·x_c = F_ext + K_d·x_daccumulates floating-point drift over hours; the commanded position slowly walks away from the trajectory even withF_ext = 0. Production fix: leak the integrator (x_c ← α·x_c + (1−α)·x_dwithα = 0.999) or periodically re-anchor to the reference when contact is lost. -
F/T sensor bias drift with temperature. ATI Mini40 typical thermal coefficient 0.1 %/°C; a 10 °C ambient swing on a strain-gauge sensor that reads 200 N range shifts zero by 0.2 N. In a low-K admittance loop this commands a steady drift. Fix: re-zero in free space periodically (UR’s
zero_ftsensor()URScript primitive runs every 30 s in many production lines), or use a thermally compensated sensor (Bota). -
Cable / harness drag adds an unintended Cartesian stiffness (~5–20 N/m for a typical Cat-6 + power loom on a cobot wrist). Subtle in free space, dominant when the user picked
K_d = 50for hand-guiding. Fix: route cables through a compliant strain relief; or measure and subtract the cable load. -
Discrete-time Z-width violation.
K·T_s > 2·Bmakes the loop generate energy between samples. On a Franka at 1 kHz withB = 50 N·s/m, the limit isK_max = 100 000 N/m. TryK = 200 000; the contact erupts into ~500 Hz oscillation. Fix: stay in the passive region or increase damping commensurately. The bound is hardware-driven; no software trick recovers it. -
Coriolis ignored at speed. For end-effector speeds < 0.3 m/s the Coriolis term
C·q̇is < 2 % of joint torques; ignorable. At 1.0 m/s on a 7-DOF cobot it reaches 20–30 % — and shows up as a direction-dependent impedance error (the robot feels “stiffer” moving one way than the other). Fix: includeC(q,q̇)·q̇in the torque path (Pinocchio RNEA call, ~30 µs on modern x86). -
Singularity-induced inertia explosion. As the robot approaches a kinematic singularity (
[[Robotics/kinematics-dh]]),Λ(q) = (J·M⁻¹·J^⊤)⁻¹blows up along the lost DOF. Cartesian impedance becomes unbounded in that direction. Fix: use damped-least-squares pseudoinverse forJ^⊤-based torque mapping; capΛelement-wise; or stay away from singularities at the planner level. -
Cobot HRC over-stiffness. Tuning impedance for fast pick-and-place yields
K = 5000 N/mand the operator pulls a stop-cord. Re-check against ISO/TS 15066 force tables: withΔx = 100 mm(one sample period at 1 m/s),F = 500 N— above the 250 N skull limit. Fix: cap K and Δx in HRC zones; trip an emergency stop at force threshold. -
Hand-guiding fights gravity. The user sets
K_d = 0to hand-guide, expects the arm to “float,” but it sags. Cause: tool mass + payload changed since last calibration; gravity model wrong by 0.5 kg. Fix: re-identify tool inertials (libfranka, KUKA both exposesetLoad/identifyPayload); or run a momentum-observer to estimate residual gravity online. -
Loop rate mismatch in cascaded inner-outer. Cartesian impedance at 1 kHz wrapping a joint-position inner loop at 250 Hz violates the 5× separation rule; the outer loop sees the inner loop as a 25-ms-lagged actuator and oscillates. Fix: speed up inner loop, or slow outer impedance to 50 Hz, or collapse into a single 1 kHz torque-based controller.
8. Case studies
Case A — Franka Emika Panda Cartesian impedance (libfranka)
The Franka Panda (released 2017, replaced by FR3 in 2023, current as of 2026-05) is the textbook reference implementation of joint-torque-sensing Cartesian impedance in a commercially available cobot. Its lineage runs from the DLR LWR-III lightweight arm (Albu-Schäffer & Hirzinger, DLR Institute of Robotics and Mechatronics, 1990s–2000s) through KUKA’s LBR iiwa (commercialized 2008) to the Franka spinout in 2017.
Hardware. 7-DOF arm; strain-gauge joint torque sensors integrated into every joint (this is the differentiator vs UR); harmonic-drive reducers; absolute encoders motor-side and load-side; 1 kHz EtherCAT-derived bus to a real-time x86 controller running PREEMPT_RT Linux.
Control stack.
- Inner FOC current loop at the joint board (~10 kHz, STM32-class).
- Joint torque PI at the joint board (~1 kHz).
- Cartesian impedance / joint impedance / dynamic compensation on the x86 controller at 1 kHz, exposed to user code via libfranka.
libfranka API. The user implements a callback that returns joint torques every 1 ms:
panda.control([](const franka::RobotState& s, franka::Duration period) -> franka::Torques {
Eigen::Map<const Eigen::Matrix<double,7,1>> q(s.q.data()), dq(s.dq.data());
auto T = ee_pose_from(s);
auto x_err = pose_error(T, T_des);
Eigen::VectorXd F = K_d * x_err + B_d * (J * dq * -1); // wrench from Cartesian PD
Eigen::Matrix<double,7,1> tau = J.transpose() * F + coriolis_franka(s) + gravity_franka(s);
return franka::Torques({tau(0), tau(1), ..., tau(6)});
});
The libfranka cartesian_impedance_example.cpp and joint_impedance_example.cpp are the de facto teaching references for the entire impedance-control field (Albu-Schäffer 2002; commercialized 2017).
Why this matters. Franka set the price/capability point that made torque-sensing cobots accessible to research labs (~100 k for iiwa). The architecture — joint torque sensors + 1 kHz Cartesian impedance loop + user-accessible torque callback — is what subsequent open-source efforts (ros2_control’s cartesian_compliance_controller, Drake’s OperationalSpaceController) replicated.
Case B — MIT WAM (Whole Arm Manipulator) — Barrett Technology
The Barrett WAM (William Townsend, MIT AI Lab → Barrett 1988–present) was the first commercially available cable-driven, torque-controlled, backdrivable robotic arm. While Franka commoditised joint-torque-sensing, the WAM pioneered the architecture decades earlier with a fundamentally different mechanical solution: cables (not gears) transmit torque from base-mounted motors out to the joints, retaining true backdrivability without the rigid harmonic-drive’s reflected friction.
Architecture.
- Brushless DC motors at the base, low inertia at the distal joints.
- Steel cables wrapped on differential pulleys carry torque.
- Each motor has a high-resolution optical encoder; cable tension acts as a series-elastic element of sorts.
- 7-DOF (4-DOF and 7-DOF variants); maximum cable-routed reach.
- Real-time control at 500 Hz via the Barrett “BarrettControl” stack; PUMA-style direct-torque commanding.
Impedance behaviour. Without joint torque sensors (cables don’t house them well), the WAM achieves apparent impedance through low intrinsic friction and direct motor-torque commanding. Set the controller to “transparent” mode (zero virtual stiffness) and the arm is genuinely transparent to a human hand — orders of magnitude better than any geared, non-torque-sensing arm.
Use in research. The WAM was the standard research arm at MIT, Stanford, CMU, JPL through the 1990s–2010s for haptic, surgical-robotics, and bio-inspired manipulation work. The lineage of “compliant cobot” research, including the modern fad of QDD legged actuators, traces back to the WAM’s design philosophy (low-impedance is a mechanical property first, a control property second).
Why this matters. Two paths to compliance — sense torque rigidly and close a fast loop (Franka), or build the mechanism to be intrinsically backdrivable (WAM, QDD). Modern research often combines both. The WAM remains in service in many labs; Barrett still ships them.
Case C — Intuitive Surgical da Vinci — haptic-feedback teleoperation
The da Vinci surgical platform (Intuitive Surgical, FDA-cleared 2000, da Vinci Xi 2014, da Vinci 5 2024) is the highest-stakes deployment of impedance/admittance teleoperation in production. A surgeon at the master console manipulates two haptic devices (force-reflected hand controllers); the slave manipulator at the patient end carries the actual surgical instrument.
Architecture.
- Master side: 6-DOF haptic devices (Intuitive proprietary, descendants of MIT/JPL work in the 1990s). Voice-coil actuators render force feedback at >1 kHz. Workspace ~150 mm.
- Slave side: 4-arm patient cart; each arm 6+1-DOF, cable-driven, instruments interchangeable.
- Bilateral teleoperation: position-position or position-force control; in current generations the system uses position-position with force estimation from motor currents, not direct F/T sensing at the tool tip (this is the well-known limitation of laparoscopic surgical robots — no real haptic feedback to the surgeon for tissue contact in earlier generations).
- da Vinci 5 (2024) introduced a new force-feedback subsystem on selected instruments — closer to true haptic feedback.
Impedance/admittance role. The master device renders a virtual workspace bounded by virtual walls (impedance against motion outside the safe envelope). The slave operates effectively in admittance mode with stiff position tracking; small motions from the master map to small motions at the tool, with motion scaling (5:1 to 10:1 typical) reducing surgeon hand tremor.
Passivity. Round-trip delay master → control box → slave is < 50 ms typical; well within passive operating range. Passivity is maintained via classical bilateral teleop architecture (Lawrence 1993 “transparency-stability trade-off”). The system trips a safety stop on any communication anomaly.
Why this matters. Surgical robotics is the field where the consequences of getting impedance wrong are not “the part is scrap” but “the patient is injured.” It validates the entire impedance/admittance + passivity framework as production-deployable at FDA-Class-II rigour. The de facto standards for bilateral teleop (wave variables, transparency-stability trade-offs, virtual fixtures) all trace through surgical-robotics literature.
9. Cross-references
Robotics (this library):
[[Robotics/kinematics-dh]]— JacobianJ(q)for mapping joint torques ↔ Cartesian forces.[[Robotics/dynamics-rigid-body]]—M(q),C(q,q̇),g(q), RNEA; everything the impedance controller compensates for.[[Robotics/motors-electric]]— torque-controllable joints (BLDC + FOC) are the hardware prerequisite.- planned
[[Robotics/sensors-force-tactile]]— F/T sensors, joint torque sensors, fingertip tactile arrays. [[Robotics/pid-control]]— the inner loops (current, joint torque, joint velocity) underneath impedance.- planned
[[Robotics/state-space-lqr]]— MIMO alternative; LQR sometimes used instead of PD-impedance for full state regulation. - planned
[[Robotics/end-effectors]]— gripper compliance and contact distribution. - planned
[[Robotics/manipulator-design]]— backdrivability, joint flex, SEA mechanical design. - planned
[[Robotics/safety-standards]]— ISO 10218 / ISO/TS 15066 force-limit derivations. - planned
[[Robotics/teleoperation-haptics]]— wave variables, bilateral control, time-delay compensation.
Engineering (foundations):
[[Engineering/classical-control]]— passivity, Lyapunov, bilateral teleop transparency.[[Engineering/state-space-methods]]— MIMO design framework underlying operational-space control.- planned
[[Engineering/vibration-dynamics]]— passive compliance, RCC, mechanical eigenmodes. - planned
[[Engineering/digital-control]]— discrete-time stability, Z-width, sampled-data passivity. - planned
[[Engineering/realtime-embedded]]— 1 kHz loops, PREEMPT_RT, EtherCAT cycle.
Languages:
- planned
[[Languages/Tier3/robotics-control]]— ros2_control, control_toolbox, cartesian_compliance_controller, cartesian_admittance_controller.
10. Citations
Foundational papers
- Hogan, N. (1985). “Impedance Control: An Approach to Manipulation: Part I—Theory; Part II—Implementation; Part III—Applications.” ASME J. Dynamic Systems, Measurement, and Control 107(1), 1–24. The canonical three-part founding paper.
- Salisbury, J. K. (1980). “Active stiffness control of a manipulator in Cartesian coordinates.” Proc. 19th IEEE CDC, 95–100. The pre-Hogan stiffness-only version.
- Khatib, O. (1987). “A unified approach for motion and force control of robot manipulators: The operational space formulation.” IEEE J. Robotics & Automation 3(1), 43–53. Operational-space mass matrix
Λ(q)and inertia shaping. - Volpe, R. & Khosla, P. (1995). “The equivalence of second-order impedance control and proportional gain explicit force control.” Int. J. Robotics Research 14(6), 574–589. The impedance-vs-admittance choice formalised.
- Colgate, J. E. & Hogan, N. (1988). “Robust control of dynamically interacting systems.” Int. J. Control 48(1), 65–88. Passivity framework for environment interaction.
- Colgate, J. E. & Schenkel, G. (1997). “Passivity of a class of sampled-data systems: Application to haptic interfaces.” J. Robotic Systems 14(1), 37–47. The Z-width / discrete-time passivity bound.
- Hannaford, B. (1989). “Stability and performance tradeoffs in bi-lateral telemanipulation.” Proc. ICRA, 1764–1767.
- Niemeyer, G. & Slotine, J.-J. E. (1991). “Stable adaptive teleoperation.” IEEE J. Oceanic Engineering 16(1), 152–162. Wave variables for time-delayed teleop.
- Lawrence, D. A. (1993). “Stability and transparency in bilateral teleoperation.” IEEE Trans. Robotics & Automation 9(5), 624–637.
- Pratt, G. A. & Williamson, M. M. (1995). “Series elastic actuators.” Proc. IROS 1, 399–406. The canonical SEA paper.
- Albu-Schäffer, A., Ott, C. & Hirzinger, G. (2007). “A unified passivity-based control framework for position, torque and impedance control of flexible joint robots.” Int. J. Robotics Research 26(1), 23–39. DLR LWR-III control framework; ancestry of Franka and iiwa.
- Albu-Schäffer, A., Haddadin, S., Ott, C., Stemmer, A., Wimböck, T. & Hirzinger, G. (2007). “The DLR lightweight robot — Design and control concepts for robots in human environments.” Industrial Robot 34(5), 376–385.
- Whitney, D. E. (1982). “Quasi-static assembly of compliantly supported rigid parts.” ASME J. Dynamic Systems, Measurement, and Control 104(1), 65–77. Foundational RCC theory.
- Bledt, G., Powell, M. J., Katz, B., Di Carlo, J., Wensing, P. M. & Kim, S. (2018). “MIT Cheetah 3: Design and control of a robust, dynamic quadruped robot.” IROS 2018. Academic predecessor of Spot’s leg impedance stack.
- Hurst, J. W. (2019). Series of talks on Cassie / Digit SEA design. (Agility Robotics technical reports.)
Books
- Siciliano, B., Sciavicco, L., Villani, L. & Oriolo, G. (2009). Robotics: Modelling, Planning and Control. Springer. Chapter 9 on force/impedance control.
- Spong, M. W., Hutchinson, S. & Vidyasagar, M. (2020). Robot Modeling and Control (2nd ed.). Wiley. Chapters 8–9.
- Featherstone, R. (2008). Rigid Body Dynamics Algorithms. Springer. Companion for the dynamics in §2.
- Vukobratović, M., Surdilović, D., Ekalo, Y. & Katić, D. (2009). Dynamics and Robust Control of Robot-Environment Interaction. World Scientific.
- Sciavicco, L. & Siciliano, B. (2000). Modelling and Control of Robot Manipulators (2nd ed.). Springer.
- Hokayem, P. F. & Spong, M. W. (2006). “Bilateral teleoperation: An historical survey.” Automatica 42(12), 2035–2057.
Standards
- ISO 10218-1:2025. Robots and robotic devices — Safety requirements — Part 1: Industrial robots. (Revised; supersedes 2011.)
- ISO 10218-2:2025. Robots and robotic devices — Safety requirements — Part 2: Industrial robot systems and integration.
- ISO/TS 15066:2025. Robots and robotic devices — Collaborative robots. Force/pressure limits (Table A.2) for HRC.
- IEC 61508:2010. Functional safety of electrical/electronic/programmable electronic safety-related systems.
Source code & online references
- libfranka — https://frankaemika.github.io/libfranka/, examples
cartesian_impedance_example.cpp,joint_impedance_example.cpp. - franka_ros2 — https://github.com/frankaemika/franka_ros2.
- ros2_control — https://control.ros.org/;
cartesian_compliance_controller,cartesian_admittance_controller. - Drake — https://drake.mit.edu/;
OperationalSpaceControllerLeafSystem. - Pinocchio — https://stack-of-tasks.github.io/pinocchio/.
- KUKA Fast Research Interface (FRI) — KUKA Sunrise.Connectivity documentation (proprietary; partner-access).
- HEBI Robotics X-series API — https://docs.hebi.us/.
- MJBots moteus controller — https://github.com/mjbots/moteus.
- Force Dimension SDK — https://www.forcedimension.com/.
Session log appended via:
node ~/.claude/bin/obsidian-research.mjs log "Built Robotics/impedance-control.md Tier 1 deep note"