@@ -481,15 +481,7 @@ def aba(
481
481
joint_accelerations (T): The joints acceleration
482
482
"""
483
483
model = self .model .reduce (self .model .actuated_joints )
484
-
485
- joints = list (
486
- filter (
487
- lambda joint : joint .name in self .model .actuated_joints ,
488
- self .model .joints .values (),
489
- )
490
- )
491
-
492
- joints .sort (key = lambda joint : joint .idx )
484
+ joints = list (model .joints .values ())
493
485
494
486
NB = model .N
495
487
@@ -506,10 +498,8 @@ def aba(
506
498
sdd = self .math .factory .zeros (NB , 1 , 1 )
507
499
B_X_W = self .math .adjoint_mixed (base_transform )
508
500
509
- if self .model .floating_base :
510
- IA [0 ] = self .model .tree .get_node_from_name (
511
- self .root_link
512
- ).link .spatial_inertia ()
501
+ if model .floating_base :
502
+ IA [0 ] = model .tree .get_node_from_name (self .root_link ).link .spatial_inertia ()
513
503
v [0 ] = B_X_W @ base_velocity
514
504
pA [0 ] = (
515
505
self .math .spatial_skew_star (v [0 ]) @ IA [0 ] @ v [0 ]
@@ -522,7 +512,7 @@ def get_tree_transform(self, joints) -> "Array":
522
512
Array: the tree transform
523
513
"""
524
514
relative_transform = lambda j : self .math .inv (
525
- self . model .tree .graph [j .parent ].parent_arc .spatial_transform (0 )
515
+ model .tree .graph [j .child ].parent_arc .spatial_transform (0 )
526
516
) @ j .spatial_transform (0 )
527
517
528
518
return self .math .vertcat (
@@ -538,19 +528,7 @@ def get_tree_transform(self, joints) -> "Array":
538
528
)
539
529
540
530
tree_transform = get_tree_transform (self , joints )
541
-
542
- find_parent = (
543
- lambda j : find_parent (model .tree .get_node_from_name (j .parent ).parent_arc )
544
- if model .tree .get_node_from_name (j .parent ).parent_arc .idx is None
545
- else model .tree .get_node_from_name (j .parent ).parent_arc .idx
546
- )
547
-
548
- p = [- 1 ] + [
549
- model .tree .get_idx_from_name (i .parent )
550
- if model .tree .get_idx_from_name (i .parent ) < NB
551
- else find_parent (i )
552
- for i in joints
553
- ]
531
+ p = lambda i : list (model .tree .graph ).index (joints [i ].parent )
554
532
555
533
# Pass 1
556
534
for i , joint in enumerate (joints [1 :], start = 1 ):
@@ -561,8 +539,8 @@ def get_tree_transform(self, joints) -> "Array":
561
539
i_X_pi [i ] = joint .spatial_transform (q ) @ tree_transform [i ]
562
540
v_J = joint .motion_subspace () * q_dot
563
541
564
- v [i ] = i_X_pi [i ] @ v [p [ i ] ] + v_J
565
- c [i ] = i_X_pi [i ] @ c [p [ i ] ] + self .math .spatial_skew (v [i ]) @ v_J
542
+ v [i ] = i_X_pi [i ] @ v [p ( i ) ] + v_J
543
+ c [i ] = i_X_pi [i ] @ c [p ( i ) ] + self .math .spatial_skew (v [i ]) @ v_J
566
544
567
545
IA [i ] = model .tree .get_node_from_name (joint .parent ).link .spatial_inertia ()
568
546
@@ -579,17 +557,21 @@ def get_tree_transform(self, joints) -> "Array":
579
557
):
580
558
U [i ] = IA [i ] @ joint .motion_subspace ()
581
559
D [i ] = joint .motion_subspace ().T @ U [i ]
582
- u [i ] = self .math .vertcat (tau [joint .idx ]) - joint .motion_subspace ().T @ pA [i ]
560
+ u [i ] = (
561
+ self .math .vertcat (tau [joint .idx ]) - joint .motion_subspace ().T @ pA [i ]
562
+ if joint .idx is not None
563
+ else 0.0
564
+ )
583
565
584
566
Ia = IA [i ] - U [i ] / D [i ] @ U [i ].T
585
567
pa = pA [i ] + Ia @ c [i ] + U [i ] * u [i ] / D [i ]
586
568
587
- if joint .parent != self .root_link or not self . model .floating_base :
588
- IA [p [ i ] ] += i_X_pi [i ].T @ Ia @ i_X_pi [i ]
589
- pA [p [ i ] ] += i_X_pi [i ].T @ pa
569
+ if joint .parent != self .root_link or not model .floating_base :
570
+ IA [p ( i ) ] += i_X_pi [i ].T @ Ia @ i_X_pi [i ]
571
+ pA [p ( i ) ] += i_X_pi [i ].T @ pa
590
572
continue
591
573
592
- a [0 ] = B_X_W @ g if self . model .floating_base else self .math .solve (- IA [0 ], pA [0 ])
574
+ a [0 ] = B_X_W @ g if model .floating_base else self .math .solve (- IA [0 ], pA [0 ])
593
575
594
576
# Pass 3
595
577
for i , joint in enumerate (joints [1 :], start = 1 ):
@@ -598,7 +580,7 @@ def get_tree_transform(self, joints) -> "Array":
598
580
599
581
sdd [i - 1 ] = (u [i ] - U [i ].T @ a [i ]) / D [i ]
600
582
601
- a [i ] += i_X_pi [i ].T @ a [p [ i ] ] + joint .motion_subspace () * sdd [i - 1 ] + c [i ]
583
+ a [i ] += i_X_pi [i ].T @ a [p ( i ) ] + joint .motion_subspace () * sdd [i - 1 ] + c [i ]
602
584
603
585
# Squeeze sdd
604
586
s_ddot = self .math .vertcat (* [sdd [i ] for i in range (sdd .shape [0 ])])
@@ -613,7 +595,7 @@ def get_tree_transform(self, joints) -> "Array":
613
595
return self .math .horzcat (
614
596
self .math .vertcat (
615
597
self .math .solve (B_X_W , a [0 ]) + g
616
- if self . model .floating_base
598
+ if model .floating_base
617
599
else self .math .zeros (6 , 1 ),
618
600
),
619
601
s_ddot ,
0 commit comments