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.
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\):
The frame at \(s\) is turned by \(\theta\) about the axis \((-D_y, D_x, 0)/\rho\), and its origin is
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
(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 |
|---|---|---|---|---|
|
soft arm |
145, 145, 145 mm |
[0, -9.81, 0] m/s² |
-1 |
|
hanging arm |
145, 290, 290 mm |
[0, 0, 9.81] m/s² |
-1 |
|
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)