Skip to content

Commit ae1b67d

Browse files
committed
Properly implement actuation_basis
1 parent 996b5ec commit ae1b67d

File tree

2 files changed

+22
-8
lines changed

2 files changed

+22
-8
lines changed

examples/simulate_pneumatic_planar_pcs.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,18 @@
4747
# strain_selector = jnp.ones((3 * num_segments,), dtype=bool)
4848
strain_selector = jnp.array([True, False, True])[None, :].repeat(num_segments, axis=0).flatten()
4949

50+
B_xi, forward_kinematics_fn, dynamical_matrices_fn, auxiliary_fns = (
51+
pneumatic_planar_pcs.factory(num_segments, sym_exp_filepath, strain_selector)
52+
)
53+
# jit the functions
54+
dynamical_matrices_fn = jax.jit(dynamical_matrices_fn)
55+
actuation_mapping_fn = auxiliary_fns["actuation_mapping_fn"]
56+
57+
def sweep_actuation_mapping():
58+
q = jnp.zeros((2 * num_segments,))
59+
A = actuation_mapping_fn(params, B_xi, q)
60+
print("A =\n", A)
61+
5062

5163
def simulate_robot():
5264
# define initial configuration
@@ -59,12 +71,6 @@ def simulate_robot():
5971
sim_dt = 5e-5 # simulation time step
6072
ts = jnp.arange(0.0, 2, dt) # time steps
6173

62-
strain_basis, forward_kinematics_fn, dynamical_matrices_fn, auxiliary_fns = (
63-
pneumatic_planar_pcs.factory(sym_exp_filepath, strain_selector)
64-
)
65-
# jit the functions
66-
dynamical_matrices_fn = jax.jit(partial(dynamical_matrices_fn))
67-
6874
x0 = jnp.concatenate([q0, jnp.zeros_like(q0)]) # initial condition
6975
tau = jnp.zeros_like(q0) # torques
7076

@@ -160,4 +166,5 @@ def simulate_robot():
160166
plt.show()
161167

162168
if __name__ == "__main__":
169+
sweep_actuation_mapping()
163170
simulate_robot()

src/jsrm/systems/pneumatic_planar_pcs.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import jax.numpy as jnp
44
from jsrm.math_utils import blk_diag
55
import numpy as onp
6-
from typing import Dict, Tuple, Union
6+
from typing import Dict, Optional, Tuple, Union
77

88
from .planar_pcs import factory as planar_pcs_factory
99

@@ -16,6 +16,7 @@ def factory(
1616
"""
1717
Factory function for the planar PCS.
1818
Args:
19+
num_segments: number of segments
1920
segment_actuation_selector: actuation selector for the segments as boolean array of shape (num_segments,)
2021
True entries signify that the segment is actuated, False entries signify that the segment is passive
2122
Returns:
@@ -27,7 +28,13 @@ def factory(
2728
actuation_dim = segment_actuation_selector.sum() * 2
2829

2930
# matrix that maps the (possibly) underactuated actuation space to a full actuation space
30-
actuation_basis = jnp.eye(num_segments)[segment_actuation_selector]
31+
actuation_basis = jnp.zeros((2 * num_segments, actuation_dim))
32+
actuation_basis_cumsum = jnp.cumsum(segment_actuation_selector)
33+
for i in range(num_segments):
34+
j = int(actuation_basis_cumsum[i].item()) - 1
35+
if segment_actuation_selector[i].item() is True:
36+
actuation_basis = actuation_basis.at[2 * i, j].set(1.0)
37+
actuation_basis = actuation_basis.at[2 * i + 1, j + 1].set(1.0)
3138

3239
def actuation_mapping_fn(
3340
params: Dict[str, Array],

0 commit comments

Comments
 (0)