Skip to content

Statics and dynamics ​

Statics asks which joint torques hold a load still. Dynamics adds the torques that accelerate masses. Together they tell you whether a servo is strong enough and how hard each part is loaded. This page derives τ=J⊤F from virtual work, explains the leverage of the Strido knee linkage, and compares the torque the robot needs with the torque its servos can give.

In Strido

  • Servo limits: SPT5435LV-180W, stall torque 3.43Nm at 6V (hardware/strength.yaml), no-load speed 0.14s/60∘ (servos).
  • Mass: 3.07kg including the battery and the wiring harness; per-link masses in ros2/strido_description/config/mass_report.yaml.
  • Linkage forces: packages/strido-verify/src/strido_verify/strength.py sweeps the knee linkage at stall. Results are in docs/verification/data/strength.json, explained in strength.
  • Simulation: MuJoCo clamps every actuator to ±3.432Nm (models/mujoco/strido.xml).

Virtual work and τ=J⊤F ​

Suppose the foot pushes on the ground with force F, and the ground pushes back with −F. Hold the leg still and imagine a tiny joint motion δq. The foot moves by δp=Jδq (see kinematics). In equilibrium, with no friction, the work done by the joints equals the work delivered at the foot:

τ⊤δq=F⊤δp=F⊤Jδq

This must hold for every δq, so:

τ=J⊤F

Two consequences:

  • At a singularity, J loses rank. Some foot forces then need no joint torque at all: a straight leg carries a load along its length "on the bones". At the same time, the leg cannot push in the lost direction.
  • Velocity gain and force gain trade off. Where a joint moves the foot fast (large Jacobian entries), it pushes weakly, and the other way round.

The same argument works for any mechanism with one input and one output. If the output angle changes by δθout=Gδθin, then the output torque is τout=τin/G.

Mechanical advantage of the knee drive ​

The knee servo reaches the tibia through two linkages (see kinematics). For a link that carries force F along its length, only the perpendicular part of F acts on a crank of radius r:

τ=Frsin⁡α

Here α is the angle between the crank and the link. strength.py chains this rule through the drive:

Fshort=τservorarmsin⁡α,τcrank=Fshortrcrank,asin⁡α′,Flong=τcrankrcrank,bsin⁡β,τknee=Flongrkneesin⁡γ
  • Parallelogram. Opposite sides are equal (rarm=rcrank,a=24.0mm), so α′=α and τcrank=τservo. The ratio is 1:1. The link force Fshort, however, grows as 1/sin⁡α.
  • Four-bar. The torque ratio isτkneeτcrank=rkneesin⁡γrcrank,bsin⁡βand it changes with the pose. When the transmission angle β or γ approaches 0 or 180∘, the forces become very large or the drive loses all leverage. That is why the joint limits require at least 25∘ (hardware/joint_limits.yaml).

Sweeping every pose inside the limits with the knee servo at stall, the worst cases (docs/verification/data/strength.json) are 211N in the short link, 192N in the long link and 3.07Nm at the knee.

Dynamics: inertia and Newton–Euler ​

Moving bodies need more torque. For a single rigid body, the Newton–Euler equations are:

F=mc¨,τc=Icω˙+ω×Icω

Here c is the centre of mass and Ic the 3×3 inertia tensor about it. For a link turning about a fixed axis, the parallel-axis theorem gives the inertia about the axis, I=Ic+mrc2, with rc the distance from the axis to the centre of mass. Then τ=Iθ¨.

Chaining Newton–Euler through every link yields the standard manipulator equation:

M(q)q¨+C(q,q˙)q˙+g(q)=τ+J⊤Fext

The terms are: the mass matrix M, the Coriolis and centrifugal terms C, gravity g, and contact forces through J⊤. MuJoCo solves exactly this every 2ms. Each Strido joint also has armature="0.012" (kgm2) added to its diagonal of M. Armature models the gearbox: a rotor of inertia Ir behind a reduction N appears at the output as N2Ir.

Power and the torque–speed line ​

Mechanical power is P=τω. A DC servo motor roughly follows a straight torque–speed line. It gives full stall torque τs at zero speed and zero torque at no-load speed ω0:

