Scirobotics - Adj7246 SM
Scirobotics - Adj7246 SM
Movies S1 to S5
Data S1 and S2
Design Files
Materials and Methods
Design
Actuator Hardware Overview
The main structure of the actuator consists of two “walls” made from 3.18 mm thick sheets
of waterjet-cut quasi-isotropic carbon fiber (fig. S6A). On the end of the actuator opposite the
actuated arm, two split hub clamps connect these walls to a hollow aluminum cross-shaft which
provides a convenient mount for the actuator. On the other end of the actuator, the walls are
connected to a cross brace made from 3D printed nylon with carbon fiber reinforcement. On the
top and bottom of the actuator the walls are connected to assemblies consisting of 3.18 mm thick
laser-cut acrylic plates and 3D printed PLA cross-bars. These cross-bar assemblies substantially
increase the stiffness of the actuator in the direction normal to the carbon fiber w alls, which
increases the buckling resistance for the primary structural buckling modes of the actuator. In
addition to serving a structural purpose, the acrylic plates serve as mounting locations for the
embedded circuits in the actuator and the cross-bars provide mounting locations for the actuator
body panels. The body panels are 0.64 mm thick 5052 aluminum sheet metal components which
help to keep dust and contaminants out of the actuator while also preventing UV light from
degrading the natural rubber of the springs. The mass of all the energy-recycling components
(table S1) is about 0.56 kg which includes the spring and clutches (0.24 kg) and supporting
components (0.32 kg). The total mass of the actuator assembly is 2.7 kg
The springs in the actuator are connected to the actuator frame via two machined aluminum
plates (fig. S6B). E ach p late h as s ix p rotruding “ fingers” th at ar e in dividually instrumented
with strain gauges to provide a force reading for each spring. The fingers have a C-shaped cross
section to increase bending stiffness and reduce strains caused by induced bending at the spring
connection points, while keeping the cross-sectional area low enough to achieve a measurable
compressive strain.
The frame electrode mounting plates (fig. S6C) provide mounting locations for the six frame
electrodes in the actuator. Ribs on the inside surface of each plate create shelves for the frame
electrode bases to slide into which ensures proper alignment before the frame electrode bases
are screwed into place. The frame electrode mounting plates are connected to the walls using
machine screws that thread into brass heat-set inserts.
A machined aluminum output shaft connects the output electrodes and the motor to the
“arm” of the actuator (fig. S9A). The shaft is supported by crossed roller bearings on both ends
which are pressed into machined bearing cups that connect the bearings to the actuator frame.
The motor (T-Motor AK80-6) is connected to the shaft via a flanged shaft adapter which bolts
onto the output of the motor and is connected to the output shaft by a socket head cap screw
with a steel belleville spring washer to prevent the screw from backing out. A 3D printed spacer
offsets the motor from the wall of the actuator to provide clearance for the shaft adapter bolts
and other assembly bolts.
The twelve output cables which transmit the spring force to the output shaft are routed over
redirect pulleys (fig. S9) and connected to two drums mounted on the output s haft. Each drum
is comprised of semicircular drum body and a clamping bracket. Each drum body has six
tracks for the output cables and is made from 3D printed nylon with embedded carbon fiber for
increased stiffness. A protrusion on the side of each drum body limits the angular displacement
of the actuator by coming into contact with hard stops extending from the bearing mount cups at
both ends of the 90◦ angular displacement range. Four heat-set inserts in the drum body provide
threads for connecting the clamping bracket. The clamping brackets have slots for connecting
each of the copper wire terminations of the output cables. Each output cable is routed over a
redirect idler pulley so that the same drum radius can be used for each spring. The idler pulleys
are supported by four machined aluminum pulley mounts (fig. S9) that are bolted into a bracing
component that sits between the output shaft and the frame electrodes. Rope guides mounted
on the bracing component prevent the wire ropes from coming off of the groove in each redirect
pulley.
The arm of the actuator consists of a carbon fiber t ube w ith a 2 8.6 m m d iameter a nd a
1.59 mm wall thickness. The tube is connected to the output shaft via an aluminum framing
connector that bolts into the shaft with four machine screws. A 3D printed adapter is connected
to the end of the arm tube that facilitates connecting either a point foot or stack of weights to
the end of the arm (fig. S10).
for the frame clutch and output clutch respectively (where ℓol,frame,0 = 73 mm, ℓol,output,0 =
18 mm, r = 25 mm). The overlap width is simply the width of each clutch which is 89 mm for
all electrodes in the prototype.
Communication
Communication between the Raspberry Pi and a host computer and data logging are achieved
via Lightweight Communications and Marshalling (LCM) (56) over ethernet. The Raspberry
Pi clock is synced with the host computer by running an NTP server on the host and an NTP
client on the Raspberry Pi. The host computer communicates with the motor in the actuator via
a commercially available USB to CAN board.
fˆj = uTj fj + ko θj + fo ∀ j
subject to
(3)
fj = Csj ∀ j
C = G + diag(g)
fj ⪰ fmin ,
where λ is a regularization weight on the Frobenius norm of G to prevent overfitting. As the
springs are exclusively loaded in tension, physically accurate spring forces should only take
on positive values. Instead of imposing the constraint fj ⪰ 0 for each spring, we set a small
negative spring force fmin as the lower bound to allow the optimization to fit small negative
spring forces, some of which may simply result from sensor noise. This optimization problem
is convex and can therefore be easily solved to optimality.
Control
Motor Controller
We use a computed torque controller (24) to achieve trajectory tracking with the motor in the
actuator (fig. S18A). This control architecture assumes we have a desired trajectory θdes (t) and a
model of the plant that allows us to compute required torques τdes (t) that would cause the robot
to exactly follow the desired trajectory.
The desired torque as a function of θdes and θ is given by
where M (θ) is the effective mass matrix and G(θ) is the gravitational torque. This motor control
approach allows the spring controller to assume that the motor will provide whatever torque is
required to achieve position tracking which greatly simplifies spring control. For a simple mass
m, connected to an arm with length ℓ, this can written as
where t is the current time, tjd is the time at the start of the last disengagement, tje is the time
at the end of the last engagement, and βd , αd and αe are constants that shape the modeled
initial offset and exponential decay (or rise) of the spring torque (βd = 10 ms, αd = 28 ms,
αe = 20 ms).
The tensioners connected to the output electrodes apply a torque on the output shaft that
depends on the shaft angle θ. The tensioner torque, τtens , is given by
τtens = r(ktens θ + ftens,0 ), (8)
where ktens is an effective tensioner stiffness and ftens,0 is an effective tensioner force at θ = 0.
Given the spring torque τs , the feed-forward motor torque is then calculated as
τff = τdes − τs − τtens + τc sign(θ̇des ) + Jm θ̈des (9)
where τc and Jm θ̈des account for coulomb friction and motor rotor inertia. For motor-only
actuation τs = 0. We found that the viscous damping in the motor was not substantial enough
to require additional compensation. To account for model errors and disturbances, we add
proportional and derivative feedback terms with gains denoted kp and kd . The embedded motor
controller outputs a motor torque τm according to
τm = τff + kp (θ − θdes ) + kd (θ̇ − θ̇des ), (10)
where τff is the feed-forward torque.
By associating binary variables with the range of the spring displacement, piecewise linear
constraints can be expressed as a series of simple linear constraints.
In addition to the binary spring control vector u, we define a binary spring engagement
vector e and disengagement indicator vector d where [eji = 1] ⇐⇒ [uji+1 − uji = 1] and
[dji = 1] ⇐⇒ [uji+1 − uji = −1]. The above logical constraints can be encoded as linear
inequalities by
di ⪯ui (14a)
ei ⪯1 − ui (14b)
ui+1 − ui ⪯ei − di . (14c)
These new variables are redundant once u has been defined, but they are useful in defining other
constraints. We also define a variable c ∈ Rn where
N
X
c= e i + di , (15)
i=1
such that cj gives the total number of control changes made for the jth spring. We denote the
engagement and disengagement displacement loss variables as γ and δ respectively (e.g. γ95
denotes how much spring displacement is lost by engaging spring 5 at the 9th time step). The
displacement loss is proportional to the initial spring force and inversely proportional to the sum
of the spring stiffness and clutch stiffness. This is given by
!
j
f
γij = i
eji (16a)
koc + ks
!
j
f
δij = i
dji , (16b)
kf c + ks
where koc and kf c are approximate clutch stiffnesses for the output and frame clutch, and ks is
an approximate linearized spring stiffness. Because e and d are binary, these constraints can be
converted to a linear form by adding auxiliary linear constraints.
Without engagement or disengagement displacement losses, the spring displacement dy-
namics could be written as xi+1 = xi − r∆θiui where ∆θi is the angular displacement of the
arm from time step i to i + 1, meaning that springs that are disengaged stay in place and springs
that are engaged move with the arm. To incorporate the displacement losses into the dynamics,
we write the spring dynamics as
We also impose limits on the spring displacement to prevent the spring from going completely
slack or stretching beyond its predefined limits,
Enforcing cyclicality constraints on the spring displacements ensures that there is no net
energy loss or gain by the springs in each cycle. Due to the discretization of the time steps and
the binary constraint on the spring control values, the hard constraint x1 = xN might not be
feasible. Instead, we impose a limit ϵ, on the cyclicality error and enforce the constraints
xN − x1 ⪯ ϵ (19a)
xN − x1 ⪰ −ϵ. (19b)
Small cyclicality errors in displacement are then fixed in a cyclicality correction post processing
step. We impose hard cyclicality constraints (e.g. u1 = uN ) on the binary variables u, e and d.
We explicitly add constraints to set a minimum interval time for periods where the spring is
engaged or disengaged. This prevents attempting to change a spring state faster than the springs
can respond and allows the electrode vibrations to settle between subsequent control changes.
Denoting the minimum engagement interval as ∆ton and the minimum disengagement interval
as ∆toff we define the sets
where p is the period of the cyclical trajectory and mod p accounts for wraparound. We then
enforce the interval constraints with linear inequalities given by
X j
1 − uji + dk + ejk ≤ 2 (21a)
k∈Ei
X
uji + djk + ejk ≤ 2. (21b)
k∈Di
We use a longer ∆ton than ∆toff because engagement vibrations can take longer to settle.
The primary optimization objective is to minimize the mean square difference between the
desired torque and the spring torque. Additional terms in the cost function make the optimiza-
tion better posed. We add linear and quadratic costs terms on spring control changes c. We
also add a quadratic weight term on the spring displacements as using more springs at a lower
displacement is more robust to clutch failure than using fewer springs at larger displacements.
Lastly, we add a quadratic cost term on the cyclicality error. The optimization problem can then
be written as
minimize (τdes − τout )T Q(τdes − τout ) + w0 cT c + w1 ∥c∥1 +
τout ,x,u,f,e,d,c,γ,δ
N
X
w2 xTi xi + w3 (xN − x1 )T (xN − x1 )
i=1
subject to Torque Constraints (12)
(22)
Force Constraints (13)
Engagement/Disengagement Constraints (14), (15), (16)
Dynamics (17), (18)
Cyclicality (19)
Interval Constraints (21),
where w0 , w1 , w2 and w3 are scalar weights. The scaling matrix Q accounts for the non-uniform
time sampling in the time vector t. The optimization is solved using the commercial solver
Gurobi.
Due to the coarse discretization and the piecewise linearization of the spring model, the
resulting control sequences from solving the MIQP can result in spring displacements where
the initial spring position and final spring position differ by a few m illimeters. We employ a
simple approach to fixing cyclicality errors that consists of adjusting the timing of the first or last
control change in the sequence to ensure cyclicality. For each spring, we compute how much
the first o r l ast c ontrol c hange i n t he c ontrol s equence w ould n eed t o b e s hifted f orwards or
backwards in time to ensure cyclicality and choose whichever adjustment requires the smallest
temporal change from the nominal solution.
σ
σ− gi+1
ti+1 = tnom,i+1 − β , (25b)
giσ + gi+1
σ
where we set giσ to the adjustment gain for ith control if the adjust direction dσi is “forward” or
“both”, otherwise we set giσ to 0. Similarly, we set gi+1
σ
to the adjustment gain for control i + 1
σ σ
if the adjust direction di+1 is “backward” or “both”, otherwise we set gi+1 to 0. This process is
applied for each subsequent pair of control values, for both spatial directions while accounting
for the cyclicality of the control sequence. Temporal adjustment bounds for “up” adjustments
and “down” adjustments are allowed to overlap because the displacement error will be small
when it changes sign. Adjustment bounds may go beyond the end of the actuation cycle and
wrap around to the beginning. The adjustment bounds and gains for the rapid accelerations,
variable payload, and intermittent contact test cases are shown in fig. S20.
At each iteration of the spring control loop, the controller computes the next engagement or
disengagement time for each spring given the current spring position, the spring state (engaged
or disengaged), and the nominal spring state and spring displacement from the offline optimiza-
tion, and executes the new control if the desired time is within some range of the current time.
The outer control loop is summarized in Algorithm 1. The engagement and disengagement
control algorithms are summarized in Algorithm 2 and Algorithm 3.
Algorithm 1 SpringControlLoopIter
Inputs:
Desired nominal spring states: û, Spring states: u, Desired nominal spring displacements: x̂,
Spring displacements: x, Time: t, Arm angle: θ, Desired arm angle: θref
1: for spring num j in 1 . . . 6 do ▷ For each spring
2: if t−L AST C ONTROL C HANGE T IME(j)>MinInterval then ▷ Check interval limit
3: if S PRING A LWAYS E NGAGED(j) then ▷ Offline solution always engaged
4: uj ← S TABILIZE A LWAYS O N(x̂j , xj , t, θ, θref )
5: else ▷ Offline sequence has changes
6: if uj = 0 then ▷ Spring is disengaged
7: uj ← S PRING E NGAGEMENT(ûj , x̂j , xj , t, θ, θref )
8: else ▷ Spring is engaged
9: uj ← S PRING D ISENGAGEMENT(ûj , x̂j , xj , t, θ, θref )
10: A PPLY C ONTROLS(u)
Algorithm 2 SpringEngagement
Inputs: û, x̂, x, t, θ, θref
Outputs: u ▷ Next control value
1: u ← 0 ▷ Initialize output to keep spring disengaged
2: x̃ ← x̂ − x ▷ Compute spring position error
3: i ← G ET E NGAGEMENT I DX(t) ▷ Get index in offline control sequence
4: if S KIP E NGAGEMENT(x, x̂, i) then
5: return ▷ Skip if interval too short or engaging will cause spring to go slack
6: d, g ← G ET E NGAGE A DJUSTMENT D IRECTION(i, sign(x̃)) ▷ Direction d and gain g
7: tnom ← G ET N OMINAL E NGAGE T IME(i) ▷ Set nominal time to offline value
8: if abs(x̃) > ϵ then
9: t− +
e , te ← −∞, +∞ ▷ No bounds on next engagement time if error large
10: else
11: t− +
e , te ←G ETA DJUSTMENT B OUNDS (i, d) ▷ Set bounds on next engagement time
12: θe ←C LIP(θref (tnom ) + gx̃/r, θmin , θmax ) ▷ Set target arm engagement angle with bounds
13: if d = “neither” then
14: te ← tnom ▷ Set engagement time to nominal
15: else
16: if û ̸= 0 then ▷ If spring not in target engagement state
17: tnom ← t ▷ Set nominal time to right now
18: if d = “forward” or d = “both” then
19: te,f ← F ORWARD S EARCH(θref , θe , tnom , t+
e) ▷ Find θ = θe with bound t+e
20: te ← te,f
21: if d = “backward”or d = “both” then
22: te,b ← BACKWARD S EARCH(θref , θe , tnom , t− e) ▷ Find θ = θe with bound t−e
23: te ← te,b
24: if d = “both” then ▷ If could do both, choose whichever is closer to nominal
25: if te,f − tnom ≤ tnom − te,b then
26: te ← te,f
27: else
28: te ← te,b
29: if C HANGE I N C ONTROLW INDOW(t, te ) then ▷ If engage time close enough to t
30: u←1
Algorithm 3 SpringDisengagement
Inputs: û, x̂, x, t, θ, θref
Outputs: u ▷ Next control value
1: u ← 1 ▷ Initialize output to keep spring engaged
2: x̃ ← x̂ − x ▷ Compute spring position error
3: i ← G ET D ISENGAGEMENT I DX(t) ▷ Get index in offline control sequence
4: if S KIP D ISENGAGEMENT(x, x̂, i) then
5: return ▷ Skip if interval too short
6: tnom ← G ET N OMINAL D ISENGAGE T IME(i) ▷ Set nominal time to offline value
7: d, g ← G ET D ISENGAGE A DJUSTMENT D IRECTION(i, sign(x̃)) ▷ Direction d and gain g
8: if abs(x̃) > ϵ then
9: t− +
d , td ← −∞, +∞ ▷ No bounds on next disengagement time if error large
10: else
11: t− +
d , td ←G ETA DJUSTMENT B OUNDS (i, d) ▷ Set bounds on next disengagement time
12: if û ̸= 1 then ▷ If current target state is to be engaged
13: g ← 0.5g ▷ Reduce adjustment gain
14: tnom ← t ▷ Set nominal time to now
15: θd ←C LIP(θref (tnom ) + gx̃/r, θmin , θmax ) ▷ Set target arm disengagement angle with bounds
16: if d = “neither” then
17: td ← tnom ▷ Set disengagement time to nominal
18: else
19: if û ̸= 0 then ▷ If spring not in target engagement state
20: tnom ← t ▷ Set nominal time to right now
21: if d = “forward” or d = “both” then
22: td,f ← F ORWARD S EARCH(θref , θd , tnom , t+
d) ▷ Find θ = θe with bound t+
d
23: td ← td,f
24: if d = “backward”or d = “both” then
25: td,b ← BACKWARD S EARCH(θref , θd , tnom , t− d) ▷ Find θ = θe with bound t−
d
26: td ← td,b
27: if d = “both” then ▷ If could do both, choose whichever is closer to nominal
28: if te,f − tnom ≤ tnom − te,b then
29: te ← te,f
30: else
31: te ← te,b
32: if C HANGE I N C ONTROLW INDOW(t, td ) then ▷ If engage time close enough to t
33: u←0
For springs where the offline solution is to keep the spring always engaged, there are no
control changes to adjust and a different approach must be employed to get the spring to follow
the nominal trajectory. For a spring that is engaged but has displacement error x̃ > δ for some
threshold error δ, we disengage the spring before the arm would reach its maximum position
(at time tθmax ) when the spring would reach its minimum position, and then reengage the spring
at time tθmax . The amount of time to disengage before tθmax is based on the magnitude of the
displacement error. If a spring is engaged but has displacement error x̃ < −δ, we disengage the
spring at its minimum position (at time tθmax ) to minimize the disengagement losses and torque
error associated with disengaging the spring. If x̃ < 0 but the spring is within δ of the target
displacement, we reengage the spring. If x̃ < 0 but the spring is not close enough to the target
displacement, we reengage at the minimum arm position to reduce the spring displacement.
This approach is summarized in Algorithm 4.
Algorithm 4 StabilizeAlwaysEngaged
Inputs: u, x̂, x, t, θ, θref
Outputs: u ▷ Next control value
1: if u = 1 then ▷ Spring currently engaged
2: x̃ ← x̂ − x ▷ Compute spring position error
3: if x̃ > δ then ▷ Spring displacement too low
4: ∆x ← C OMPUTE D ISENGAGEMENTA ND E NGAGEMENT L OSS(x)
5: ∆θ ← (∆x + x̃)/r ▷ Angular correction
6: θd ← C LIP(θmax − ∆θ, θmin , θmax ) ▷ Target arm position to disengage at
7: td ← BACKWARD S EARCH(θref , θd , tθmax ) ▷ Find corresponding time for position
8: else if x̃ < −δ then ▷ Spring displacement too high
9: td ← tθmax ▷ Disengage when spring at lowest position
10: if C HANGE I N C ONTROLW INDOW(t, td ) then ▷ If disengage time close enough to t
11: u←0
12: else ▷ Spring currently disengaged
13: x̃ ← x̂ − x+C OMPUTE E NGAGEMENT L OSS(x) ▷ Compute spring position error
14: if x̃ ≥ 0 then
15: te ← tθmin ▷ Reengage when arm most retracted
16: else
17: if −x̃ < δ then
18: te ← t ▷ Reengage now
19: else
20: te ← tθmin ▷ Reengage when arm most extended
21: if C HANGE I N C ONTROLW INDOW(t, te ) then ▷ If engage time close enough to t
22: u←1
A limitation of the controller presented here is the reliance on offline computation of spring
trajectories for each scenario. However, this limitation is not inherent to the energy-recycling
actuator hardware and future developments could enable real time control for new trajectories.
One potential method could entail rapidly identifying an initial sequence of spring engagements
and disengagements by solving a coarser MIQP or by using an offline solution from a similar
trajectory and refining this solution with a secondary optimization over the continuous variables
of engagement and disengagement time. When a new task trajectory involves a small change in
task frequency or plant inertia, previously computed offline solutions may already capture the
relevant features of an optimal spring plan and only require minimal refinement. Another possi-
ble approach would be to generate a large number of offline MIQP solutions to train a supervised
learning model that outputs assignments for the binary control variables in real time (57). Us-
ing end-to-end learning to train a neural-network based spring control policy that takes a history
of desired joint torques and displacements as inputs and outputs a spring control value could
potentially eliminate the need for any explicit desired torque and arm trajectory.
AC Clutch Control
Driving an electroadhesive clutch with the same polarity continuously can cause an accumula-
tion of “space charges” within the dielectric which leads to high residual adhesion even after
the driving voltage has been removed from the electrodes and a slow release time (55). In ad-
dition to causing slow release times, charge accumulation can slow down engagement times.
Frequently flipping the polarity of the electric field within a clutch can reduce the space charge
accumulation and lead to a faster clutch response both in clutch engagement and release (17).
The time required for the clutch polarity to flip is governed by the R C electrical time con-
stant formed by the clutch capacitance C and effective series resistance R. During a polarity
flip from +300 V to −300 V, there is a point in time when there is no voltage differential be-
tween the electrodes. However, if the electrical time constant is fast enough, the clutch polarity
can be flipped and the electric field can be re-established before the clutch has time to mechan-
ically disconnect. If the series resistance is too high, the clutch will momentarily slip or may
disconnect entirely when the polarity is flipped. Even when there is no electrode slip, the elec-
trodes produce an audible “tick” when the field polarity flips. This may be produced from slight
movement at the edges of the electrodes.
After engaging a stretched spring, an audible “click” can be heard corresponding to the
clutch slipping a small amount during polarity flips. This behavior varies slightly from clutch
to clutch, but the clicks typically stop after a few polarity flips and the displacement loss in the
spring is limited to a few millimeters. One potential explanation for this behavior is that better
contact is established with each click as small wrinkles in the output electrode are smoothed
out leading to better adhesion. The presence of surface contaminants, which appear as small
gray dots in the surface of the dielectric after continued use, seems to correlate with increased
clicking behavior. It is possible that surface contaminants have an effect on the capacitance and
resistance of the air gap layer in clutch, but it is also possible that the effect is purely mechanical
and due to a drop in effective friction coefficient.
minimize ∥τest − τc ∥2
b,c,η,J
subject to τest = η̂ τm − bθ̇ − J θ̈ − c · sign(θ̇)
(28)
η τc θ̇ > 0
η̂ = η1 τc θ̇ < 0
1 otherwise,
where η is a gearbox efficiency term, b is a viscous damping term, c is a coulomb friction term,
and J is an effective reflected rotor inertia term. The η̂ accounts for the direction of power
flow through the gearbox, where η̂ = η when positive power flows from the motor out through
the gearbox. The parameters were fit using a non-linear least squares solver in Matlab. The fit
values were η = 0.962, b = 9.79 × 10−4 Nm·rad−1 , c = 0.18 Nm, and J = 4.1 × 10−3 kgm2 .
The effective inertia term J accounts for the gear ratio of 6 : 1, meaning the actual rotor inertia
for the motor would be 1.14 × 10−4 kgm2 .
When estimating the output torque from the motor for the plots presented in this work, we
use (
η(τm − bθ̇ − J θ̈) − c · sign(θ̇)
τm sign(θ̇) ≥ −c · sign(θ̇)
τest = 1
(29)
(τ − bθ̇ − J θ̈) − c · sign(θ̇)
η m
otherwise.
To avoid a sharp discontinuity at θ̇ = 0, we approximate sign(θ̇) ≈ π2 atan nθ̇ with n = 600.
Due to the difficulty of obtaining clean derivatives from noisy velocity data we set θ̈ = 0. As
the effective inertia of the motor is less than half of the inertia of the arm with the point foot
attached (and less than 10% of the effective inertia of the loaded arm in the low mass slow
sinusoid case), the effect of ignoring motor inertia on estimated torque is negligible.
where f is the spring force, A is the cross-sectional area of the spring, and λ is the spring stretch,
defined as the stretched spring length normalized by the unstretched spring length. The param-
eters were fit using the encoder and force estimates from the force sensor calibration process
(C10 = 372 kPa, C01 = −182 kPa, C20 = −82 kPa, C02 = 1.24 MPa, C11 = −1.28 MPa).
Here we derive a model for spring displacement losses during spring engagement or disen-
gagement. After a spring control change (engagement or disengagement), the newly activated
clutch will stretch slightly under the force of the spring and the spring will retract by a small
amount which we will denote ∆x. If we assume the clutch has a fixed stiffness k c , and that the
clutch stretches by ∆x, we can solve for the displacement loss by solving for force equilibrium.
Denoting the spring displacement and spring force before the control change as x0 and f0 , and
letting k0 be a spring stiffness linearized about x = x0 , force equilibrium is achieved at
f0 − k0 ∆x = kc ∆x. (31)
Trajectory Testing
Motor power consumption for all test cases and all cycles is shown in fig. S 15. T he spring
displacement for all cycles is shown in fig. S 16. F or t he s imple s inusoidal t asks t he online
spring controller briefly disengaged and re-engaged the springs in the first few cycles to adjust
the spring position and thereby increase spring torque. For the “intermittent contact” case,
power consumption was reduced after the first c ycle b ut i t r equired m ore c ycles t o g et the
springs into their target positions because the task did not involve substantial negative work at
any point.
We found that in addition to reducing the mean square motor torque, the energy-recycling
actuator was also able to reduce peak actuation torques once the springs had accumulated suffi-
cient energy. Over the last 10 actuation cycles, the peak torque was reduced by 29-80% (fig. S25).
Parallel-Elastic Comparison
In addition to comparing against motor-only actuation, we also compared against the simu-
lated performance of an optimized linear parallel-elastic actuator to illustrate how the energy-
recycling actuator differs from conventional parallel elastic actuators. For a parallel linear
spring, the torque is given by
τpar = k(θ − θ0 ), (33)
where k is a spring stiffness, θ is a spring displacement, and θ0 is the unstretched spring length.
To fit an optimal spring this is rewritten as τpar = kθ − τ0 (where τ0 ≡ kθ0 ) to avoid the
non-convexity introduced by the bilinear term kθ0 in the constraint. Here we consider a spring
optimized for each individual test case and consider a spring optimized over all five test cases.
To fit a spring to each test case we solved the constrained least square problem of minimizing
∥τest − kθ − τ0 ∥2 where τest and θ are the estimated torque and measured position from the
motor-only actuation tests respectively.
To optimize a spring over all test cases, we found the spring parameters that minimized
the average of the mean squared torques for each case, which can be written as the following
convex optimization problem
5 Ni
!
X 1 X
minimize (τest,j − (kθj + τo ))2 , (34)
k,τo ,e
i=1
N i j=1
where summation over j denotes summation over the points in each task, and summation over
i indicates summation over the different test cases. When optimized to each individual task, a
simple parallel spring could reduce the mean squared motor torque by 45% to 99% but when
optimized over all test cases, the parallel spring reduces the mean squared motor torque by 64%
in the best case but increases the mean squared torque for two out of the five test cases (fig. S22).
Figure S1. Natural rubber hysteresis behavior
Comparison of natural rubber stress-stretch behavior with different peak stretches. A
minimum prestretch of 1.1 is used to prevent the test specimen from going completely slack
upon unloading. The specimen was a 100 mm length of natural rubber tubing with an inner
diameter of 3.2 mm and an outer diameter of 9.5 mm. Tests were run at a rate of 10 mm·s−1 .
100%
Clutched Spring
Peak Stretch
Round Trip Efficiency
98%
96%
94%
92%
90%
1 1.5 2 2.5 3 3.5 4 4.5
Peak Stretch
Assembly
Template
Work Surface
C
Output Electrode Output Electrode Base
Fiberglass
Work Surface
Electrode Wrapped
Excess Material
Trimmed
"Output2" Timeout
Output Deactivate Frame OutputWait2
Disengage
Activate Frame
Set "Frame1" Timer "Frame2" Timeout
"Frame1" Timeout "Deactivate" Timeout
Deactivate Output
Float Output Float Frame
Set "Frame2" Timer Set "Float" Timer
Set "Float" Timer
FrameWait1 FrameWait2
"Float" Timeout
Deactivate Output "Deactivate" Timeout
Set "Deactivate" Timer Float Output
Set "Float" Timer
Friction
Compensation
Desired
Plant
Trajectory
B
Online Spring Low Level Control (600 Hz)
Offline Spring Planning Controller (100 Hz)
HV Drivers
Gain
Bound
Figure S20. Online spring controller temporal adjustment gains and timing bounds
The columns correspond to the “rapid acceleration”, “variable payload” and “intermittent
contact” cases and the rows correspond to different springs. The width of each box gives the
timing bound and the height of the box is proportional to the square root of the adjustment
gain.
A
B Offline Plan C D
Disengage
+
Displacement
Displacement
Displacement
Engage Δt Δt
Spring
Spring
Spring
+
+
+
td td td
Time te Time te Time te
Motor Only
+14%
Multiplexed
Analog to Digital Spring Position
Converter Sensing
SPI
Encoder Encoder
Ethernet
I2C Bus
Raspberry Pi Adapter Board Encoder Encoder
Encoder Encoder
High Voltage
H-Bridges
Frame/Output Frame/Output
Spring Electrode Spring Electrode Spring Electrode
Electrode Driver Electrode Driver
Driver Board Driver Board Driver Board
Board Board
Frame and Ouput Frame and Ouput Spring Electrodes Spring Electrodes Spring Electrodes
Electrodes 1-3 Electrodes 4-6 1 and 2 3 and 4 5 and 6
GND
C12 11 12
J3-2 SG_CE CAN_CE
3 13 14
C8
VEN SR_OE
4 15 16
BYPASS CAN_INT
17 18
GND
2 19 20
GND
GND 21 22
PWR_IN
1 GND 23 24
25 26
GND
2
VCC LP3985IM5-5.0 27 28
C10 U3 29 30
PLS
31 32
33 34
C15 1 5 35 36
PWR_IN VIN VOUT VCCB MISO3.3 SR_CE
C11 37 38
3 MOSI3.3
C7
VEN 39 40
4 SPI_CLK3.3
GND BYPASS
2 GND GND
GND GND
GND
LP3985IM5-5.0
Outputs
I2C CAN-SPI A2D-SPI Electrode Drive
32 31
OUT32 OUT31
22-05-7078-07 22-05-7078-07 OUT30 30 29
OUT29
22-05-7048-04 VCCB J6-1 28 27
J4-1 J2-1 OUT28 OUT27
26 25
OUT26 OUT25
GND
GND
VCC
GND
Level Shifting
3.3V
VCC
C6
GND
U1
2 VCC3.3V
Q1
BSS138
VCCA
19
VCCB
C5
R2
R1
GND
10
OE
1 6
SPI_CLK3.3 A1 A5 SR_OE SDA3.3 SDA5
3 7
MOSI3.3 A2 A6 CAN_INT
VCC
4 8
MISO3.3 A3 A7 CAN_CE
5 9
SR_CE A4 A8 SG_CE 3.3V
20 15
SPI_CLK5 SR_OE5
Q2
BSS138
B1 B5
18 14
MOSI5 B2 B6 CAN_INT5
17 13
R4
R3
MISO5 B3 B7 CAN_CE5
16 12
SR_CE5 B4 B8 SG_CE5
GND
11
GND SCL3.3 SCL5
TXS0108EPWR
Shift Registers
Clock Gating
VCC
R5
SR_CLK
Q3
C2
C3
C1
C4
GND
GND
GND
GND
2N700
C14
SR_CE5
GND
SER QA SER QA
1 1
QB OUT18 QB
11 2 11 2
SR_CLK SCK QC OUT19 SR_CLK SCK QC OUT27
10 3 10 3
SCL QD OUT20 SCL QD OUT28
VCC
4 4
VCC QE OUT21 VCC 12 QE OUT29
12 5 5
SR_CE5 RCK QF OUT22 SR_CE5 RCK QF OUT30
6 6
QG OUT23 QG OUT31
7 7
QH OUT24 QH OUT32
SR_OE5 13 G QH*
9
SR_OE5 13
G QH*
9
74HC595D 74HC595D
4.7k
4.7k
R1
R2
VCC
GND
P$2
P$2
U1 P$4
AS5600 SDA P$4
GND
1 8
VDD5V DIR
2 7
VDD3V3 SCL SCL
C1 C2 P$1
3
OUT SDA
6 PWM P$1
GND
0.1uF 1uF 4
GND PGO
5
SDA
VCC
V+
GND
C1
GND
R1
7
1k CF-1 2
S-1
RF-1 V+
1
RG_2
U1 6
Value V_OUT1
RG1
5
S+1
R2
RF+1 V_REF
C2
4
GND
CF+1
JP1
V-
GND 1
V+
VSS 2
S+1
3
S-1
4
V-
Amplifier 2 V+
JP2
1
2
S+2
VCC
3
GND S-2
4
V+
V-
C3
GND
JP3
1
V+
2
S+3
3
7
CF-2 S-3
2 4
S-2 V-
RF-2 V+
1
R3
RG_2
U2 6 JP4
Value V_OUT2
RG2
1
CF2 8 REF S-2 S+2 V-
2
RG V+
3
RF+2 3
V- V_REF
4
5
VSS
S+2
5
R4
V_REF
GND
6
4
VCC 7
V_OUT3
C4
8
V_OUT2
GND
CF+2 9
V_OUT1
GND
V-
VSS
Amplifier 3
VCC
V+
C5
GND
GND
7
CF-3 2
R5
S-3
RF-3 V+
1
RG_2
U3 6
Value V_OUT3 S-3 S+3
RG3
CF3 8 REF
RG
RF+3 3
V-
5
R6
S+3
V_REF
4
C6
GND
CF+3
V-
GND
VSS
VCC
1 2
JP5 OUTB1 OUTA1
3 4
C5
SpiceOrder 1
GNDGND
2 1 7 8
V- CLK
2 9 10
SpiceOrder 2
C2 C1 D_OUT
3 11 12
D_IN VCC
4 13 14
CS V_REF
15 16
V+
22-05-7028-02 V- 17 18
J3-1
VCC GND
GND
J3-2
Offsetting A2D
VCC
VCC
VCC
R2
VCC
U7
C6
GND
16
IC1B CS VDD
3
2 5 10 12
CS/SHDN DOUT D_OUT
SCL
VCC
7 1
V_COMP CH0
C3
6 2
1
R1
V_REF CH1
GND
OPA 3
OUTB3 CH2
4
IC1A OUTB2 CH3
5
3
OUTB1 CH4
2 3 6
D2
OUTA2
REF
CH5
1 7
V_REF OUTA1 CH6
2 8
1
OUTA3 CH7
OPA 13
CLK CLK
11
4
D_IN DIN
15
GND V_COMP VREF
GND
14
AGND
GND
GND 9
DGND
MCP3008-I/SL
VCC
GND
GND NC
GND NC
22-05-7028-02 HSD J2-2
+VIN
J1-1 +VIN
GND
VCC VCC J2-3
C8
GND
+VOUT
J1-2 +VOUT HV_OUT
0V
HSD 0V
ISK0505A
22-05-7028-02
J4-1
GND R6 VCC
GND
C2
J4-2
HV Conversion
3.3V
3.3V
HV_CONV
3
R1
7
2 3 IC1
REF
6 PROG
PROG
GND
2 HVRTN
1
HVRTN
MCP6294
4
C7
GND
IN-
C10 IN- R5
HVOUT
R2
HVOUT HV_OUT
GND IN+
GND IN+
C1 VCC UMHV0505
GND
R3
C3 C4 C5 C6
R4
1 3
VIN VOUT 3.3V
2
VCC GND_(TAB)
C9
GND
GND
MCP1825S-3302E/AB
3.3V_SOURCE
HV Buffer Bleed Off GND
GND RELAY
1 8
NU1 NC1
R7
GND
2 7
IN+ NC2
VCC R8
GND
3 6
IN- NO1
4 5
NU2 NO2
LCC110S
9 8 CF1 2
J1-1 H1
GND
74ACT08D
J1-2 74AC14D
VBUS
L2 GND
C3
4 IC1B
22-05-7038-03 22-05-7038-03 IC3B D2 6
RG2
J3-1 J2-1 RA2 RB2 LSD2
11 10 CF2 5
H2
V_HSD J3-2 J2-2 74ACT08D
HV_GND 74AC14D
J3-3 J2-3
L3 GND
D5
12 IC1D
IC3A D3 11
RG3
RA3 RB3 LSD3
13 12 CF3 13
H3
GND 74ACT08D
74AC14D
9 IC1C
IC3F D4 8
RG4
U1 RA4 RB4 LSD4
1 16 5 6 CF4 10
H1 1 16 HSD1 H4
R1 74ACT08D
74AC14D
GND
2 15
2 15
3 14 GND
H2 3 14 HSD2 IC3E
R2
GND
3 4
GND
4 13
4 13
V_HSD 74AC14D
5 12
H3 5 12 HSD3
R3 IC3D
GND
GND
6 11 1 2
6 11
7 10 74AC14D
H4 7 10 HSD4
R4
GND
8 9
8 9
RPU3
RPU4
D10 SpiceOrder 2
D12
SpiceOrder 2
Q2 Q4 Q6 Q8
SpiceOrder 1
SpiceOrder 2
SpiceOrder 1
SpiceOrder 1
SpiceOrder 1
JP3
RHS1
RHS3
RHS4
1
VO1
RHS2
2
VO2
3
VO3
4
VO1 VO2 VO3 VO4 VO4
PINHD-1X4/90
RLS1
RLS3
RLS4
D7
RLS2
D13
SpiceOrder 2
D9
D11
SpiceOrder 2
SpiceOrder 2
SpiceOrder 1
SpiceOrder 2
SpiceOrder 1
SpiceOrder 1
Q1 Q3 Q5 Q7
SpiceOrder 1
HV_GND
RPU
22-05-7028-02
VCC
J1-1 U2
1 4
H1 1 4
GND
J1-2 R1 Q2
DMP45H150DHE
GND
2 3
2 3 V_HSD
VCC VCC
RO1
C1 C2 RO2
RHS
JP2
1
RO3
2
3
RO4
GND GND 4
5
RO5
RLS
VBUS
6
C3 L1 RO6
22-05-7038-03
J2-1
IC2 Q1
1 IPN70R1K2P7S
V_HSD J2-2
IC1 D1 RG1
4
2 4
RA RB 2
HV_GND J2-3 H1 CF1
74AHC1G04DBV 74AHC1G08DBV
D5
HV_GND
GND
GND
Movie S2.
Animated exploded view of the actuator design.
Movie S3.
Video demonstrating the ability to control the total spring torque applied to the arm by changing
the number of springs engaged.
Movie S4.
Video demonstrating the bandwidth capabilities of an individual spring in the actuator operating
at 12 Hz.
Movie S5.
Video of all five test cases being performed with both energy-recycling and motor-only actua-
tion.
Design Files
CAD hardware design files, printed circuit board design files, and list of circuit components
values for the actuator prototype available at https://drive.google.com/file/d/
15mmerK_G3rYKS-RbtPpbUAuucHN-HZYr/view?usp=sharing.