Robotics: The Stiffness Problem

· Medium ·

7 min read Original article ↗

Hasan Amin

You’re walking down the street on a cold winter’s day. You have some old trainers on, a little worse for wear. The wisps of your breath betray the fact you wish you’d found your gloves before leaving home. Your foot catches an icy drain and you slip, catching yourself before hobbling for the next couple of steps, allowing time for the pavement to regain your trust.

You are a tennis player, chasing down a ball to hit a forehand. If you strike this shot right, you’ll hit it over the net and it will drop just out of reach of your opponent. It’s not just the contact point that matters: you want a relaxed swing from the feet through your trunk, allowing the racquet to whip forwards at the moment your arm stiffens. Any mistake in this kinetic chain will lose you the point.

Press enter or click to view image in full size

Arm with its actuators: the biceps and triceps. These alternate between agonist and antagonist depending on the motion.

Joints, agonists and antagonists

In the mammalian body, joints are actuated by muscles. Our forearm is articulated at the elbow: the biceps raise it and the triceps lower.

Most skeletal muscles that move joints do work in opposing pairs. The leg similarly has the quadriceps and the hamstrings. In doing work, one muscle acts as the agonist (flexor) and the other as the antagonist (extensor).

If we lift an unstable object with our arm, the biceps is the agonist, and the triceps can resist the work of the biceps to modulate joint stiffness. This means for a given torque required to move a specific load, there are effectively an infinite range of force values that can be exerted by the same two muscles. You intuit this already: walk on an icy lake and you’ll be moving the same load of your body as on solid ground, but in an awkward waddle, hoping to avoid disturbances during slips. When both muscles fire simultaneously to increase stiffness, we call this co-contraction.

Disturbances: why we need to modulate stiffness

As animals, sometimes we need to be stiff to reject disturbances. Other times, we need fluidity for fast movements. Principally, we need to modulate stiffness in order to cope with a variety of situations.

Traditional robot actuators (think robot arms) almost achieve this. If they’re running position control, each motor is trying to hit an angle that you set. We can go further by introducing force control, where the arm detects disturbances and allows compliance.

Nevertheless, this mostly presents as a software fix for a hardware problem. The gearboxes used for electric motors can multiply torque by over 100 times. They need this to produce useful output torques: motors are usually designed around high rotation speeds and low torques, but robotic limbs present as the opposite scenario entirely. Gearboxes are hard to backdrive: friction increases with the gear ratio and inertia with the square of it. Accordingly, these types of robots are too mechanically rigid to feel small forces like animals can.

The mathematics of disturbance rejection

So how do muscles, or motors, decide how to resist input forces?

Let’s recall Newton’s Second Law:

(1)

When applied to rotational motion, we get:

(2) where τ is the net torque at a joint, I is the rotational intertia of the limb, and θ̈ is the angular acceleration

Our net torque is the sum of what the actuator commands (τ_a), and whatever torque the environment imposes (τ_ext)

(3)

Usually, we don’t hold a robot arm at a specific angular set point — we want it to move through multiple angles, as a function of time. We call this our trajectory, and it’s key to understand how we can follow this trajectory even under disturbance. This is the impedance of the system:

(4) where θ is the desired joint angle, K is the stiffness — or our strongly our joint resists angular displacement, and B is the damping — or how strongly our joint resists angular velocity. θ̇ is our angular velocity, and θ_0 is our starting joint angle

Just an aside for intuition: our rotational stiffness here measures how much a unit displacement is resisted. Imagine compressing a spring: the more you compress it, the more resistance you feel. Damping is a function of velocity: if you drag your hand through water, the position of your hand doesn’t matter; only how fast you move it.

If we substitute (4) into (3) we get the equation for a damped rotational spring, modelling our robot joint:

(5)

When nothing pushes on our joint, (τ_ext = 0), our robot settles to an angle of 0. When something does push, the displacement depends on the ratio τ_ext/K. The higher K, our stiffness, the less disturbance we observe.

Why agonist–antagonist pairs aid disturbance rejection

Consider the elbow, actuated by a biceps force f_b and a triceps force f_t, each with moment arms r_b and r_t.

Remember, torque is a force applied over some distance:

(6) where F is force and d is distance

The elbow joint torque is given by:

(7)

Meanwhile, we can estimate the stiffness of our elbow joint. Each muscle i has a stiffness k_i that we model as a force drop per unit stretch:

(8)

Muscles actually act as non-linear springs but we can linearise around any given operating point. If the arm rotates a small amount, by the arc length formula the change in length is given by:

(9)

The change in force is therefore given by:

(10)

But remember we’re after the torque contribution, which is given by a subsequent multiplication by distance:

(11)

If we sum the torque contributions from all muscles, in this case the biceps and triceps:

(12)

The total joint stiffness is therefore:

(13)

The net torque is set by the difference (eq. 7) between the two forces of the biceps and the triceps but the stiffness is set by their sum (eq. 13).

This is the key difference between fluid walking on dry pavement versus your rigid gait on a slippery surface: the same net joint torques are present, but stiffness is higher.

Reflected inertia and the problem with gearboxes

For a motor with a gearbox of ratio N, the motor will have some inertia I_motor. I_reflected is the inertia the joint feels like from the joint side of the gearbox.

The kinematic constraint of the gearbox means that if the motor spins by some θ, the motor has to spin N times faster. By conservation of energy:

(14)
(15)

Eq. 15 shows that if we use a motor in a robot arm with a ratio of 100, a joint would feel 100,000 times the motor’s own inertia.

A small disturbance, like you might feel playing tennis or walking on ice, is absorbed by this reflected inertia before any encoder or sensor can measure it.

MIT’s Cheetah or some of the humanoids you see will use direct drive motors, to avoid the issues inherent in gearboxes and allow better force control. But this doesn’t fully address the stiffness problem: they rely on active control, meaning any controller has to sense a disturbance to reject it, so any disturbance faster than the control loop can’t be rejected (think of those videos where people kick over a robot). With a single actuator, stiffness is virtual and control-dependent, whereas mammalian co-contraction provides an intrinsic mechanical stiffness that is instantaneous, and slightly better at resisting kicking.

Solving the stiffness problem

This article is to be continued, but three solutions present themselves:

  1. Lowering/eliminating N: a lower gear ratio, or direct drive, in systems with higher torque motors, reduce reflected inertia.
  2. Series elastic actuators: we can add mechanical capacitance to systems, with springs that allow deflection and the measurement of this deflection to sense disturbing torques.
  3. Variable-stiffness actuators: we can provide a mechanical analogue to co-contraction, by using two actuators per joint, just like skeletal muscles.