τ(ω)≈τs(1−ωω0)⇒P(ω)=τsω(1−ωω0),Pmax=τsω04 at ω=ω02

For the SPT5435LV at 6V:

ω0=π/30.14s=7.48rad/s,Pmax≈3.43⋅7.484=6.4W

The linear line is a model; the datasheet gives only the two end points. A servo can deliver full torque or full speed, never both at once. The firmware caps joint speed at 6rad/s (MAX_JOINT_SPEED_RAD_S in strido/policy.py, mirroring safety.h). At that speed the line leaves only about 3.43(1−6/7.48)≈0.68Nm.

Worked example: holding the stand pose ​

At the stand pose (q2=46.5∘, q3=−96.0∘, foot straight below the hip, 0.17m down), the planar Jacobian is (see kinematics):

Jplane=[−0.170−0.08060−0.0943]m/rad

With four feet down, each foot carries a quarter of the weight:

Fv=3.07⋅9.814=7.53N

The foot pushes down on the ground, so with the convention above F=(0,−7.53)N in (u,v) (the ground pushes back with +7.53N). The joint torques that hold it are:

τ=J⊤F=[−0.1700−0.0806−0.0943][0−7.53]=[00.71]Nm

The thigh needs no torque, because the foot is straight under its pivot and the load passes through the joint. The knee needs +0.71Nm, matching MuJoCo, where the front-left knee actuator holds the stand pose with 0.688Nm (see also servos).

Through the four-bar, ∂q3/∂ψ=−1.12 at this pose. Virtual work then gives the knee-servo torque:

τψ=τq3∂q3∂ψ=0.71⋅1.12=0.80Nm

As a cross-check, the lever-arm rule with the transmission angles 84∘ and 86∘ gives a ratio of 24.0sin⁡86∘26.9sin⁡84∘=0.89≈1/1.12. The knee servo's 0.80Nm is about 23% of its 3.43Nm stall torque. A trot puts the weight on two feet instead of four, roughly doubling the load to about 1.6Nm, which still leaves about a factor of two for accelerations and stumbles.

Dynamics check. The calf weighs 0.0521kg with its centre of mass about 48mm from the knee. That gives mrc2≈1.2×10−4kgm2; with the calf's own inertia about its centre of mass (1.5×10−4, mass_report.yaml) the knee sees about 2.7×10−4kgm2, roughly 1/44 of the modelled armature. Swinging a light leg is therefore limited by speed and by the servo's own rotor, not by the link's inertia.

Landing. strength.py assumes a hard landing of 3× body weight on one diagonal pair:

F=3⋅3.07⋅9.812=45.2N

per foot. Acting on the 124mm tibia, that is 5.60Nm at the knee, more than stall. So a landing back-drives the servo, and the printed parts must take it. See strength.

Check yourself ​

  1. Derive τ=J⊤F in one line from virtual work.
  2. Why does the parallelogram not change the torque, yet can still overload the short link?
  3. Why does the thigh need almost no torque in the stand pose?
  4. Can the servo deliver 3.43Nm while turning at 6rad/s?
Answers
  1. τ⊤δq=F⊤Jδq for all δq, so τ=J⊤F.
  2. Its input and output cranks are equal, so the sin⁡α terms cancel in the torque ratio. The link force is τ/(rsin⁡α), though, and it grows without bound as α→0.
  3. The foot is directly below the thigh pivot (u=0), so the vertical force has no lever arm about it. In the Jacobian, J21=0.
  4. No. Under the linear model, about 0.7Nm is left at 6rad/s. Stall torque exists only at zero speed.

Further reading ​

  • K. M. Lynch and F. C. Park, Modern Robotics, Cambridge University Press, 2017, ch. 5.2 (statics) and ch. 8 (dynamics of open chains).
  • R. Featherstone, Rigid Body Dynamics Algorithms, Springer, 2008.
  • B. Siciliano et al., Robotics: Modelling, Planning and Control, Springer, 2009, ch. 3.8 and 7.
  • R. L. Norton, Design of Machinery, McGraw-Hill (linkage force analysis, transmission angle).
  • Strength of the printed parts and servos in this wiki.

MIT licence. Mechanical design derived from Yertle by Jerome Graves. CAD, simulation and native tests are not hardware evidence — see Verification.