example-robot-data-loaders 6.0.0__2-py313-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/__init__.py +2 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/__main__.py +15 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/human.py +1327 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/panda.py +70 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/path.py +2 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/robots_loader.py +526 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/talos.py +99 -0
- cmeel.prefix/lib/python3.13/site-packages/example_robot_data/utils.py +174 -0
- cmeel.prefix/share/example-robot-data/hook/python_path.dsv +1 -0
- example_robot_data_loaders-6.0.0.dist-info/METADATA +87 -0
- example_robot_data_loaders-6.0.0.dist-info/RECORD +14 -0
- example_robot_data_loaders-6.0.0.dist-info/WHEEL +6 -0
- example_robot_data_loaders-6.0.0.dist-info/licenses/LICENSE +26 -0
- example_robot_data_loaders-6.0.0.dist-info/top_level.txt +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
from os.path import join
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
import pinocchio as pin
|
|
5
|
+
|
|
6
|
+
try:
|
|
7
|
+
import coal
|
|
8
|
+
except ImportError:
|
|
9
|
+
coal = None
|
|
10
|
+
|
|
11
|
+
from .utils import RobotLoader, getModelPath
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class PandaLoader(RobotLoader):
|
|
15
|
+
path = "panda_description"
|
|
16
|
+
urdf_filename = "panda.urdf"
|
|
17
|
+
urdf_subpath = "urdf"
|
|
18
|
+
srdf_filename = "panda.srdf"
|
|
19
|
+
ref_posture = "default"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class PandaLoaderCollision(PandaLoader):
|
|
23
|
+
urdf_filename = "panda_collision.urdf"
|
|
24
|
+
|
|
25
|
+
def __init__(self, verbose=False):
|
|
26
|
+
super().__init__(verbose=verbose)
|
|
27
|
+
|
|
28
|
+
self.srdf_path = None
|
|
29
|
+
self.robot.q0 = pin.neutral(self.robot.model)
|
|
30
|
+
root = getModelPath(self.path)
|
|
31
|
+
self.robot.urdf = join(root, self.path, self.urdf_subpath, self.urdf_filename)
|
|
32
|
+
|
|
33
|
+
# If coal is not available, gracefully skip collision edits
|
|
34
|
+
if coal is None or not getattr(pin, "WITH_COLLISION", True):
|
|
35
|
+
print(
|
|
36
|
+
"[PandaLoaderCollision] coal not available - skipping collision geometry processing."
|
|
37
|
+
)
|
|
38
|
+
return
|
|
39
|
+
|
|
40
|
+
cmodel = self.robot.collision_model.copy()
|
|
41
|
+
list_names_capsules = []
|
|
42
|
+
# Iterate through geometry objects in the collision model
|
|
43
|
+
for geom_object in cmodel.geometryObjects:
|
|
44
|
+
geometry = geom_object.geometry
|
|
45
|
+
# Remove superfluous suffix from the name
|
|
46
|
+
base_name = "_".join(geom_object.name.split("_")[:-1])
|
|
47
|
+
|
|
48
|
+
# Convert cylinders to capsules
|
|
49
|
+
if isinstance(geometry, coal.Cylinder):
|
|
50
|
+
name = self.generate_capsule_name(base_name, list_names_capsules)
|
|
51
|
+
list_names_capsules.append(name)
|
|
52
|
+
capsule = pin.GeometryObject(
|
|
53
|
+
name=name,
|
|
54
|
+
parent_frame=int(geom_object.parentFrame),
|
|
55
|
+
parent_joint=int(geom_object.parentJoint),
|
|
56
|
+
collision_geometry=coal.Capsule(
|
|
57
|
+
geometry.radius, geometry.halfLength
|
|
58
|
+
),
|
|
59
|
+
placement=geom_object.placement,
|
|
60
|
+
)
|
|
61
|
+
capsule.meshColor = np.array([249, 136, 126, 125]) / 255 # Red color
|
|
62
|
+
self.robot.collision_model.addGeometryObject(capsule)
|
|
63
|
+
self.robot.collision_model.removeGeometryObject(geom_object.name)
|
|
64
|
+
|
|
65
|
+
# Remove spheres associated with links
|
|
66
|
+
elif isinstance(geometry, coal.Sphere) and "link" in geom_object.name:
|
|
67
|
+
self.robot.collision_model.removeGeometryObject(geom_object.name)
|
|
68
|
+
|
|
69
|
+
# Recreate collision data since the collision pairs changed
|
|
70
|
+
self.robot.collision_data = self.robot.collision_model.createData()
|
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
import typing
|
|
2
|
+
|
|
3
|
+
import pinocchio as pin
|
|
4
|
+
|
|
5
|
+
try:
|
|
6
|
+
from .path import ( # noqa: F401
|
|
7
|
+
EXAMPLE_ROBOT_DATA_MODEL_DIR,
|
|
8
|
+
EXAMPLE_ROBOT_DATA_SOURCE_DIR,
|
|
9
|
+
)
|
|
10
|
+
except ImportError:
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
from .human import HumanLoader
|
|
14
|
+
from .panda import PandaLoader, PandaLoaderCollision
|
|
15
|
+
from .talos import (
|
|
16
|
+
TalosArmLoader,
|
|
17
|
+
TalosBoxLoader,
|
|
18
|
+
TalosFullBoxLoader,
|
|
19
|
+
TalosFullLoader,
|
|
20
|
+
TalosLegsLoader,
|
|
21
|
+
TalosLoader,
|
|
22
|
+
)
|
|
23
|
+
from .utils import RobotLoader, getModelPath, readParamsFromSrdf # noqa: F401
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class CentauroLoader(RobotLoader):
|
|
27
|
+
path = "centauro_description"
|
|
28
|
+
urdf_filename = "centauro.urdf"
|
|
29
|
+
urdf_subpath = "urdf"
|
|
30
|
+
srdf_filename = "centauro.srdf"
|
|
31
|
+
ref_posture = "homing_balanced"
|
|
32
|
+
free_flyer = True
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class B1Loader(RobotLoader):
|
|
36
|
+
path = "b1_description"
|
|
37
|
+
urdf_filename = "b1.urdf"
|
|
38
|
+
urdf_subpath = "urdf"
|
|
39
|
+
srdf_filename = "b1.srdf"
|
|
40
|
+
ref_posture = "standing"
|
|
41
|
+
free_flyer = True
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class Go1Loader(RobotLoader):
|
|
45
|
+
path = "go1_description"
|
|
46
|
+
urdf_filename = "go1.urdf"
|
|
47
|
+
urdf_subpath = "urdf"
|
|
48
|
+
srdf_filename = "go1.srdf"
|
|
49
|
+
ref_posture = "standing"
|
|
50
|
+
free_flyer = True
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class Go2Loader(RobotLoader):
|
|
54
|
+
path = "go2_description"
|
|
55
|
+
urdf_filename = "go2.urdf"
|
|
56
|
+
urdf_subpath = "urdf"
|
|
57
|
+
srdf_filename = "go2.srdf"
|
|
58
|
+
ref_posture = "standing"
|
|
59
|
+
free_flyer = True
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class A1Loader(RobotLoader):
|
|
63
|
+
path = "a1_description"
|
|
64
|
+
urdf_filename = "a1.urdf"
|
|
65
|
+
urdf_subpath = "urdf"
|
|
66
|
+
srdf_filename = "a1.srdf"
|
|
67
|
+
ref_posture = "standing"
|
|
68
|
+
free_flyer = True
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
class G1Loader(RobotLoader):
|
|
72
|
+
path = "g1_description"
|
|
73
|
+
urdf_subpath = "urdf"
|
|
74
|
+
urdf_filename = "g1_29dof_rev_1_0.urdf"
|
|
75
|
+
ref_posture = "standing"
|
|
76
|
+
free_flyer = True
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class G1WithHandsLoader(G1Loader):
|
|
80
|
+
path = "g1_description"
|
|
81
|
+
urdf_subpath = "urdf"
|
|
82
|
+
urdf_filename = "g1_29dof_with_hand_rev_1_0.urdf"
|
|
83
|
+
ref_posture = "standing"
|
|
84
|
+
free_flyer = True
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class Z1Loader(RobotLoader):
|
|
88
|
+
path = "z1_description"
|
|
89
|
+
urdf_filename = "z1.urdf"
|
|
90
|
+
urdf_subpath = "urdf"
|
|
91
|
+
srdf_filename = "z1.srdf"
|
|
92
|
+
ref_posture = "arm_up"
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
class B1Z1Loader(B1Loader):
|
|
96
|
+
urdf_filename = "b1-z1.urdf"
|
|
97
|
+
srdf_filename = "b1-z1.srdf"
|
|
98
|
+
ref_posture = "standing_with_arm_home"
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
class ANYmalLoader(RobotLoader):
|
|
102
|
+
path = "anymal_b_simple_description"
|
|
103
|
+
urdf_filename = "anymal.urdf"
|
|
104
|
+
srdf_filename = "anymal.srdf"
|
|
105
|
+
ref_posture = "standing"
|
|
106
|
+
free_flyer = True
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
class ANYmalCLoader(RobotLoader):
|
|
110
|
+
path = "anymal_c_simple_description"
|
|
111
|
+
urdf_subpath = "urdf"
|
|
112
|
+
urdf_filename = "anymal.urdf"
|
|
113
|
+
srdf_filename = "anymal.srdf"
|
|
114
|
+
ref_posture = "standing"
|
|
115
|
+
free_flyer = True
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
class LaikagoLoader(RobotLoader):
|
|
119
|
+
path = "laikago_description"
|
|
120
|
+
urdf_subpath = "urdf"
|
|
121
|
+
urdf_filename = "laikago.urdf"
|
|
122
|
+
free_flyer = True
|
|
123
|
+
|
|
124
|
+
|
|
125
|
+
class ANYmalKinovaLoader(ANYmalLoader):
|
|
126
|
+
urdf_filename = "anymal-kinova.urdf"
|
|
127
|
+
srdf_filename = "anymal-kinova.srdf"
|
|
128
|
+
ref_posture = "standing_with_arm_up"
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class BaxterLoader(RobotLoader):
|
|
132
|
+
path = "baxter_description"
|
|
133
|
+
urdf_filename = "baxter.urdf"
|
|
134
|
+
srdf_filename = "baxter_manipulation.srdf"
|
|
135
|
+
urdf_subpath = "urdf"
|
|
136
|
+
srdf_subpath = "srdf"
|
|
137
|
+
ref_posture = "neutral"
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
class CassieLoader(RobotLoader):
|
|
141
|
+
path = "cassie_description"
|
|
142
|
+
if tuple(int(i) for i in pin.__version__.split(".")) > (2, 9, 1):
|
|
143
|
+
sdf_filename = "cassie.sdf"
|
|
144
|
+
else:
|
|
145
|
+
sdf_filename = "cassie_v2.sdf"
|
|
146
|
+
sdf_subpath = "robots"
|
|
147
|
+
srdf_filename = "cassie_v2.srdf"
|
|
148
|
+
ref_posture = "standing"
|
|
149
|
+
free_flyer = True
|
|
150
|
+
sdf_root_link_name = "pelvis"
|
|
151
|
+
sdf_parent_guidance: typing.ClassVar = [
|
|
152
|
+
"left-roll-op",
|
|
153
|
+
"left-yaw-op",
|
|
154
|
+
"left-pitch-op",
|
|
155
|
+
"left-knee-op",
|
|
156
|
+
"left-tarsus-spring-joint",
|
|
157
|
+
"left-foot-op",
|
|
158
|
+
"right-roll-op",
|
|
159
|
+
"right-yaw-op",
|
|
160
|
+
"right-pitch-op",
|
|
161
|
+
"right-knee-op",
|
|
162
|
+
"right-tarsus-spring-joint",
|
|
163
|
+
"right-foot-op",
|
|
164
|
+
]
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
class AsrTwoDofLoader(RobotLoader):
|
|
168
|
+
path = "asr_twodof_description"
|
|
169
|
+
urdf_filename = "TwoDofs.urdf"
|
|
170
|
+
urdf_subpath = "urdf"
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class HyQLoader(RobotLoader):
|
|
174
|
+
path = "hyq_description"
|
|
175
|
+
urdf_filename = "hyq_no_sensors.urdf"
|
|
176
|
+
srdf_filename = "hyq.srdf"
|
|
177
|
+
ref_posture = "standing"
|
|
178
|
+
free_flyer = True
|
|
179
|
+
|
|
180
|
+
|
|
181
|
+
class BoltLoader(RobotLoader):
|
|
182
|
+
path = "bolt_description"
|
|
183
|
+
urdf_filename = "bolt.urdf"
|
|
184
|
+
srdf_filename = "bolt.srdf"
|
|
185
|
+
ref_posture = "standing"
|
|
186
|
+
free_flyer = True
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class BorinotLoader(RobotLoader):
|
|
190
|
+
path = "borinot_description"
|
|
191
|
+
urdf_subpath = "urdf"
|
|
192
|
+
srdf_subpath = "srdf"
|
|
193
|
+
urdf_filename = "borinot_flying_arm_2.urdf"
|
|
194
|
+
srdf_filename = "borinot_flying_arm_2.srdf"
|
|
195
|
+
ref_posture = "home"
|
|
196
|
+
free_flyer = True
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class Solo8Loader(RobotLoader):
|
|
200
|
+
path = "solo_description"
|
|
201
|
+
urdf_filename = "solo.urdf"
|
|
202
|
+
srdf_filename = "solo.srdf"
|
|
203
|
+
ref_posture = "standing"
|
|
204
|
+
free_flyer = True
|
|
205
|
+
|
|
206
|
+
|
|
207
|
+
class Solo12Loader(Solo8Loader):
|
|
208
|
+
urdf_filename = "solo12.urdf"
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
class FingerEduLoader(RobotLoader):
|
|
212
|
+
path = "finger_edu_description"
|
|
213
|
+
urdf_filename = "finger_edu.urdf"
|
|
214
|
+
srdf_filename = "finger_edu.srdf"
|
|
215
|
+
ref_posture = "hanging"
|
|
216
|
+
free_flyer = False
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class KinovaLoader(RobotLoader):
|
|
220
|
+
path = "kinova_description"
|
|
221
|
+
urdf_filename = "kinova.urdf"
|
|
222
|
+
srdf_filename = "kinova.srdf"
|
|
223
|
+
ref_posture = "arm_up"
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
class TiagoLoader(RobotLoader):
|
|
227
|
+
path = "tiago_description"
|
|
228
|
+
urdf_filename = "tiago.urdf"
|
|
229
|
+
|
|
230
|
+
|
|
231
|
+
class TiagoDualLoader(TiagoLoader):
|
|
232
|
+
urdf_filename = "tiago_dual.urdf"
|
|
233
|
+
|
|
234
|
+
|
|
235
|
+
class TiagoNoHandLoader(TiagoLoader):
|
|
236
|
+
urdf_filename = "tiago_no_hand.urdf"
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
class TiagoProLoader(RobotLoader):
|
|
240
|
+
path = "tiago_pro_description"
|
|
241
|
+
urdf_filename = "tiago_pro.urdf"
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class ICubLoader(RobotLoader):
|
|
245
|
+
path = "icub_description"
|
|
246
|
+
urdf_filename = "icub.urdf"
|
|
247
|
+
srdf_filename = "icub.srdf"
|
|
248
|
+
free_flyer = True
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
class ICubReducedLoader(ICubLoader):
|
|
252
|
+
urdf_filename = "icub_reduced.urdf"
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class AlexanderLoader(RobotLoader):
|
|
256
|
+
path = "alexander_description"
|
|
257
|
+
urdf_filename = "alexander_v1.lowerBodyOnly.urdf"
|
|
258
|
+
urdf_subpath = "urdf"
|
|
259
|
+
free_flyer = True
|
|
260
|
+
ref_posture = "default"
|
|
261
|
+
srdf_filename = "alexander.srdf"
|
|
262
|
+
|
|
263
|
+
|
|
264
|
+
class AlexNubHandsLoader(RobotLoader):
|
|
265
|
+
path = "alex_description"
|
|
266
|
+
urdf_filename = "alex_nub_hands.urdf"
|
|
267
|
+
urdf_subpath = "urdf"
|
|
268
|
+
ref_posture = "default"
|
|
269
|
+
|
|
270
|
+
|
|
271
|
+
class AlexPsyonicHandsLoader(RobotLoader):
|
|
272
|
+
path = "alex_description"
|
|
273
|
+
urdf_filename = "alex_psyonic_hands.urdf"
|
|
274
|
+
urdf_subpath = "urdf"
|
|
275
|
+
srdf_filename = "alex_psyonic_hands.srdf"
|
|
276
|
+
ref_posture = "default"
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
class AlexSakeHandsLoader(RobotLoader):
|
|
280
|
+
path = "alex_description"
|
|
281
|
+
urdf_filename = "alex_sake_hands.urdf"
|
|
282
|
+
urdf_subpath = "urdf"
|
|
283
|
+
srdf_filename = "alex_sake_hands.srdf"
|
|
284
|
+
ref_posture = "default"
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class AllegroRightHandLoader(RobotLoader):
|
|
288
|
+
path = "allegro_hand_description"
|
|
289
|
+
urdf_filename = "allegro_right_hand.urdf"
|
|
290
|
+
urdf_subpath = "urdf"
|
|
291
|
+
|
|
292
|
+
|
|
293
|
+
class AllegroLeftHandLoader(RobotLoader):
|
|
294
|
+
path = "allegro_hand_description"
|
|
295
|
+
urdf_filename = "allegro_left_hand.urdf"
|
|
296
|
+
urdf_subpath = "urdf"
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
class UR3Loader(RobotLoader):
|
|
300
|
+
path = "ur_description"
|
|
301
|
+
urdf_filename = "ur3_robot.urdf"
|
|
302
|
+
urdf_subpath = "urdf"
|
|
303
|
+
ref_posture = None
|
|
304
|
+
|
|
305
|
+
|
|
306
|
+
class UR3GripperLoader(UR3Loader):
|
|
307
|
+
urdf_filename = "ur3_gripper.urdf"
|
|
308
|
+
srdf_filename = "ur3_gripper.srdf"
|
|
309
|
+
|
|
310
|
+
|
|
311
|
+
class UR3LimitedLoader(UR3Loader):
|
|
312
|
+
urdf_filename = "ur3_joint_limited_robot.urdf"
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
class UR5Loader(UR3Loader):
|
|
316
|
+
urdf_filename = "ur5_robot.urdf"
|
|
317
|
+
srdf_filename = "ur5.srdf"
|
|
318
|
+
|
|
319
|
+
|
|
320
|
+
class UR5GripperLoader(UR5Loader):
|
|
321
|
+
urdf_filename = "ur5_gripper.urdf"
|
|
322
|
+
srdf_filename = "ur5_gripper.srdf"
|
|
323
|
+
|
|
324
|
+
|
|
325
|
+
class UR5LimitedLoader(UR5Loader):
|
|
326
|
+
urdf_filename = "ur5_joint_limited_robot.urdf"
|
|
327
|
+
|
|
328
|
+
|
|
329
|
+
class UR10Loader(UR3Loader):
|
|
330
|
+
urdf_filename = "ur10_robot.urdf"
|
|
331
|
+
|
|
332
|
+
|
|
333
|
+
class UR10LimitedLoader(UR10Loader):
|
|
334
|
+
urdf_filename = "ur10_joint_limited_robot.urdf"
|
|
335
|
+
|
|
336
|
+
|
|
337
|
+
class HectorLoader(RobotLoader):
|
|
338
|
+
path = "hector_description"
|
|
339
|
+
urdf_filename = "quadrotor_base.urdf"
|
|
340
|
+
free_flyer = True
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
class HextiltLoader(RobotLoader):
|
|
344
|
+
path = "hextilt_description"
|
|
345
|
+
urdf_subpath = "urdf"
|
|
346
|
+
srdf_subpath = "srdf"
|
|
347
|
+
urdf_filename = "hextilt_flying_arm_5.urdf"
|
|
348
|
+
srdf_filename = "hextilt_flying_arm_5.srdf"
|
|
349
|
+
ref_posture = "home"
|
|
350
|
+
free_flyer = True
|
|
351
|
+
|
|
352
|
+
|
|
353
|
+
class DoublePendulumLoader(RobotLoader):
|
|
354
|
+
path = "double_pendulum_description"
|
|
355
|
+
urdf_filename = "double_pendulum.urdf"
|
|
356
|
+
urdf_subpath = "urdf"
|
|
357
|
+
|
|
358
|
+
|
|
359
|
+
class DoublePendulumContinuousLoader(DoublePendulumLoader):
|
|
360
|
+
urdf_filename = "double_pendulum_continuous.urdf"
|
|
361
|
+
|
|
362
|
+
|
|
363
|
+
class DoublePendulumSimpleLoader(DoublePendulumLoader):
|
|
364
|
+
urdf_filename = "double_pendulum_simple.urdf"
|
|
365
|
+
|
|
366
|
+
|
|
367
|
+
class QuadrupedLoader(RobotLoader):
|
|
368
|
+
path = "quadruped_description"
|
|
369
|
+
urdf_subpath = "urdf"
|
|
370
|
+
urdf_filename = "quadruped.urdf"
|
|
371
|
+
free_flyer = True
|
|
372
|
+
|
|
373
|
+
|
|
374
|
+
class RomeoLoader(RobotLoader):
|
|
375
|
+
path = "romeo_description"
|
|
376
|
+
urdf_filename = "romeo.urdf"
|
|
377
|
+
urdf_subpath = "urdf"
|
|
378
|
+
free_flyer = True
|
|
379
|
+
|
|
380
|
+
|
|
381
|
+
class SimpleHumanoidLoader(RobotLoader):
|
|
382
|
+
path = "simple_humanoid_description"
|
|
383
|
+
urdf_subpath = "urdf"
|
|
384
|
+
urdf_filename = "simple_humanoid.urdf"
|
|
385
|
+
srdf_filename = "simple_humanoid.srdf"
|
|
386
|
+
free_flyer = True
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
class SimpleHumanoidClassicalLoader(SimpleHumanoidLoader):
|
|
390
|
+
urdf_filename = "simple_humanoid_classical.urdf"
|
|
391
|
+
srdf_filename = "simple_humanoid_classical.srdf"
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
class IrisLoader(RobotLoader):
|
|
395
|
+
path = "iris_description"
|
|
396
|
+
urdf_filename = "iris_simple.urdf"
|
|
397
|
+
free_flyer = True
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
class SO100Loader(RobotLoader):
|
|
401
|
+
path = "so_arm_description"
|
|
402
|
+
urdf_filename = "so100.urdf"
|
|
403
|
+
urdf_subpath = "urdf"
|
|
404
|
+
free_flyer = True
|
|
405
|
+
|
|
406
|
+
|
|
407
|
+
class SO101Loader(RobotLoader):
|
|
408
|
+
path = "so_arm_description"
|
|
409
|
+
urdf_filename = "so101.urdf"
|
|
410
|
+
urdf_subpath = "urdf"
|
|
411
|
+
free_flyer = True
|
|
412
|
+
|
|
413
|
+
|
|
414
|
+
class PR2Loader(RobotLoader):
|
|
415
|
+
path = "pr2_description"
|
|
416
|
+
urdf_filename = "pr2.urdf"
|
|
417
|
+
urdf_subpath = "urdf"
|
|
418
|
+
srdf_filename = "pr2.srdf"
|
|
419
|
+
free_flyer = True
|
|
420
|
+
ref_posture = "tuck_left_arm"
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
class xArm7Loader(RobotLoader):
|
|
424
|
+
path = "xarm_description"
|
|
425
|
+
urdf_subpath = "urdf"
|
|
426
|
+
urdf_filename = "xarm7.urdf"
|
|
427
|
+
srdf_filename = "xarm7.srdf"
|
|
428
|
+
ref_posture = "home"
|
|
429
|
+
|
|
430
|
+
|
|
431
|
+
ROBOTS = {
|
|
432
|
+
"centauro": CentauroLoader,
|
|
433
|
+
"b1": B1Loader,
|
|
434
|
+
"go1": Go1Loader,
|
|
435
|
+
"go2": Go2Loader,
|
|
436
|
+
"a1": A1Loader,
|
|
437
|
+
"g1": G1Loader,
|
|
438
|
+
"g1_with_hands": G1WithHandsLoader,
|
|
439
|
+
"z1": Z1Loader,
|
|
440
|
+
"b1_z1": B1Z1Loader,
|
|
441
|
+
"anymal": ANYmalLoader,
|
|
442
|
+
"anymal_c": ANYmalCLoader,
|
|
443
|
+
"anymal_kinova": ANYmalKinovaLoader,
|
|
444
|
+
"asr_twodof": AsrTwoDofLoader,
|
|
445
|
+
"baxter": BaxterLoader,
|
|
446
|
+
"cassie": CassieLoader,
|
|
447
|
+
"double_pendulum": DoublePendulumLoader,
|
|
448
|
+
"double_pendulum_continuous": DoublePendulumContinuousLoader,
|
|
449
|
+
"double_pendulum_simple": DoublePendulumSimpleLoader,
|
|
450
|
+
"hector": HectorLoader,
|
|
451
|
+
"hextilt": HextiltLoader,
|
|
452
|
+
"human": HumanLoader,
|
|
453
|
+
"hyq": HyQLoader,
|
|
454
|
+
"icub": ICubLoader,
|
|
455
|
+
"icub_reduced": ICubReducedLoader,
|
|
456
|
+
"iris": IrisLoader,
|
|
457
|
+
"kinova": KinovaLoader,
|
|
458
|
+
"laikago": LaikagoLoader,
|
|
459
|
+
"panda": PandaLoader,
|
|
460
|
+
"panda_collision": PandaLoaderCollision,
|
|
461
|
+
"alexander": AlexanderLoader,
|
|
462
|
+
"alex_nub_hands": AlexNubHandsLoader,
|
|
463
|
+
"alex_psyonic_hands": AlexPsyonicHandsLoader,
|
|
464
|
+
"alex_sake_hands": AlexSakeHandsLoader,
|
|
465
|
+
"allegro_right_hand": AllegroRightHandLoader,
|
|
466
|
+
"allegro_left_hand": AllegroLeftHandLoader,
|
|
467
|
+
"quadruped": QuadrupedLoader,
|
|
468
|
+
"romeo": RomeoLoader,
|
|
469
|
+
"simple_humanoid": SimpleHumanoidLoader,
|
|
470
|
+
"simple_humanoid_classical": SimpleHumanoidClassicalLoader,
|
|
471
|
+
"bolt": BoltLoader,
|
|
472
|
+
"borinot": BorinotLoader,
|
|
473
|
+
"so100": SO100Loader,
|
|
474
|
+
"so101": SO101Loader,
|
|
475
|
+
"solo8": Solo8Loader,
|
|
476
|
+
"solo12": Solo12Loader,
|
|
477
|
+
"finger_edu": FingerEduLoader,
|
|
478
|
+
"pr2": PR2Loader,
|
|
479
|
+
"talos": TalosLoader,
|
|
480
|
+
"talos_box": TalosBoxLoader,
|
|
481
|
+
"talos_arm": TalosArmLoader,
|
|
482
|
+
"talos_legs": TalosLegsLoader,
|
|
483
|
+
"talos_full": TalosFullLoader,
|
|
484
|
+
"talos_full_box": TalosFullBoxLoader,
|
|
485
|
+
"tiago": TiagoLoader,
|
|
486
|
+
"tiago_dual": TiagoDualLoader,
|
|
487
|
+
"tiago_no_hand": TiagoNoHandLoader,
|
|
488
|
+
"tiago_pro": TiagoProLoader,
|
|
489
|
+
"ur3": UR5Loader,
|
|
490
|
+
"ur3_gripper": UR3GripperLoader,
|
|
491
|
+
"ur3_limited": UR3LimitedLoader,
|
|
492
|
+
"ur5": UR5Loader,
|
|
493
|
+
"ur5_gripper": UR5GripperLoader,
|
|
494
|
+
"ur5_limited": UR5LimitedLoader,
|
|
495
|
+
"ur10": UR10Loader,
|
|
496
|
+
"ur10_limited": UR10LimitedLoader,
|
|
497
|
+
"xarm7": xArm7Loader,
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
def loader(name, display=False, rootNodeName="", verbose=False):
|
|
502
|
+
"""Load a robot by its name, and optionally display it in a viewer."""
|
|
503
|
+
if name not in ROBOTS:
|
|
504
|
+
robots = ", ".join(sorted(ROBOTS.keys()))
|
|
505
|
+
raise ValueError(f"Robot '{name}' not found. Possible values are {robots}")
|
|
506
|
+
inst = ROBOTS[name](verbose=verbose)
|
|
507
|
+
if display:
|
|
508
|
+
if rootNodeName:
|
|
509
|
+
inst.robot.initViewer()
|
|
510
|
+
inst.robot.viz.loadViewerModel(rootNodeName=rootNodeName)
|
|
511
|
+
else:
|
|
512
|
+
inst.robot.initViewer(loadModel=True)
|
|
513
|
+
inst.robot.display(inst.robot.q0)
|
|
514
|
+
return inst
|
|
515
|
+
|
|
516
|
+
|
|
517
|
+
def load(name, display=False, rootNodeName="", verbose=False):
|
|
518
|
+
"""Load a robot by its name, and optionnaly display it in a viewer."""
|
|
519
|
+
return loader(name, display, rootNodeName, verbose).robot
|
|
520
|
+
|
|
521
|
+
|
|
522
|
+
def load_full(name, display=False, rootNodeName="", verbose=False):
|
|
523
|
+
"""Load a robot by its name, optionnaly display it in a viewer,
|
|
524
|
+
and provide its q0 and paths."""
|
|
525
|
+
inst = loader(name, display, rootNodeName, verbose)
|
|
526
|
+
return inst.robot, inst.robot.q0, inst.df_path, inst.srdf_path
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import numpy as np
|
|
2
|
+
import pinocchio as pin
|
|
3
|
+
|
|
4
|
+
from .utils import RobotLoader, readParamsFromSrdf
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class TalosLoader(RobotLoader):
|
|
8
|
+
path = "talos_data"
|
|
9
|
+
urdf_filename = "talos_reduced.urdf"
|
|
10
|
+
srdf_filename = "talos.srdf"
|
|
11
|
+
free_flyer = True
|
|
12
|
+
has_rotor_parameters = True
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class TalosBoxLoader(TalosLoader):
|
|
16
|
+
urdf_filename = "talos_reduced_box.urdf"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class TalosFullLoader(TalosLoader):
|
|
20
|
+
urdf_filename = "talos_full_v2.urdf"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class TalosFullBoxLoader(TalosLoader):
|
|
24
|
+
urdf_filename = "talos_full_v2_box.urdf"
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
class TalosArmLoader(TalosLoader):
|
|
28
|
+
urdf_filename = "talos_left_arm.urdf"
|
|
29
|
+
free_flyer = False
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class TalosLegsLoader(TalosLoader):
|
|
33
|
+
def __init__(self, verbose=False):
|
|
34
|
+
super().__init__(verbose=verbose)
|
|
35
|
+
legMaxId = 14
|
|
36
|
+
m1 = self.robot.model
|
|
37
|
+
m2 = pin.Model()
|
|
38
|
+
for j, M, name, parent, Y in zip(
|
|
39
|
+
m1.joints, m1.jointPlacements, m1.names, m1.parents, m1.inertias
|
|
40
|
+
):
|
|
41
|
+
if j.id < legMaxId:
|
|
42
|
+
jid = m2.addJoint(parent, getattr(pin, j.shortname())(), M, name)
|
|
43
|
+
idx_q, idx_v = m2.joints[jid].idx_q, m2.joints[jid].idx_v
|
|
44
|
+
m2.upperPositionLimit[idx_q : idx_q + j.nq] = m1.upperPositionLimit[
|
|
45
|
+
j.idx_q : j.idx_q + j.nq
|
|
46
|
+
]
|
|
47
|
+
m2.lowerPositionLimit[idx_q : idx_q + j.nq] = m1.lowerPositionLimit[
|
|
48
|
+
j.idx_q : j.idx_q + j.nq
|
|
49
|
+
]
|
|
50
|
+
m2.velocityLimit[idx_v : idx_v + j.nv] = m1.velocityLimit[
|
|
51
|
+
j.idx_v : j.idx_v + j.nv
|
|
52
|
+
]
|
|
53
|
+
m2.effortLimit[idx_v : idx_v + j.nv] = m1.effortLimit[
|
|
54
|
+
j.idx_v : j.idx_v + j.nv
|
|
55
|
+
]
|
|
56
|
+
assert jid == j.id
|
|
57
|
+
m2.appendBodyToJoint(jid, Y, pin.SE3.Identity())
|
|
58
|
+
|
|
59
|
+
upperPos = m2.upperPositionLimit
|
|
60
|
+
upperPos[:7] = 1
|
|
61
|
+
m2.upperPositionLimit = upperPos
|
|
62
|
+
lowerPos = m2.lowerPositionLimit
|
|
63
|
+
lowerPos[:7] = -1
|
|
64
|
+
m2.lowerPositionLimit = lowerPos
|
|
65
|
+
effort = m2.effortLimit
|
|
66
|
+
effort[:6] = np.inf
|
|
67
|
+
m2.effortLimit = effort
|
|
68
|
+
|
|
69
|
+
# q2 = self.robot.q0[:19]
|
|
70
|
+
for f in m1.frames:
|
|
71
|
+
if tuple(int(i) for i in pin.__version__.split(".")) >= (3, 0, 0):
|
|
72
|
+
if f.parentJoint < legMaxId:
|
|
73
|
+
m2.addFrame(f)
|
|
74
|
+
elif f.parent < legMaxId:
|
|
75
|
+
m2.addFrame(f)
|
|
76
|
+
|
|
77
|
+
g2 = pin.GeometryModel()
|
|
78
|
+
for g in self.robot.visual_model.geometryObjects:
|
|
79
|
+
if g.parentJoint < 14:
|
|
80
|
+
g2.addGeometryObject(g)
|
|
81
|
+
|
|
82
|
+
self.robot.model = m2
|
|
83
|
+
self.robot.data = m2.createData()
|
|
84
|
+
self.robot.visual_model = g2
|
|
85
|
+
# self.robot.q0=q2
|
|
86
|
+
self.robot.visual_data = pin.GeometryData(g2)
|
|
87
|
+
|
|
88
|
+
# Load SRDF file
|
|
89
|
+
self.robot.q0 = readParamsFromSrdf(
|
|
90
|
+
self.robot.model,
|
|
91
|
+
self.srdf_path,
|
|
92
|
+
self.verbose,
|
|
93
|
+
self.has_rotor_parameters,
|
|
94
|
+
self.ref_posture,
|
|
95
|
+
)
|
|
96
|
+
|
|
97
|
+
assert (m2.armature[:6] == 0.0).all()
|
|
98
|
+
# Add the free-flyer joint limits to the new model
|
|
99
|
+
self.addFreeFlyerJointLimits()
|