14
14
# except ImportError: # pragma: no cover
15
15
# _symbolics = False
16
16
17
- import spatialmath .base as smbase
17
+ import spatialmath .base as smb
18
18
from spatialmath .base .types import *
19
19
from
10000
spatialmath .baseposelist import BasePoseList
20
20
@@ -369,9 +369,9 @@ def log(self, twist: Optional[bool] = False) -> Union[NDArray, List[NDArray]]:
369
369
:SymPy: not supported
370
370
"""
371
371
if self .N == 2 :
372
- log = [smbase .trlog2 (x , twist = twist ) for x in self .data ]
372
+ log = [smb .trlog2 (x , twist = twist ) for x in self .data ]
373
373
else :
374
- log = [smbase .trlog (x , twist = twist ) for x in self .data ]
374
+ log = [smb .trlog (x , twist = twist ) for x in self .data ]
375
375
if len (log ) == 1 :
376
376
return log [0 ]
377
377
else :
@@ -418,7 +418,7 @@ def interp(self, end: Optional[bool] = None, s: Union[int, float] = None) -> Sel
418
418
if isinstance (s , int ) and s > 1 :
419
419
s = np .linspace (0 , 1 , s )
420
420
else :
421
- s = smbase .getvector (s )
421
+ s = smb .getvector (s )
422
422
s = np .clip (s , 0 , 1 )
423
423
424
424
if len (self ) > 1 :
@@ -432,13 +432,13 @@ def interp(self, end: Optional[bool] = None, s: Union[int, float] = None) -> Sel
432
432
if self .N == 2 :
433
433
# SO(2) or SE(2)
434
434
return self .__class__ (
435
- [smbase .trinterp2 (start = self .A , end = end , s = _s ) for _s in s ]
435
+ [smb .trinterp2 (start = self .A , end = end , s = _s ) for _s in s ]
436
436
)
437
437
438
438
elif self .N == 3 :
439
439
# SO(3) or SE(3)
440
440
return self .__class__ (
441
- [smbase .trinterp (start = self .A , end = end , s = _s ) for _s in s ]
441
+ [smb .trinterp (start = self .A , end = end , s = _s ) for _s in s ]
442
442
)
443
443
444
444
def interp1 (self , s : float = None ) -> Self :
@@ -488,32 +488,30 @@ def interp1(self, s: float = None) -> Self:
488
488
489
489
#. For SO3 and SE3 rotation is interpolated using quaternion spherical linear interpolation (slerp).
490
490
491
- :seealso: :func:`interp`, :func:`~spatialmath.base.transforms3d.trinterp`, :func:`~spatialmath.base.quaternions.qslerp`, :func:`~spatialmath.smbase .transforms2d.trinterp2`
491
+ :seealso: :func:`interp`, :func:`~spatialmath.base.transforms3d.trinterp`, :func:`~spatialmath.base.quaternions.qslerp`, :func:`~spatialmath.smb .transforms2d.trinterp2`
492
492
493
493
:SymPy: not supported
494
494
"""
495
- s = smbase .getvector (s )
495
+ s = smb .getvector (s )
496
496
s = np .clip (s , 0 , 1 )
497
497
498
498
if self .N == 2 :
499
499
# SO(2) or SE(2)
500
500
if len (s ) > 1 :
501
501
assert len (self ) == 1 , "if len(s) > 1, len(X) must == 1"
502
- return self .__class__ (
503
- [smbase .trinterp2 (start , self .A , s = _s ) for _s in s ]
504
- )
502
+ return self .__class__ ([smb .trinterp2 (start , self .A , s = _s ) for _s in s ])
505
503
else :
506
504
return self .__class__ (
507
- [smbase .trinterp2 (start , x , s = s [0 ]) for x in self .data ]
505
+ [smb .trinterp2 (start , x , s = s [0 ]) for x in self .data ]
508
506
)
509
507
elif self .N == 3 :
510
508
# SO(3) or SE(3)
511
509
if len (s ) > 1 :
512
510
assert len (self ) == 1 , "if len(s) > 1, len(X) must == 1"
513
- return self .__class__ ([smbase .trinterp (None , self .A , s = _s ) for _s in s ])
511
+ return self .__class__ ([smb .trinterp (None , self .A , s = _s ) for _s in s ])
514
512
else :
515
513
return self .__class__ (
516
- [smbase .trinterp (None , x , s = s [0 ]) for x in self .data ]
514
+ [smb .trinterp (None , x , s = s [0 ]) for x in self .data ]
517
515
)
518
516
519
517
def norm (self ) -> Self :
@@ -546,9 +544,9 @@ def norm(self) -> Self:
546
544
:seealso: :func:`~spatialmath.base.transforms3d.trnorm`, :func:`~spatialmath.base.transforms2d.trnorm2`
547
545
"""
548
546
if self .N == 2 :
549
- return self .__class__ ([smbase .trnorm2 (x ) for x in self .data ])
547
+ return self .__class__ ([smb .trnorm2 (x ) for x in self .data ])
550
548
else :
551
- return self .__class__ ([smbase .trnorm (x ) for x in self .data ])
549
+ return self .__class__ ([smb .trnorm (x ) for x in self .data ])
552
550
553
551
def simplify (self ) -> Self :
554
552
"""
@@ -580,7 +578,7 @@ def simplify(self) -> Self:
580
578
:SymPy: supported
581
579
"""
582
580
583
- vf = np .vectorize (smbase .sym .simplify )
581
+ vf = np .vectorize (smb .sym .simplify )
584
582
return self .__class__ ([vf (x ) for x in self .data ], check = False )
585
583
586
584
def stack (self ) -> NDArray :
@@ -682,10 +680,10 @@ def printline(self, *args, **kwargs) -> None:
682
680
"""
683
681
if self .N == 2 :
684
682
for x in self .data :
685
- smbase .trprint2 (x , * args , ** kwargs )
683
+ smb .trprint2 (x , * args , ** kwargs )
686
684
else :
687
685
for x in self .data :
688
- smbase .trprint (x , * args , ** kwargs )
686
+ smb .trprint (x , * args , ** kwargs )
689
687
690
688
def strline (self , * args , ** kwargs ) -> str :
691
689
"""
@@ -744,10 +742,10 @@ def strline(self, *args, **kwargs) -> str:
744
742
s = ""
745
743
if self .N == 2 :
746
744
for x in self .data :
747
- s += smbase .trprint2 (x , * args , file = False , ** kwargs )
745
+ s += smb .trprint2 (x , * args , file = False , ** kwargs )
748
746
else :
749
747
for x in self .data :
750
- s += smbase .trprint (x , * args , file = False , ** kwargs )
748
+ s += smb .trprint (x , * args , file = False , ** kwargs )
751
749
return s
752
750
753
751
def __repr__ (self ) -> str :
@@ -773,7 +771,7 @@ def trim(x):
773
771
if x .dtype == "O" :
774
772
return x
775
773
else :
776
- return smbase .removesmall (x )
774
+ return smb .removesmall (x )
777
775
778
776
name = type (self ).__name__
779
777
if len (self ) == 0 :
@@ -901,7 +899,7 @@ def mformat(self, X):
901
899
rowstr = " "
902
900
# format the columns
903
901
for colnum , element in enumerate (row ):
904
- if smbase .sym .issymbol (element ):
902
+ if smb .sym .issymbol (element ):
905
903
s = "{:<12s}" .format (str (element ))
906
904
else :
907
905
if (
@@ -971,9 +969,9 @@ def plot(self, *args, **kwargs) -> None:
971
969
:seealso: :func:`~spatialmath.base.transforms3d.trplot`, :func:`~spatialmath.base.transforms2d.trplot2`
972
970
"""
973
971
if self .N == 2 :
974
- smbase .trplot2 (self .A , * args , ** kwargs )
972
+ smb .trplot2 (self .A , * args , ** kwargs )
975
973
else :
976
- smbase .trplot (self .A , * args , ** kwargs )
974
+ smb .trplot (self .A , * args , ** kwargs )
977
975
978
976
def animate (self , * args , start = None , ** kwargs ) -> None :
979
977
"""
@@ -1004,15 +1002,15 @@ def animate(self, *args, start=None, **kwargs) -> None:
1004
1002
if len (self ) > 1 :
1005
1003
# trajectory case
1006
1004
if self .N == 2 :
1007
- smbase .tranimate2 (self .data , * args , ** kwargs )
1005
+ smb .tranimate2 (self .data , * args , ** kwargs )
1008
1006
else :
1009
- smbase .tranimate (self .data , * args , ** kwargs )
1007
+ smb .tranimate (self .data , * args , ** kwargs )
1010
1008
else :
1011
1009
# singleton case
1012
1010
if self .N == 2 :
1013
- smbase .tranimate2 (self .A , start = start , * args , ** kwargs )
1011
+ smb .tranimate2 (self .A , start = start , * args , ** kwargs )
1014
1012
else :
1015
- smbase .tranimate (self .A , start = start , * args , ** kwargs )
1013
+ smb .tranimate (self .A , start = start , * args , ** kwargs )
1016
1014
1017
1015
# ------------------------------------------------------------------------ #
1018
1016
def prod (self ) -> Self :
@@ -1157,13 +1155,13 @@ def __mul__(left, right): # pylint: disable=no-self-argument
1157
1155
elif isinstance (right , (list , tuple , np .ndarray )):
1158
1156
# print('*: pose x array')
1159
1157
if len (left ) == 1 :
1160
- if smbase .isvector (right , left .N ):
1158
+ if smb .isvector (right , left .N ):
1161
1159
# pose x vector
1162
1160
# print('*: pose x vector')
1163
- v = smbase .getvector (right , out = "col" )
1161
+ v = smb .getvector (right , out = "col" )
1164
1162
if left .isSE :
1165
1163
# SE(n) x vector
1166
- return smbase .h2e (left .A @ smbase .e2h (v ))
1164
+ return smb .h2e (left .A @ smb .e2h (v ))
1167
1165
else :
1168
1166
# SO(n) x vector
1169
1167
return left .A @ v
@@ -1173,19 +1171,19 @@ def __mul__(left, right): # pylint: disable=no-self-argument
1173
1171
else :
1174
1172
if left .isSE :
1175
1173
# SE(n) x [set of vectors]
1176
- return smbase .h2e (left .A @ smbase .e2h (right ))
1174
+ return smb .h2e (left .A @ smb .e2h (right ))
1177
1175
else :
1178
1176
# SO(n) x [set of vectors]
1179
1177
return left .A @ right
1180
1178
1181
- elif len (left ) > 1 and smbase .isvector (right , left .N ):
1179
+ elif len (left ) > 1 and smb .isvector (right , left .N ):
1182
1180
# pose array x vector
1183
1181
# print('*: pose array x vector')
1184
- v = smbase .getvector (right )
1182
+ v = smb .getvector (right )
1185
1183
if left .isSE :
1186
1184
# SE(n) x vector
1187
- v = smbase .e2h (v )
1188
- return np .array ([smbase .h2e (x @ v ).flatten () for x in left .A ]).T
1185
+ v = smb .e2h (v )
1186
+ return np .array ([smb .h2e (x @ v ).flatten () for x in left .A ]).T
10000
td>1189
1187
else :
1190
1188
# SO(n) x vector
1191
1189
return np .array ([(x @ v ).flatten () for x in left .A ]).T
@@ -1205,7 +1203,7 @@ def __mul__(left, right): # pylint: disable=no-self-argument
1205
1203
and right .shape [0 ] == left .N
1206
1204
):
1207
1205
# SE(n) x matrix
1208
- return smbase .h2e (left .A @ smbase .e2h (right ))
1206
+ return smb .h2e (left .A @ smb .e2h (right ))
1209
1207
elif (
1210
1208
isinstance (right , np .ndarray )
1211
1209
and left .isSO
@@ -1222,11 +1220,11 @@ def __mul__(left, right): # pylint: disable=no-self-argument
1222
1220
):
1223
1221
# SE(n) x matrix
1224
1222
return np .c_ [
1225
- [smbase .h2e (x .A @ smbase .e2h (y )) for x , y in zip (right , left .T )]
1223
+ [smb .h2e (x .A @ smb .e2h (y )) for x , y in zip (right , left .T )]
1226
1224
].T
1227
1225
else :
1228
1226
raise ValueError ("bad operands" )
1229
- elif smbase .isscalar (right ):
1227
+ elif smb .isscalar (right ):
1230
1228
return left ._op2 (right , lambda x , y : x * y )
1231
1229
else :
1232
1230
return NotImplemented
@@ -1252,7 +1250,7 @@ def __matmul__(left, right): # pylint: disable=no-self-argument
1252
1250
if isinstance (left , right .__class__ ):
1253
1251
# print('*: pose x pose')
1254
1252
return left .__class__ (
1255
- left ._op2 (right , lambda x , y : smbase .trnorm (x @ y )), check = False
1253
+ left ._op2 (right , lambda x , y : smb .trnorm (x @ y )), check = False
1256
1254
)
1257
1255
else :
1258
1256
raise TypeError ("@ only applies to pose composition" )
@@ -1346,7 +1344,7 @@ def __truediv__(left, right): # pylint: disable=no-self-argument
1346
1344
return left .__class__ (
1347
1345
left ._op2 (right .inv (), lambda x , y : x @ y ), check = False
1348
1346
)
1349
- elif smbase .isscalar (right ):
1347
+ elif smb .isscalar (right ):
1350
1348
return left ._op2 (right , lambda x , y : x / y )
1351
1349
else :
1352
1350
raise ValueError ("bad operands" )
@@ -1637,7 +1635,7 @@ def _op2(left, right: Self, op: Callable): # pylint: disable=no-self-argument
1637
1635
return [op (x , y ) for (x , y ) in zip (left .A , right .A )]
1638
1636
else :
1639
1637
raise ValueError ("length of lists to == must be same length" )
1640
- elif smbase .isscalar (right ) or (
1638
+ elif smb .isscalar (right ) or (
1641
1639
isinstance (right , np .ndarray ) and right .shape == left .shape
1642
1640
):
1643
1641
# class by matrix
0 commit comments