Force control and hybrid motion/force
Impedance lets the arm be soft. Force control makes it push with exactly the right force. Hybrid combines them — position-controlled on some axes, force-controlled on others. The architecture behind real industrial assembly.
Impedance control says "be a programmable spring." Force control says "exert exactly 5 N." Different specs, different controllers. Most production assembly tasks need both at once: position-controlled along the planned trajectory, force-controlled where the part contacts. That's hybrid motion/force control, the architecture behind every UR arm doing peg-in-hole and every polishing robot.
What "force control" actually means
Direct force control: measure the force at the end-effector via an F/T sensor, compare to a setpoint, command the arm to drive the error to zero.
That's a force-on-force PID, with the proportional and integral terms on force error. The output is a desired contact force; the underlying joint controller (typically inverse-dynamics or impedance) realizes it.
The integral term matters: real F/T sensors have offsets and drift, and you need force tracking to settle to the setpoint with zero steady-state error.
Why pure force control is rarely the answer
Free-space motion under pure force control is undefined: with no environment to push against, force is zero, and the controller's "increase the integral" loop drifts indefinitely. You always need something else when the arm isn't in contact:
- Position or velocity control during approach
- Force control on contact
- Switch logic to pick which mode is active
That's hybrid control.
Hybrid motion/force: the selection-matrix formulation
Raibert and Craig's classical formulation: pick which DOF is force-controlled and which is position-controlled at every instant. A diagonal selection matrix S chooses:
If S is diagonal with 1 on axes you want force-controlled and 0 on axes you want position-controlled, the output blends them. Joint torques are computed via the Jacobian as usual.
Concrete example — peg-in-hole insertion along the z-axis:
| Axis | Mode | Why |
|---|---|---|
| x, y | Position (high stiffness) | Keep the peg aligned with the hole |
| z (insertion) | Force (downward setpoint) | Push with constant force; speed is whatever the contact allows |
| roll, pitch | Force (zero torque) | Comply with hole orientation; don't fight |
| yaw | Position | Maintain part orientation around insertion axis |
Three position-controlled axes, three force-controlled axes, all running simultaneously. Same arm, same control rate.
The frame question (don't get this wrong)
The selection matrix is frame-dependent. Position-control x, force-control z: that's the task frame, not the world frame. As the arm orientation changes during insertion, the selection axes rotate with the task. Modern implementations (Khatib's operational space framework, ros2_control's CartesianForceController) parametrize the selection in the task frame and rotate it.
Sloppy implementations use the world frame and break when the part isn't axis-aligned with the world.
The hardware path
- F/T sensor at the wrist — ATI Mini40, OptoForce, Robotous. Six-axis force-and-torque measurement. $1500–8000 commercial; cheaper open-source options exist (e.g. F/T sensors using strain gauges + ESP32).
- Estimated force from joint torques — torque-controlled arms (Franka, KUKA LBR) can estimate end-effector force from inverse Jacobian; quality depends on dynamic model accuracy.
- Tactile sensor — GelSight, DIGIT for contact-patch level, but rarely used for high-rate force control. More for slip detection.
Force control gotchas
- Contact instability: when transitioning into contact, force jumps. Filter the force signal aggressively (~50 Hz low-pass) and ramp the setpoint instead of stepping it.
- Sensor zeroing: re-zero the F/T sensor in free space before every task — drift accumulates over hours.
- Gravity compensation: the F/T sensor reads the weight of whatever's mounted between the sensor and the contact point. Subtract that out, otherwise the controller thinks the gripper is permanently being pushed.
- Jerk on disengage: when contact breaks, force suddenly goes to zero; integral term can saturate; arm flails. Reset integral on contact loss.
Common force-control tasks in production
- Peg-in-hole assembly (canonical example, every UR arm in factories does this).
- Polishing / sanding (constant normal force, lateral motion).
- Deburring (force-controlled tool against an irregular surface).
- Surgery (haptic force constraints, "don't push harder than X N into tissue").
- Door opening (force-control along door arc, position-control on tangent).
How learning fits in
2024–26 RL/imitation work increasingly bypasses explicit hybrid control: a single neural policy outputs joint torques given proprioception + vision. The policy implicitly learns when to be position- or force-dominant. Works when you can collect enough demos.
For tasks where you can specify forces precisely (industrial assembly with known geometry, tight tolerances), explicit hybrid control still wins on robustness and explainability. Hybrid + a learned residual is increasingly the production pattern.
Exercise
In MuJoCo, simulate a 6-DOF arm pressing a peg into a slightly misaligned hole. First try pure position control — the peg either misses or jams. Now implement hybrid: position on x/y/yaw, force on z (5 N down) and roll/pitch (0 Nm). Watch the arm find the hole, feel its way in, and seat the peg. The same controller works across a 5° range of hole misalignments. That's the practical magic of hybrid control.
Next
Visual servoing — closing the control loop directly on camera features instead of joint state.
Comments
Sign in to post a comment.