This post explains how the kinematics and forces of tendon-driven robots (sometimes used interchangeably with “musculoskeletal robots”) can be modelled- I believe this should be standard knowledge for anyone designing or controlling such tendon-driven structures.

This is a blog post version of the lecture notes that I created for teaching the Soft and Biohybrid Robotics course at ETH Zurich. The LaTeX source for the original lecture notes can be viewed here on Overleaf or on GitHub.

Goal: derive the joint-torque / tendon-force relation \(\mathbf{\tau} = -\mathbf{J}_m(\mathbf{q})^\mathsf{T} \mathbf{f}\) and understand how it connects to standard robot Jacobians and dynamics.

Setup and notation

Tendon-driven actuation schematic showing the joint coordinate q and tendon length l
Figure 1: Tendon-driven actuation schematic, showing the joint coordinate \(q\) and tendon length \(l\).

Let

Sometimes \(m\) does not actually correspond to the number of motors, since more than one tendon could be attached to one motor (i.e. one motor drives one antagonistic pair). However, to avoid confusion, we will ignore this detail for now and assume only one tendon is attached to each motor.

We define the tendon Jacobian as

\[\begin{split} \mathbf{J}_m(\mathbf{q}) &\triangleq \frac{\partial \mathbf{l}}{\partial \mathbf{q}} \\ &= \begin{bmatrix} \dfrac{\partial l_1}{\partial q_1} & \dfrac{\partial l_1}{\partial q_2} & \cdots & \dfrac{\partial l_1}{\partial q_n}\\ \dfrac{\partial l_2}{\partial q_1} & \dfrac{\partial l_2}{\partial q_2} & \cdots & \dfrac{\partial l_2}{\partial q_n}\\ \vdots & \vdots & \ddots & \vdots\\ \dfrac{\partial l_m}{\partial q_1} & \dfrac{\partial l_m}{\partial q_2} & \cdots & \dfrac{\partial l_m}{\partial q_n} \end{bmatrix} \in \mathbb{R}^{m \times n}. \end{split}\]

i.e., row \(i\) of \(\mathbf{J}_m\) tells you how tendon \(i\)’s length changes when each joint is slightly moved. Column \(j\) tells you how all tendon lengths change when joint \(j\) moves.

What is a Jacobian (and why do roboticists love it)?

A Jacobian is the matrix of first derivatives of a vector-valued function. If \(\mathbf{y} = \mathbf{y}(\mathbf{x})\) with \(\mathbf{y}\in\mathbb{R}^p\) and \(\mathbf{x}\in\mathbb{R}^n\), then the Jacobian is

\[\mathbf{J}(\mathbf{x}) = \frac{\partial \mathbf{y}}{\partial \mathbf{x}} \in \mathbb{R}^{p\times n}.\]

Its key role is local linearization, allowing a linear mapping between velocities in different spaces:

\[\dot{\mathbf{y}} = \mathbf{J}(\mathbf{x})\,\dot{\mathbf{x}}.\]

Classic robot example. For an end-effector pose \(\mathbf{x}(\mathbf{q})\), the manipulator Jacobian \(\mathbf{J}(\mathbf{q}) = \frac{\partial \mathbf{x}}{\partial \mathbf{q}}\) (this is usually what roboticists mean when they say “Jacobian”) maps joint velocities to task-space velocities:

\[\dot{\mathbf{x}} = \mathbf{J}(\mathbf{q})\,\dot{\mathbf{q}}.\]

For tendon kinematics. Here, the “output” is tendon length, thus the tendon Jacobian \(\mathbf{J}_m\) relates joint velocity to tendon velocity (rate of change of tendon length):

\[\dot{\mathbf{l}} = \mathbf{J}_m(\mathbf{q})\,\dot{\mathbf{q}}. \tag{1}\]

The Jacobian is essential not just for relating velocities between different spaces (end-effector pose \(x\), joint angle \(q\), tendon length \(l\)), but also generalized forces in each space (end-effector force \(f_x\), joint torque \(\tau\), tendon tension \(f\)), as we will explore next.

Deriving \(\mathbf{\tau} = -\mathbf{J}_m^\mathsf{T} \mathbf{f}\) via power consistency

