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’s cartesian_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) impedanceK, B are 6×6 matrices in task space. Standard for manipulation tasks.
  • Joint impedanceK, B diagonal in joint space. Simpler; used for gravity-comp / hand-guiding modes.
  • Variable impedanceK(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.

  1. Approach: free-space Cartesian impedance with low K_xy = K_z = 200 N/m. Robot drifts under hand-guiding.
  2. First contact: K_z ramps to 5000 N/m over 100 ms while the controller monitors F_z.
  3. Search: command a spiral motion in x-y of radius 2 mm, period 0.5 s, at low K_xy = 100 N/m. Lateral force deflects the spiral path; chamfer captures the peg.
  4. Drop-in detection: watch F_z for a sudden drop (>2 N decrease in 50 ms — peg fell off the rim of the hole). Trigger phase 5.
  5. Insert: high K_z, low K_xy = 50 N/m (slip lubrication), command x_d.z += 25 mm over 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

CriterionImpedanceAdmittance
Robot typeTorque-controllable (joint torque sensors)Position-controlled (industrial servos)
HardwareFranka, KUKA iiwa, Kinova Gen3, custom QDDUR, ABB, Fanuc, Yaskawa, Doosan position mode
Contact stiffness suitedLight/medium (Volpe-Khosla 1995)Heavy/stiff contact, press-fit
Latency toleranceTight inner loop required (1 kHz+)Wraps existing 8–125 ms position loop
F/T sensor neededOptional (joint torque sensors substitute)Mandatory (wrist-mount)
Free-space behaviourNaturally backdrivableSluggish (admittance filter dynamics)
Implementation effortNeed full dynamics modelF/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

PhaseTranslational K (N/m)Rotational K (N·m/rad)Notes
Free-space motion50 – 20010 – 50”Float” — robot follows the commanded path without fighting small disturbances
Approach to contact200 – 50020 – 100Compliant enough to absorb first contact
Tracking with contact500 – 2 00050 – 200Light polishing, wiping
Press / push / insert2 000 – 20 000200 – 500Stiff in the insertion direction; lateral often stays compliant
Hand-guiding (zero-G)≤ 10≤ 5Effectively 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 B or reduce K.
  • 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)

RobotPayloadJointsReachTorque sensorsNative impedance API
Franka Emika Panda / FR33 kg7855 mmPer-joint strain gaugelibfranka + franka_ros2 cartesian_impedance_example, joint_impedance_example
KUKA LBR iiwa 7 / 14 R8207 / 14 kg7800 / 820 mmPer-joint cross-flexure strain gaugeFRI (Fast Research Interface), JointImpedanceController, CartesianImpedanceController in Sunrise.OS
Kinova Gen3 / Gen3 lite4 / 0.5 kg7 / 6902 / 760 mmPer-joint torque sensingKortex API LowLevelControl torque mode
KUKA LBR Med7 kg medical-certified7800 mmSame as iiwaFRI Med

Admittance-mode add-ons (position-controlled robot + F/T sensor)

RobotAdd-onComment
UR3e / UR5e / UR10e / UR16e / UR20Built-in force_mode() URScript primitiveAdmittance under the hood; FT300 / built-in joint current observer for force estimation
ABB GoFa CRB 15000 / CRB 1100SoftMove optionAdmittance with optional external ATI F/T
Yaskawa HC10/HC20FunctionAddOn force controlAdmittance
Doosan A0509 / M0609 / M1013Position or torque mode; set_compliance_ctrl() APIHybrid
Fanuc CRX-10iAForce Sensor Function packageAdmittance + payload ID
Techman TM5 / TM12Built-in compliance modeVision-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)

