Soft-arm kinematics

A continuum arm such as the Helyx is a chain of segments, each bent into a circular arc (piecewise constant curvature, PCC). This page gives the equations the PCC model computes.

../_images/7845db6945d3493ce78f5a1fa00104f80984f9300c40890ffb4f1b057a0447f0.svg

One segment

Segment \(i\) has the coordinates \(\Delta_i = (D_x, D_y, D_l)\) [m]: \(D_x\) and \(D_y\) bend it towards \((D_x, D_y)\), and \(D_l\) lengthens it. With rest length \(L_0\), section radius \(d\) and local arc fraction \(s \in [0, 1]\), the size of the bend is \(\rho\) and its angle at \(s\) is \(\theta\):

\[\begin{split} \begin{gathered} \rho = \sqrt{D_x^2 + D_y^2 + \varepsilon}, \\ \theta(s) = s\,\rho/d . \end{gathered} \end{split}\]

The frame at \(s\) is turned by \(\theta\) about the axis \((-D_y, D_x, 0)/\rho\), and its origin is

\[\begin{split} t(s) = \frac{d\,(L_0 + D_l)}{\rho^2} \begin{bmatrix} D_x (1 - \cos\theta) \\ D_y (1 - \cos\theta) \\ \rho \sin\theta \end{bmatrix}, \end{split}\]

the point at arc length \(s\,(L_0 + D_l)\) on an arc of radius \(d\,(L_0 + D_l)/\rho\). The tangent is the frame’s \(z\) axis. The small \(\varepsilon\) (\(10^{-12}\) m²) keeps the straight pose smooth.

The whole arm

The configuration stacks the segments, base to tip: \(q = (\Delta_1, \dots, \Delta_n)\). The arc parameter \(s \in [0, 1]\) of the whole arm is uniform in rest length (it is the arc length while no segment stretches), so segment \(i\) spans \([b_{i-1}, b_i]\) with \(b_i = \sum_{j \le i} L_{0,j} / \sum_j L_{0,j}\). Each segment’s frame starts where the previous one ends. arm.point(s=...) accepts a symbolic \(s\) as well, so an attachment point can itself be optimized.

Tendons

A tendon at angle \(\delta\) around the section changes length by

\[ \Delta L = D_l - D_x \cos\delta - D_y \sin\delta , \]

(the distance \(d\) of the tendon from the backbone is already inside \(D_x\) and \(D_y\)), and its motor, with spool radius \(r\), turns by \(\theta_m = -\Delta L / r\): a positive motor angle pulls the tendon. With three tendons per segment this map is invertible, so the measured motor angles give \(\Delta\) exactly. The motor torques that realize a generalized force \(\tau\) solve \(B u = \tau\) with \(B = (\partial\theta_m/\partial\Delta)^\top\). The transmission’s efficiency, 1 by default, maps the commanded motor torques to the delivered ones.

The templates

robots.helyx builds Helyx arms from these equations. Three geometries are ready, named by their segment lengths in mm: the soft arm of the soft-arm example (on its side), the hanging soft arm and the arms of the two-arm example. Their segment lengths, their mounting and the sign of their encoders against the convention above are:

Geometry

Used in

Segments, base to tip

Gravity in the base frame

Encoder sign

145-145-145

soft arm

145, 145, 145 mm

[0, -9.81, 0] m/s²

-1

145-290-290

hanging arm

145, 290, 290 mm

[0, 0, 9.81] m/s²

-1

290-145-145

two arms

290, 145, 145 mm

[0, 0, -9.81] m/s²

+1

The template takes its geometry as arguments, so the same function builds an arm of any segment lengths, radii, tendon angles or masses, with any number of segments:

import numpy as np
from virtualmodelcontrol.robots import helyx

short = helyx.arm(
    lengths=(0.2, 0.2),  # [m], two segments
    tendon_angles=np.radians([[0, 120, -120], [60, 180, -60]]),
)
short.actuation.motor_sizes(short.space)  # 6 motor angles and 6 rates
(6, 6)