For an ideal (lossless) transmission, tendon power equals joint power (with a minus, because tension works in the direction to shorten tendon length):

\[\underbrace{\mathbf{\tau}^\mathsf{T} \dot{\mathbf{q}}}_{\text{joint power}} = -\underbrace{\mathbf{f}^\mathsf{T} \dot{\mathbf{l}}}_{\text{tendon power}}\]

where the sign reflects that a positive tendon tension works in the direction to shorten \(l\). Substituting Eq. (1) gives

\[\mathbf{\tau}^\mathsf{T} \dot{\mathbf{q}} + \mathbf{f}^\mathsf{T} \mathbf{J}_m\,\dot{\mathbf{q}} = \left(\mathbf{\tau} + \mathbf{J}_m^\mathsf{T} \mathbf{f}\right)^\mathsf{T} \dot{\mathbf{q}} = 0.\]

Since this must hold for any \(\dot{\mathbf{q}}\), we obtain the fundamental mapping

\[\boxed{\mathbf{\tau} = -\,\mathbf{J}_m(\mathbf{q})^\mathsf{T} \mathbf{f}.} \tag{2}\]

This relates tendon forces to joint torque. Note that this does not model any friction, tendon slack, hysteresis, or tendon stretching. More detailed models must be introduced to account for those, and are not covered here.

Example: simplified case when \(\mathbf{J}_m\) becomes diagonal with a pulley routing

Tendon routed around a pulley at the joint
Figure 2: Tendon routed around a pulley at the joint.
Robot with pulleys at the joint
Figure 3: Example of a robot with pulleys at the joint. [1]

A common routing is a tendon wrapped around a joint pulley of radius \(r\). Assume a single-DOF joint angle \(q\) and a tendon whose free length changes linearly with angle:

\[l(q) = l_0 - r\,q. \tag{3}\]

Then

\[J_m = \frac{\partial l}{\partial q} = -r.\]

If each joint \(q_j\) has its own tendon routed on a pulley with constant moment arm \(r_j\), and tendon \(j\) only couples to joint \(j\), then

\[\mathbf{J}_m(\mathbf{q}) = \begin{bmatrix} -r_1 & 0 & \cdots & 0 \\ 0 & -r_2 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & -r_n \end{bmatrix} = -\operatorname{diag}(r_1,\dots,r_n).\]

Thus \(\mathbf{J}_m\) is diagonal, and the mapping is trivially decoupled to each DOF:

\[\tau_j = r_j f_j.\]

However, for most other tendon layouts, \(\mathbf{J}_m\) is a non-diagonal matrix that changes nonlinearly as the joint pose \(q\) is changed.

Example: straight-line tendon segment spanning a revolute joint

Consider the layout in Figure 1. Let’s derive the length \(l\) and tendon Jacobian \(J_m\) as a function of joint angle \(q\).

Point kinematics. The proximal attachment point position is constant in this frame:

\[\mathbf{p}_a = \begin{bmatrix} 0\\ -l_a \end{bmatrix}.\]

The distal attachment point rotates with the link. Using the planar rotation matrix

\[\mathbf{R}(q)= \begin{bmatrix} \cos q & -\sin q\\ \sin q & \cos q \end{bmatrix},\]

and choosing the distal-link local attachment vector as \([0, l_b]^\mathsf{T}\) when \(q=0\), we have

\[\mathbf{p}_b(q)=\mathbf{R}(q) \begin{bmatrix} 0\\ l_b \end{bmatrix} = \begin{bmatrix} -l_b\sin q\\ \;\;l_b\cos q \end{bmatrix}.\]

Tendon length. Assuming the tendon segment between these two points is straight, its length is the Euclidean distance

\[l(q)=\|\mathbf{p}_b(q)-\mathbf{p}_a\|.\]

Let \(\mathbf{r}(q)=\mathbf{p}_b(q)-\mathbf{p}_a\). Then

\[\mathbf{r}(q)= \begin{bmatrix} -l_b\sin q\\ l_b\cos q + l_a \end{bmatrix},\]

and the squared length is