ImplementationHardwareCompliance type
Boston Dynamics SpotProprietary leg actuatorsSEA per joint
Agility Robotics Cassie / DigitProprietary harmonic + leaf-spring SEASEA
ANYbotics ANYmalANYdrive (BLDC + harmonic, joint torque sensor)Rigid + active impedance
MIT Mini Cheetah / Unitree A1 / Go1 / Go2T-Motor AK-series quasi-direct-driveQDD (low gear ratio, intrinsic backdrivability)
MJBots qdd100 / moteusT-Motor / MAD frame BLDC + integrated FOCQDD
HEBI Robotics X5 / X8Modular SEA modules with bus interfaceSEA
Berkeley Open Robotics OpenSEAOpen-hardware reference SEASEA
Sarcos Guardian XO exoskeletonHydraulic SEAHydraulic compliance

Haptic devices

DeviceWorkspaceMax forceUpdate rateUse
3D Systems Touch160×120×70 mm3.3 N1 kHzEducation, light VR
3D Systems Touch X160×120×70 mm7.9 N1 kHzSurgical training, VR
Force Dimension omega.3160×160×110 mm12 N4 kHzSurgical-robot master
Force Dimension omega.6 / 7+ rotation + grip12 N4 kHzHigh-end teleop
Geomagic Touch (legacy)160×120×70 mm3.3 N1 kHzReplaced by Touch
HaptX Gloves G1Per-finger4 N/finger200 HzIndustrial VR

Software libraries & frameworks

  • libfrankacartesian_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) — OperationalSpaceController LeafSystem; 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

ApplicationTranslational K (N/m)Rotational K (N·m/rad)Damping ζ
Free space / hand-guiding0 – 500 – 100.5 – 1.0
Light surface contact (polish, wipe)200 – 1 00020 – 1000.7
Insertion (peg-in-hole) z-axis3 000 – 10 000100 – 3000.7 – 1.0
Press-fit / drill5 000 – 20 000200 – 5001.0
Surgical interaction100 – 1 00010 – 100≥ 1.0
Haptic virtual wall2 000 – 30 000100 – 1 000≥ 0.7

Cobot family impedance capability matrix

Robot familyJoint torque sensingNative impedanceAdmittance fallbackTypical impedance rate
Franka FR3 / Pandayesyes (libfranka)n/a1 kHz
KUKA iiwa 7/14yesyes (FRI)n/a1 kHz
Kinova Gen3yesyes (Kortex)n/a1 kHz
UR e-series / UR20no (current observer)partial via force_modeyes (FT sensor)125–500 Hz
ABB GoFa CRB 15000nonoyes (SoftMove + FT)250 Hz
Yaskawa HC10/20nonoyes (FunctionAddOn + FT)250 Hz
Fanuc CRX-10iAnonoyes (Force Sensor option)125 Hz
Doosan A/M-seriespartialyes (compliance_ctrl)yes250 Hz
Techman TM5/12nopartialyes250 Hz

SEA implementations in production robots

RobotJoint spring K_s (N·m/rad)Bandwidth (Hz)Source
Boston Dynamics Spot leg≈ 800~20BD release notes 2019
Agility Cassie/Digit1 000 – 1 50030–50Hurst et al. 2019
HEBI Robotics X5-9 module80025HEBI datasheet
Sarcos Guardian XOhydraulic equivalent10–20Sarcos technical brief
Edinburgh Centaur (ANYmal predecessor)60015Hutter et al. 2016
MIT Cheetah 3 (rigid + impedance)∞ (rigid)100+Bledt et al. 2018

Haptic device specs (selected)

DeviceDOF activeMax force (N)Resolution (µm)Update (kHz)
3D Systems Touch33.3551.0
3D Systems Touch X37.9231.0
Force Dimension omega.331294.0
Force Dimension omega.6612 (trans)94.0
Force Dimension omega.77 (+grip)1294.0
Quanser HD²619.785.0

ISO/TS 15066:2025 quasi-static collision force limits (Table A.2 excerpt)

Body regionQuasi-static F_max (N)Transient F_max (N)Pressure quasi-static (N/cm²)
Skull / forehead13017530
Face659020
Neck (sides)15019050
Upper arm15019070
Hand / fingers (back)140280140
Abdomen11022020
Thigh25050080

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-workspace3 – 80.05 – 0.3
KUKA iiwa 7 mid-workspace4 – 100.1 – 0.5
UR5e mid-workspace6 – 140.1 – 0.6

