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