\[\begin{align} l(q)^2 &= \mathbf{r}(q)^\mathsf{T} \mathbf{r}(q) \\ &= (-l_b\sin q)^2 + (l_b\cos q + l_a)^2 \\ &= l_b^2\sin^2 q + l_b^2\cos^2 q + 2l_a l_b\cos q + l_a^2 \\ &= l_a^2 + l_b^2 + 2l_a l_b\cos q. \end{align}\]

Therefore,

\[\boxed{ l(q)=\sqrt{\,l_a^2 + l_b^2 + 2l_a l_b\cos q\,}. }\]

If the full tendon includes additional routing to the motor of constant length \(L_0\), then the total tendon length is \(L_0+l(q)\) and the Jacobian below is unchanged.

Tendon Jacobian. For this single-DOF example, the tendon Jacobian is the scalar

\[J_m(q)=\frac{\partial l}{\partial q}.\]

Differentiate \(l(q)=\left(l_a^2 + l_b^2 + 2l_a l_b\cos q\right)^{1/2}\):

\[\begin{align} \frac{\partial l}{\partial q} &= \frac{1}{2}\left(l_a^2 + l_b^2 + 2l_a l_b\cos q\right)^{-1/2}\,\left(-2l_a l_b\sin q\right) \\ &= -\frac{l_a l_b\sin q}{\sqrt{\,l_a^2 + l_b^2 + 2l_a l_b\cos q\,}} \\ &= -\frac{l_a l_b\sin q}{l(q)}. \end{align}\]

Thus,

\[\boxed{ J_m(q)=\frac{\partial l}{\partial q} = -\frac{l_a l_b\sin q}{l(q)} \in \mathbb{R}^{1\times 1}. }\]

For the case where \(l_a = l_b = 1\), the values of \(l\) and \(J_m\) are plotted in Figure 4. It can be seen that there is no torque output at \(q=0\), and the tendon moment arm (i.e. \(-J_m^\mathsf{T}\)) becomes larger as it bends further, increasing the torque output capability and plateauing as \(q\) reaches \(180^\circ\).

Tendon length function and tendon Jacobian for la equals lb equals 1
Figure 4: Tendon length function and the corresponding tendon Jacobian when \(l_a = l_b = 1\) for the design in Figure 1.

Combining tendon forces with standard robot Jacobians and dynamics

The conventional rigid-body manipulator dynamics are

\[\mathbf{M}(\mathbf{q})\ddot{\mathbf{q}} + \mathbf{C}(\mathbf{q},\dot{\mathbf{q}})\dot{\mathbf{q}} + \mathbf{g}(\mathbf{q}) = \mathbf{\tau} + \mathbf{\tau}_{\text{ext}}, \tag{4}\]

where \(\mathbf{M}\) is the inertia matrix, \(\mathbf{C}\) collects Coriolis/centrifugal terms, and \(\mathbf{g}\) is gravity. \(\tau\) is the joint torque generated by the motors in each joint.

For tendon-driven actuation, you just substitute the tendon torque mapping:

\[\mathbf{M}(\mathbf{q})\ddot{\mathbf{q}} + \mathbf{C}(\mathbf{q},\dot{\mathbf{q}})\dot{\mathbf{q}} + \mathbf{g}(\mathbf{q}) = -\mathbf{J}_m(\mathbf{q})^\mathsf{T} \mathbf{f} + \mathbf{\tau}_{\text{ext}}. \tag{5}\]

And you get the dynamic model for a tendon-driven robot.

Where do tendon forces \(\mathbf{f}\) come from? At this point you can plug in a tendon/actuator model (e.g., motor torque to tendon force, or even elastic tendon \(f_i = k_i (l_i - l_{i,\mathrm{rest}})\)). The key structural point is: once you can predict/estimate \(\mathbf{f}\), the generalized joint input is \(-\mathbf{J}_m^\mathsf{T}\mathbf{f}\).

Shape, rank, and (non-)invertibility of \(\mathbf{J}_m\): from underactuated to overactuated

Let’s try to mathematically analyze how underactuated, fully actuated, and overactuated are represented in \(\mathbf{J}_m\). The mapping \(\mathbf{\tau} = -\mathbf{J}_m^\mathsf{T} \mathbf{f}\) is linear in \(\mathbf{f}\) for fixed \(\mathbf{q}\). For simplicity of notation in the rest of the section, let

