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.
@@ -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,2 @@
1
+ EXAMPLE_ROBOT_DATA_MODEL_DIR = "/tmp/pip-build-env-wl0om5xf/overlay/lib/python3.13/site-packages/cmeel.prefix/share/example-robot-data/robots"
2
+ EXAMPLE_ROBOT_DATA_SOURCE_DIR = "/home/runner/work/example-robot-data-loaders/example-robot-data-loaders/robots"
@@ -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()