7. Failure modes & debugging

SymptomLikely causeFix
Sustained oscillation on contactK too high relative to B (under-damped)Raise B until ζ ≈ 0.7; or reduce K
Buzzing / chattering at restSensor noise feedback through K_d or B_dFilter , F_ext; reduce N in derivative filter
Slow drift away from x_d under steady external forceNo integral term in impedance; gravity errorAdd tiny K_i cautiously; verify gravity-comp tool mass
F/T sensor saturates during contactUnderspec’d sensorMove to higher-range sensor; reduce contact force; pre-load with admittance
Lost contact detection (false negative)Compliance/flex between sensor and contact pointAdd hysteresis; or move sensor closer to contact (e.g. fingertip force)
Unstable virtual wall (telop)Passivity violated by delayWave variables (Niemeyer-Slotine); reduce K within K·T_s ≤ 2·B bound
Cartesian impedance feels “heavy” along one axisOperational-space Λ(q) anisotropic at this poseInertia 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 versaVerify frame convention in libfranka / KUKA FRI docs; transform K_d by R^T·K_d·R
Drift after tool changeGravity model uses old tool massUpdate m_tool, c_tool, I_tool; re-zero F/T sensor with new tool
Joints fight each other in joint impedanceOff-diagonal C(q,q̇)·q̇ neglected at high speedAdd Coriolis comp; or reduce trajectory speed
Audible whine, current spike on contactK_d exciting a structural modeNotch-filter at the resonance; reduce K_d in that axis
Robot “ghost-pushes” in free spaceM_d < Λ shaped without inertia feedbackCap M_d ≥ Λ_min; verify F_ext signal is active
Sticky behaviour at low speedJoint stiction below sensor floorCoulomb friction feedforward; or accept floor and don’t servo below it
Discretization-induced loss of passivityT_s too long for chosen KIncrease loop rate; or reduce K to satisfy K·T_s ≤ 2·B

Detailed failure modes

  1. Contact oscillation is the canonical “did I get impedance right?” failure. The mass-spring-damper has two parameters that fight: K for response, B for damping. A new user picks K = 5000, B = 50 and the robot rings at ~50 Hz against the workpiece. Compute ζ = B / (2·√(K·M_eff)); for M_eff = 5 kg, ζ = 50/(2·158) ≈ 0.16 — wildly under-damped. Fix: B = 2·0.7·√(K·M_eff) ≈ 220 N·s/m.

  2. Integrator drift in admittance loops. The admittance filter M_d·ẍ_c + B_d·ẋ_c + K_d·x_c = F_ext + K_d·x_d accumulates floating-point drift over hours; the commanded position slowly walks away from the trajectory even with F_ext = 0. Production fix: leak the integrator (x_c ← α·x_c + (1−α)·x_d with α = 0.999) or periodically re-anchor to the reference when contact is lost.

  3. 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).

  4. 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 = 50 for hand-guiding. Fix: route cables through a compliant strain relief; or measure and subtract the cable load.

  5. Discrete-time Z-width violation. K·T_s > 2·B makes the loop generate energy between samples. On a Franka at 1 kHz with B = 50 N·s/m, the limit is K_max = 100 000 N/m. Try K = 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.

  6. 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: include C(q,q̇)·q̇ in the torque path (Pinocchio RNEA call, ~30 µs on modern x86).

  7. 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 for J^⊤-based torque mapping; cap Λ element-wise; or stay away from singularities at the planner level.

  8. Cobot HRC over-stiffness. Tuning impedance for fast pick-and-place yields K = 5000 N/m and 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.

  9. Hand-guiding fights gravity. The user sets K_d = 0 to 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 expose setLoad/identifyPayload); or run a momentum-observer to estimate residual gravity online.

  10. 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]] — Jacobian J(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


Session log appended via:

node ~/.claude/bin/obsidian-research.mjs log "Built Robotics/impedance-control.md Tier 1 deep note"