1 from . import np, MatrixLieAlgebra, so, contract
2 from .. import extract_pieces, combine_pieces, hat_map_2d, hat_map
6 ''' This is the Lie algebra se(n) for the Special Euclidean group SE(n).
7
8 Note that you have to supply a coefficient *alpha* that
9 weights rotation and translation when defining distances.
10 '''
11
13 dimension = {2: 3, 3: 6}[N]
14 MatrixLieAlgebra.__init__(self, n=N + 1, dimension=dimension)
15 self.alpha = alpha
16 self.son = so[N]
17
21
26
28
29 return 'se%s' % (self.n - 1)
30
31 @contract(a='belongs')
33 W, v, zero, zero = extract_pieces(a)
34
35 if self.n == 3:
36 assert v.size == 2
37 V = np.zeros(3)
38 V[0] = self.son.vector_from_algebra(W)
39 V[1:3] = v
40 return V
41 elif self.n == 4:
42 assert v.size == 3
43 V = np.zeros(6)
44 V[0:3] = self.son.vector_from_algebra(W)
45 V[3:6] = v
46 return V
47 else:
48 assert False, 'Not implemented for n>=4.'
49
50 @contract(v='array[N]', returns='belongs')
52 if self.n == 3:
53 assert v.size == 3
54 omega = v[0]
55 vel = v[1:3]
56 W = hat_map_2d(omega)
57 return combine_pieces(W, vel, vel * 0, 0)
58
59 elif self.n == 4:
60 assert v.size == 6
61 omega = v[0:3]
62 vel = v[3:6]
63 W = hat_map(omega)
64 return combine_pieces(W, vel, vel * 0, 0)
65 else:
66 assert False, 'Not implemented for n=%d.' % self.n
67
82