imt-ring 1.6.21__tar.gz → 1.6.22__tar.gz
Sign up to get free protection for your applications and to get access to all the features.
- {imt_ring-1.6.21 → imt_ring-1.6.22}/PKG-INFO +1 -1
- {imt_ring-1.6.21 → imt_ring-1.6.22}/pyproject.toml +1 -1
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/imt_ring.egg-info/PKG-INFO +1 -1
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/dynamics.py +4 -4
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/base.py +10 -1
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/jcalc.py +149 -6
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/base.py +43 -2
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/xml/abstract.py +2 -1
- {imt_ring-1.6.21 → imt_ring-1.6.22}/readme.md +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/setup.cfg +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/imt_ring.egg-info/SOURCES.txt +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/imt_ring.egg-info/dependency_links.txt +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/imt_ring.egg-info/requires.txt +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/imt_ring.egg-info/top_level.txt +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algebra.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/_random.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/custom_joints/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/custom_joints/rr_imp_joint.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/custom_joints/rr_joint.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/custom_joints/rsaddle_joint.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/custom_joints/suntay.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/batch.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/finalize_fns.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/motion_artifacts.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/pd_control.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/setup_fns.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/generator/types.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/kinematics.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/algorithms/sensors.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/branched.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/exclude/knee_trans_dof.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/exclude/standard_sys.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/exclude/standard_sys_rr_imp.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/inv_pendulum.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/knee_flexible_imus.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/spherical_stiff.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/symmetric.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_all_1.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_all_2.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_ang0_pos0.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_control.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_double_pendulum.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_free.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_kinematics.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_morph_system/four_seg_seg1.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_morph_system/four_seg_seg3.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_randomize_position.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_sensors.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_three_seg_seg2.xml +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/test_examples.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/xml/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/xml/from_xml.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/xml/test_from_xml.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/xml/test_to_xml.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/xml/to_xml.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/maths.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/base.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/callbacks.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/ml_utils.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/optimizer.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/params/0x13e3518065c21cd8.pickle +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/params/0x1d76628065a71e0f.pickle +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/ringnet.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/rnno_v1.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/train.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/ml/training_loop.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/rendering/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/rendering/base_render.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/rendering/mujoco_render.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/rendering/vispy_render.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/rendering/vispy_visuals.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/sim2real/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/sim2real/sim2real.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/spatial.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/sys_composer/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/sys_composer/delete_sys.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/sys_composer/inject_sys.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/sys_composer/morph_sys.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/backend.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/batchsize.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/colab.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/dataloader.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/dataloader_torch.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/hdf5.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/normalizer.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/path.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/randomize_sys.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/register_gym_envs/__init__.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/register_gym_envs/saddle.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/utils/utils.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_algebra.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_base.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_custom_joints.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_dynamics.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_generator.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_jcalc.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_jit.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_kinematics.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_maths.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_ml_utils.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_motion_artifacts.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_pd_control.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_quickstart_example.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_random.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_randomize.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_rcmg.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_render.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_sensors.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_sim2real.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_sys_composer.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_train.py +0 -0
- {imt_ring-1.6.21 → imt_ring-1.6.22}/tests/test_utils.py +0 -0
@@ -190,11 +190,11 @@ def _spring_force(sys: base.System, q: jax.Array):
|
|
190
190
|
|
191
191
|
def _calc_spring_force_per_link(_, __, q, zeropoint, typ):
|
192
192
|
# cor is (free, p3d) stacked; free is (spherical, p3d) stacked
|
193
|
-
if typ
|
193
|
+
if base.System.joint_type_is_free_or_cor(typ):
|
194
194
|
quat_force = _quaternion_spring_force(zeropoint[:4], q[:4])
|
195
195
|
pos_force = zeropoint[4:] - q[4:]
|
196
196
|
q_spring_force_link = jnp.concatenate((quat_force, pos_force))
|
197
|
-
elif typ
|
197
|
+
elif base.System.joint_type_is_spherical(typ):
|
198
198
|
q_spring_force_link = _quaternion_spring_force(zeropoint, q)
|
199
199
|
else:
|
200
200
|
q_spring_force_link = zeropoint - q
|
@@ -268,11 +268,11 @@ def _semi_implicit_euler_integration(
|
|
268
268
|
q_next = []
|
269
269
|
|
270
270
|
def q_integrate(_, __, q, qd, typ):
|
271
|
-
if typ
|
271
|
+
if sys.joint_type_is_free_or_cor(typ):
|
272
272
|
quat_next = _strapdown_integration(q[:4], qd[:3], sys.dt)
|
273
273
|
pos_next = q[4:] + qd[3:] * sys.dt
|
274
274
|
q_next_i = jnp.concatenate((quat_next, pos_next))
|
275
|
-
elif typ
|
275
|
+
elif sys.joint_type_is_spherical(typ):
|
276
276
|
quat_next = _strapdown_integration(q, qd, sys.dt)
|
277
277
|
q_next_i = quat_next
|
278
278
|
else:
|
@@ -1,3 +1,4 @@
|
|
1
|
+
from dataclasses import replace
|
1
2
|
from functools import partial
|
2
3
|
import random
|
3
4
|
from typing import Callable, Optional
|
@@ -446,7 +447,15 @@ def draw_random_q(
|
|
446
447
|
draw_fn = jcalc.get_joint_model(link_type).rcmg_draw_fn
|
447
448
|
if draw_fn is None:
|
448
449
|
raise Exception(f"The joint type {link_type} has no draw fn specified.")
|
449
|
-
|
450
|
+
|
451
|
+
if link_type in config.joint_type_specific_overwrites:
|
452
|
+
_config = replace(
|
453
|
+
config, **config.joint_type_specific_overwrites[link_type]
|
454
|
+
)
|
455
|
+
else:
|
456
|
+
_config = config
|
457
|
+
|
458
|
+
q_link = draw_fn(_config, key_t, key_value, sys.dt, N, joint_params)
|
450
459
|
# even revolute and prismatic joints must be 2d arrays
|
451
460
|
q_link = q_link if q_link.ndim == 2 else q_link[:, None]
|
452
461
|
q_list.append(q_link)
|
@@ -40,6 +40,12 @@ class MotionConfig:
|
|
40
40
|
dpos_max: float | TimeDependentFloat = 0.7
|
41
41
|
pos_min: float | TimeDependentFloat = -2.5
|
42
42
|
pos_max: float | TimeDependentFloat = +2.5
|
43
|
+
pos_min_p3d_x: float | TimeDependentFloat = -2.5
|
44
|
+
pos_max_p3d_x: float | TimeDependentFloat = +2.5
|
45
|
+
pos_min_p3d_y: float | TimeDependentFloat = -2.5
|
46
|
+
pos_max_p3d_y: float | TimeDependentFloat = +2.5
|
47
|
+
pos_min_p3d_z: float | TimeDependentFloat = -2.5
|
48
|
+
pos_max_p3d_z: float | TimeDependentFloat = +2.5
|
43
49
|
|
44
50
|
# used by both `random_angle_*` and `random_pos_*`
|
45
51
|
# only used if `randomized_interpolation` is set
|
@@ -59,6 +65,12 @@ class MotionConfig:
|
|
59
65
|
ang0_max: float = jnp.pi
|
60
66
|
pos0_min: float = 0.0
|
61
67
|
pos0_max: float = 0.0
|
68
|
+
pos0_min_p3d_x: float = 0.0
|
69
|
+
pos0_max_p3d_x: float = 0.0
|
70
|
+
pos0_min_p3d_y: float = 0.0
|
71
|
+
pos0_max_p3d_y: float = 0.0
|
72
|
+
pos0_min_p3d_z: float = 0.0
|
73
|
+
pos0_max_p3d_z: float = 0.0
|
62
74
|
|
63
75
|
# cor (center of rotation) custom fields
|
64
76
|
cor_t_min: float = 0.2
|
@@ -67,6 +79,14 @@ class MotionConfig:
|
|
67
79
|
cor_dpos_max: float | TimeDependentFloat = 0.5
|
68
80
|
cor_pos_min: float | TimeDependentFloat = -0.4
|
69
81
|
cor_pos_max: float | TimeDependentFloat = 0.4
|
82
|
+
cor_pos0_min: float = 0.0
|
83
|
+
cor_pos0_max: float = 0.0
|
84
|
+
|
85
|
+
# specify changes for this motionconfig and for specific joint types
|
86
|
+
# map of `link_types` -> dictionary of changes
|
87
|
+
joint_type_specific_overwrites: dict[str, dict[str, Any]] = field(
|
88
|
+
default_factory=lambda: dict()
|
89
|
+
)
|
70
90
|
|
71
91
|
def is_feasible(self) -> bool:
|
72
92
|
return _is_feasible_config1(self)
|
@@ -92,6 +112,9 @@ class MotionConfig:
|
|
92
112
|
def overwrite_for_joint_type(joint_type: str, **changes) -> None:
|
93
113
|
"""Changes values of the `MotionConfig` used by the draw_fn for only a specific
|
94
114
|
joint.
|
115
|
+
!!! Note
|
116
|
+
This applies these changes to *all* MotionConfigs for this joint type!
|
117
|
+
This takes precedence *over* `Motionconfig.joint_type_specific_overwrites`!
|
95
118
|
"""
|
96
119
|
previous_changes = _overwrite_for_joint_type_changes[joint_type]
|
97
120
|
for change in changes:
|
@@ -113,6 +136,56 @@ class MotionConfig:
|
|
113
136
|
overwrite=True,
|
114
137
|
)
|
115
138
|
|
139
|
+
@staticmethod
|
140
|
+
def overwrite_for_subsystem(
|
141
|
+
sys: base.System, link_name: str, **changes
|
142
|
+
) -> base.System:
|
143
|
+
"""Modifies motionconfig of all joints in subsystem with root `link_name`.
|
144
|
+
Note that if the subsystem contains a free joint then the jointtype will
|
145
|
+
will be re-named to `free_<link_name>`, then the RCMG flag `cor` will
|
146
|
+
potentially not work as expected because it searches for all joints of
|
147
|
+
type `free` to replace with `cor`. The workaround here is to change the
|
148
|
+
type already from `free` to `cor in the xml file.
|
149
|
+
This takes precedence *over* `Motionconfig.joint_type_specific_overwrites`!
|
150
|
+
|
151
|
+
Args:
|
152
|
+
sys (base.System): System object that gets updated
|
153
|
+
link_name (str): Root node of subsystem
|
154
|
+
changes: Changes to apply to the motionconfig
|
155
|
+
|
156
|
+
Return:
|
157
|
+
base.System: Updated system with new jointtypes
|
158
|
+
"""
|
159
|
+
from ring.algorithms.generator.finalize_fns import _P_gains
|
160
|
+
|
161
|
+
# all bodies in the subsystem
|
162
|
+
bodies = sys.findall_bodies_subsystem(link_name) + [sys.name_to_idx(link_name)]
|
163
|
+
|
164
|
+
jts_subsys = set([sys.link_types[i] for i in bodies]) - set(["frozen"])
|
165
|
+
postfix = "_" + link_name
|
166
|
+
# create new joint types with updated motionconfig
|
167
|
+
for typ in jts_subsys:
|
168
|
+
register_new_joint_type(
|
169
|
+
typ + postfix,
|
170
|
+
get_joint_model(typ),
|
171
|
+
base.Q_WIDTHS[typ],
|
172
|
+
base.QD_WIDTHS[typ],
|
173
|
+
)
|
174
|
+
MotionConfig.overwrite_for_joint_type(typ + postfix, **changes)
|
175
|
+
_P_gains[typ + postfix] = _P_gains[typ]
|
176
|
+
|
177
|
+
# rename all jointtypes
|
178
|
+
new_link_types = [
|
179
|
+
(
|
180
|
+
sys.link_types[i] + postfix
|
181
|
+
if (i in bodies and sys.link_types[i] != "frozen")
|
182
|
+
else sys.link_types[i]
|
183
|
+
)
|
184
|
+
for i in range(sys.num_links())
|
185
|
+
]
|
186
|
+
sys = sys.replace(link_types=new_link_types)
|
187
|
+
return sys
|
188
|
+
|
116
189
|
@staticmethod
|
117
190
|
def from_register(name: str) -> "MotionConfig":
|
118
191
|
return _registered_motion_configs[name]
|
@@ -221,6 +294,37 @@ _registered_motion_configs = {
|
|
221
294
|
}
|
222
295
|
|
223
296
|
|
297
|
+
def _joint_specific_overwrites_free_cor(
|
298
|
+
id: str, dang: float, dpos: float
|
299
|
+
) -> MotionConfig:
|
300
|
+
changes = dict(
|
301
|
+
dang_max_free_spherical=dang,
|
302
|
+
dpos_max=dpos,
|
303
|
+
cor_dpos_max=dpos,
|
304
|
+
t_min=1.5,
|
305
|
+
t_max=15.0,
|
306
|
+
)
|
307
|
+
return replace(
|
308
|
+
_registered_motion_configs[id],
|
309
|
+
joint_type_specific_overwrites=dict(free=changes, cor=changes),
|
310
|
+
)
|
311
|
+
|
312
|
+
|
313
|
+
_registered_motion_configs.update(
|
314
|
+
{
|
315
|
+
f"{id}-S": _joint_specific_overwrites_free_cor(id, 0.2, 0.1)
|
316
|
+
for id in ["expSlow", "expFast", "hinUndHer", "standard"]
|
317
|
+
}
|
318
|
+
)
|
319
|
+
_registered_motion_configs.update(
|
320
|
+
{
|
321
|
+
f"{id}-S+": _joint_specific_overwrites_free_cor(id, 0.1, 0.05)
|
322
|
+
for id in ["expSlow", "expFast", "hinUndHer", "standard"]
|
323
|
+
}
|
324
|
+
)
|
325
|
+
del _joint_specific_overwrites_free_cor
|
326
|
+
|
327
|
+
|
224
328
|
def _is_feasible_config1(c: MotionConfig) -> bool:
|
225
329
|
t_min, t_max = c.t_min, _to_float(c.t_max, 0.0)
|
226
330
|
|
@@ -254,8 +358,26 @@ def _is_feasible_config1(c: MotionConfig) -> bool:
|
|
254
358
|
cond2 = inside_box_checks(
|
255
359
|
_to_float(c.pos_min, 0.0), _to_float(c.pos_max, 0.0), c.pos0_min, c.pos0_max
|
256
360
|
)
|
361
|
+
cond3 = inside_box_checks(
|
362
|
+
_to_float(c.pos_min_p3d_x, 0.0),
|
363
|
+
_to_float(c.pos_max_p3d_x, 0.0),
|
364
|
+
c.pos0_min_p3d_x,
|
365
|
+
c.pos0_max_p3d_x,
|
366
|
+
)
|
367
|
+
cond4 = inside_box_checks(
|
368
|
+
_to_float(c.pos_min_p3d_y, 0.0),
|
369
|
+
_to_float(c.pos_max_p3d_y, 0.0),
|
370
|
+
c.pos0_min_p3d_y,
|
371
|
+
c.pos0_max_p3d_y,
|
372
|
+
)
|
373
|
+
cond5 = inside_box_checks(
|
374
|
+
_to_float(c.pos_min_p3d_z, 0.0),
|
375
|
+
_to_float(c.pos_max_p3d_z, 0.0),
|
376
|
+
c.pos0_min_p3d_z,
|
377
|
+
c.pos0_max_p3d_z,
|
378
|
+
)
|
257
379
|
|
258
|
-
return cond1 and cond2
|
380
|
+
return cond1 and cond2 and cond3 and cond4 and cond5
|
259
381
|
|
260
382
|
|
261
383
|
def _find_interval(t: jax.Array, boundaries: jax.Array):
|
@@ -504,7 +626,11 @@ def _draw_pxyz(
|
|
504
626
|
cor: bool = False,
|
505
627
|
) -> jax.Array:
|
506
628
|
key_value, consume = jax.random.split(key_value)
|
507
|
-
POS_0 = jax.random.uniform(
|
629
|
+
POS_0 = jax.random.uniform(
|
630
|
+
consume,
|
631
|
+
minval=config.cor_pos0_min if cor else config.pos0_min,
|
632
|
+
maxval=config.cor_pos0_max if cor else config.pos0_max,
|
633
|
+
)
|
508
634
|
max_iter = 100
|
509
635
|
return _random.random_position_over_time(
|
510
636
|
key_value,
|
@@ -590,10 +716,27 @@ def _draw_p3d_and_cor(
|
|
590
716
|
__: jax.Array,
|
591
717
|
cor: bool,
|
592
718
|
) -> jax.Array:
|
593
|
-
|
594
|
-
|
595
|
-
)
|
596
|
-
|
719
|
+
keys = jax.random.split(key_value, 3)
|
720
|
+
|
721
|
+
def draw(key, xyz: str):
|
722
|
+
return _draw_pxyz(
|
723
|
+
replace(
|
724
|
+
config,
|
725
|
+
pos_min=getattr(config, f"pos_min_p3d_{xyz}"),
|
726
|
+
pos_max=getattr(config, f"pos_max_p3d_{xyz}"),
|
727
|
+
pos0_min=getattr(config, f"pos0_min_p3d_{xyz}"),
|
728
|
+
pos0_max=getattr(config, f"pos0_max_p3d_{xyz}"),
|
729
|
+
),
|
730
|
+
None,
|
731
|
+
key,
|
732
|
+
dt,
|
733
|
+
N,
|
734
|
+
None,
|
735
|
+
cor,
|
736
|
+
)[:, None]
|
737
|
+
|
738
|
+
px, py, pz = draw(keys[0], "x"), draw(keys[1], "y"), draw(keys[2], "z")
|
739
|
+
return jnp.concat((px, py, pz), axis=-1)
|
597
740
|
|
598
741
|
|
599
742
|
def _draw_p3d(
|
@@ -7,6 +7,7 @@ from jax.core import Tracer
|
|
7
7
|
import jax.numpy as jnp
|
8
8
|
from jax.tree_util import tree_map
|
9
9
|
import numpy as np
|
10
|
+
import tree
|
10
11
|
import tree_utils as tu
|
11
12
|
|
12
13
|
import ring
|
@@ -590,6 +591,34 @@ class System(_Base):
|
|
590
591
|
|
591
592
|
return sys
|
592
593
|
|
594
|
+
@staticmethod
|
595
|
+
def joint_type_simplification(typ: str) -> str:
|
596
|
+
if typ[:4] == "free":
|
597
|
+
if typ == "free_2d":
|
598
|
+
return "free_2d"
|
599
|
+
else:
|
600
|
+
return "free"
|
601
|
+
elif typ[:3] == "cor":
|
602
|
+
return "cor"
|
603
|
+
elif typ[:9] == "spherical":
|
604
|
+
return "spherical"
|
605
|
+
else:
|
606
|
+
return typ
|
607
|
+
|
608
|
+
@staticmethod
|
609
|
+
def joint_type_is_free_or_cor(typ: str) -> bool:
|
610
|
+
return System.joint_type_simplification(typ) in ["free", "cor"]
|
611
|
+
|
612
|
+
@staticmethod
|
613
|
+
def joint_type_is_spherical(typ: str) -> bool:
|
614
|
+
return System.joint_type_simplification(typ) == "spherical"
|
615
|
+
|
616
|
+
@staticmethod
|
617
|
+
def joint_type_is_free_or_cor_or_spherical(typ: str) -> bool:
|
618
|
+
return System.joint_type_is_free_or_cor(typ) or System.joint_type_is_spherical(
|
619
|
+
typ
|
620
|
+
)
|
621
|
+
|
593
622
|
def findall_imus(self, names: bool = True) -> list[str] | list[int]:
|
594
623
|
bodies = [name for name in self.link_names if name[:3] == "imu"]
|
595
624
|
return bodies if names else [self.name_to_idx(n) for n in bodies]
|
@@ -618,10 +647,20 @@ class System(_Base):
|
|
618
647
|
return self._bodies_indices_to_bodies_name(bodies) if names else bodies
|
619
648
|
|
620
649
|
def children(self, name: str, names: bool = False) -> list[int] | list[str]:
|
650
|
+
"List all direct children of body, does not include body itself"
|
621
651
|
p = self.name_to_idx(name)
|
622
652
|
bodies = [i for i in range(self.num_links()) if self.link_parents[i] == p]
|
623
653
|
return bodies if (not names) else [self.idx_to_name(i) for i in bodies]
|
624
654
|
|
655
|
+
def findall_bodies_subsystem(
|
656
|
+
self, name: str, names: bool = False
|
657
|
+
) -> list[int] | list[str]:
|
658
|
+
"List all children and children's children; does not include body itself"
|
659
|
+
children = self.children(name, names=True)
|
660
|
+
grandchildren = [self.findall_bodies_subsystem(n, names=True) for n in children]
|
661
|
+
bodies = tree.flatten([children, grandchildren])
|
662
|
+
return bodies if names else [self.name_to_idx(n) for n in bodies]
|
663
|
+
|
625
664
|
def scan(self, f: Callable, in_types: str, *args, reverse: bool = False):
|
626
665
|
"""Scan `f` along each link in system whilst carrying along state.
|
627
666
|
|
@@ -889,7 +928,9 @@ def _parse_system(sys: System) -> System:
|
|
889
928
|
assert d.size == a.size == s.size == qd_size, error_msg
|
890
929
|
assert z.size == q_size, error_msg
|
891
930
|
|
892
|
-
if typ
|
931
|
+
if System.joint_type_is_free_or_cor_or_spherical(typ) and not isinstance(
|
932
|
+
z, Tracer
|
933
|
+
):
|
893
934
|
assert jnp.allclose(
|
894
935
|
jnp.linalg.norm(z[:4]), 1.0
|
895
936
|
), f"not unit quat for link `{name}` of typ `{typ}` in model"
|
@@ -1030,7 +1071,7 @@ class State(_Base):
|
|
1030
1071
|
def replace_by_unit_quat(_, idx_map, link_typ, link_idx):
|
1031
1072
|
nonlocal q
|
1032
1073
|
|
1033
|
-
if link_typ
|
1074
|
+
if sys.joint_type_is_free_or_cor_or_spherical(link_typ):
|
1034
1075
|
q_idxs_link = idx_map["q"](link_idx)
|
1035
1076
|
q = q.at[q_idxs_link.start].set(1.0)
|
1036
1077
|
|
@@ -3,6 +3,7 @@ from typing import Tuple, TypeVar
|
|
3
3
|
import jax
|
4
4
|
import jax.numpy as jnp
|
5
5
|
import numpy as np
|
6
|
+
|
6
7
|
from ring import base
|
7
8
|
|
8
9
|
T = TypeVar("T")
|
@@ -17,7 +18,7 @@ default_stiffness = lambda qd_size, **_: jnp.zeros((qd_size,))
|
|
17
18
|
|
18
19
|
def default_zeropoint(q_size, link_typ: str, **_):
|
19
20
|
zeropoint = jnp.zeros((q_size))
|
20
|
-
if link_typ
|
21
|
+
if base.System.joint_type_is_free_or_cor_or_spherical(link_typ):
|
21
22
|
# zeropoint then is unit quaternion and not zeros
|
22
23
|
zeropoint = zeropoint.at[0].set(1.0)
|
23
24
|
return zeropoint
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_morph_system/four_seg_seg1.xml
RENAMED
File without changes
|
{imt_ring-1.6.21 → imt_ring-1.6.22}/src/ring/io/examples/test_morph_system/four_seg_seg3.xml
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|