\[\mathbf{B}(\mathbf{q}) \triangleq -\mathbf{J}_m(\mathbf{q})^\mathsf{T} \in \mathbb{R}^{n\times m} \quad\Rightarrow\quad \mathbf{\tau} = \mathbf{B}(\mathbf{q})\,\mathbf{f}.\]

For the less linear-algebraically inclined: you can skip the information in [these brackets] and still understand the gist of the document.

Square case (\(m=n\)): fully actuated when full rank

If \(m=n\) [and \(\operatorname{rank}(\mathbf{B}) = n\)], then \(\mathbf{B}\) is invertible and you can solve uniquely:

\[\mathbf{f} = \mathbf{B}^{-1} \mathbf{\tau} = -(\mathbf{J}_m^\mathsf{T})^{-1}\mathbf{\tau}.\]

[If \(\mathbf{B}\) loses rank at some configuration (a “tendon singularity”), then certain torque directions become unachievable.]

Underactuated (\(m<n\)): fewer tendons than DOFs

If \(m<n\) [then because \(\operatorname{rank}(\mathbf{B}) \le m < n\)], you cannot generate arbitrary \(\mathbf{\tau}\in\mathbb{R}^n\). Only torques in the column space of \(\mathbf{B}\) are feasible:

\[\mathbf{\tau} \in \operatorname{Range}(\mathbf{B}) \subset \mathbb{R}^n.\]

This is a clean mathematical fingerprint of underactuation.

Overactuated / redundant (\(m>n\)): more tendons than DOFs

If \(m>n\) [and \(\operatorname{rank}(\mathbf{B}) = n\)], then any desired torque \(\mathbf{\tau}\) can be produced.

[However the solution is not unique:

\[\mathbf{f} = \mathbf{B}^\sharp \mathbf{\tau} + \left(\mathbf{I} - \mathbf{B}^\sharp\mathbf{B}\right)\mathbf{z},\]

where \(\mathbf{B}^\sharp\) is a pseudoinverse and \(\mathbf{z}\) is an arbitrary vector in the nullspace.]

This redundancy is often used to:

It has also been formulated as a quadratic optimization problem to achieve torque control [2], [3] or operational space control [4].

Important physical note. Even if \(\mathbf{B}\) is full rank, feasibility also depends on inequality constraints:

\[\mathbf{0} \le \mathbf{f} \le \mathbf{f}_{\max},\]

because tendons typically cannot push. So in practice, an antagonistic pair of tendons are usually attached to a single joint. But the tendon pair could still be driven by a single motor (attaching to the spool in opposing directions).

What to take away

authored by Yasunori Toshimitsu

References

  1. [1]T. Lens and O. von Stryk, “Investigation of safety in human-robot-interaction for a series elastic, tendon-driven robot arm,” 2012 IEEE/RSJ International Conference on Intelligent Robots and Systems, pp. 4309–4314, 2012, Available at: https://api.semanticscholar.org/CorpusID:228227
  2. [2]M. Jäntsch, S. Wittmeier, K. Dalamagkidis, and A. Knoll, “Computed muscle control for an anthropomimetic elbow joint,” in 2012 IEEE/RSJ International Conference on Intelligent Robots and Systems, 2012, pp. 2192–2197. doi: 10.1109/IROS.2012.6385851.
  3. [3]M. Jäntsch, C. Schmaler, S. Wittmeier, K. Dalamagkidis, and A. Knoll, “A scalable joint-space controller for musculoskeletal robots with spherical joints,” 2011 IEEE International Conference on Robotics and Biomimetics, pp. 2211–2216, 2011, Available at: https://api.semanticscholar.org/CorpusID:8281263
  4. [4]Y. Toshimitsu et al., “Biomimetic Operational Space Control for Musculoskeletal Humanoid Optimizing Across Muscle Activation and Joint Nullspace,” in 2021 IEEE International Conference on Robotics and Automation (ICRA), 2021, pp. 1184–1190. doi: 10.1109/ICRA48506.2021.9561919.