1 #ifndef DEF_COMMON_SO3_ALGEBRA 2 #define DEF_COMMON_SO3_ALGEBRA 7 #include <Eigen/Geometry> 22 template <
typename T_SCALAR_TYPE>
29 Eigen::Matrix<T_SCALAR_TYPE,3,1> m_v;
33 : m_v(Eigen::Matrix<T_SCALAR_TYPE,3,1>::Zero())
41 : m_v(Eigen::Matrix<T_SCALAR_TYPE,3,1>(a,b,c))
82 operator*= (T_SCALAR_TYPE s)
107 {
return this->m_v.cross(g.v()); }
110 Ad (
const Group<T_SCALAR_TYPE>& g)
const 114 Ad_star (
const Group<T_SCALAR_TYPE>& g)
const 125 Eigen::Matrix<T_SCALAR_TYPE,3,1>
126 operator* (
const Eigen::Matrix<T_SCALAR_TYPE,3,1>& vec)
const 127 {
return m_v.cross(vec); }
131 Eigen::Matrix<T_SCALAR_TYPE,3,1>
136 v (
const Eigen::AngleAxis<T_SCALAR_TYPE>& aa)
137 { m_v = aa.angle()*aa.axis(); }
140 v (
const Eigen::Matrix<T_SCALAR_TYPE,3,1>& vec)
144 operator[] (
size_t index)
const 145 {
return m_v[index]; }
148 operator[] (
size_t index)
149 {
return m_v[index]; }
166 {
return m_v.norm(); }
170 {
return m_v.norm(); }
172 Eigen::Matrix<T_SCALAR_TYPE,3,1>
174 {
return m_v.normalized(); }
184 T_SCALAR_TYPE a = m_v.norm()/2.0;
185 Eigen::Matrix<T_SCALAR_TYPE,4,1> V;
188 return Group<T_SCALAR_TYPE>(Eigen::AngleAxis<T_SCALAR_TYPE>(cos(a),sin(a)*m_v.normalized()));
191 Eigen::Matrix<T_SCALAR_TYPE,3,3>
192 partialExp (
const unsigned int i)
const 194 T_SCALAR_TYPE nm = this->norm();
195 Eigen::Matrix<T_SCALAR_TYPE,3,3> K = (this->normalized()).toRotationMatrix();
196 T_SCALAR_TYPE c = cos(nm), s = sin(nm);
199 Eigen::Matrix<T_SCALAR_TYPE,3,3> dexpdw;
201 if (isZero<T_SCALAR_TYPE>(nm))
204 dexpdw = (c-(s/nm))*((*this)[i]*(1.0/nm))*K + (s/nm)*M + (s+(1.0-c)*(2.0/nm))*((*this)[i]*(1.0/nm))*K*K + ((1-c)/nm)*(M*K+K*M);
215 for (
int i=0; i<order_p; i++) {
217 res += BERNOULLI_NUMBERS[i+1]*A;
231 T_SCALAR_TYPE n = m_v.norm(),
237 Eigen::Matrix<T_SCALAR_TYPE,3,3> W = this->toRotationMatrix();
238 Eigen::Matrix<T_SCALAR_TYPE,3,3> M =
239 Eigen::Matrix<T_SCALAR_TYPE,3,3>::Identity()
240 + (4.0/den)*(W+0.5*W*W);
241 return Group<T_SCALAR_TYPE>(M);
245 cay_inv (
const Group<T_SCALAR_TYPE>& g)
248 Eigen::Matrix<T_SCALAR_TYPE,3,3>
250 {
return Eigen::Matrix<T_SCALAR_TYPE,3,3>::Identity()-0.5*this->toRotationMatrix()+0.25*this->toVector()*(this->toVector().transpose()); }
259 Eigen::AngleAxis<T_SCALAR_TYPE>
261 {
return Eigen::AngleAxis<T_SCALAR_TYPE>(m_v.norm(),m_v.normalized()); }
263 Eigen::Matrix<T_SCALAR_TYPE,3,3>
264 toRotationMatrix ( )
const 266 Eigen::Matrix<T_SCALAR_TYPE,3,3> mat;
267 mat << T_SCALAR_TYPE(0), -m_v[2], m_v[1],
268 m_v[2], T_SCALAR_TYPE(0), -m_v[0],
269 -m_v[1], m_v[0], T_SCALAR_TYPE(0);
274 fromRotationMatrix (
const Eigen::Matrix<T_SCALAR_TYPE,3,3>& m)
279 Eigen::Matrix<T_SCALAR_TYPE,3,1>
284 toNOXVector ( )
const 299 static Eigen::Matrix<T_SCALAR_TYPE,3,3>
302 Eigen::Matrix<T_SCALAR_TYPE,3,3> res(Eigen::Matrix<T_SCALAR_TYPE,3,3>::Zero());
303 if (i == 0) { res(1,2) = T_SCALAR_TYPE(-1); res(2,1) = T_SCALAR_TYPE(1); }
304 else if (i == 1) { res(0,2) = T_SCALAR_TYPE(1); res(2,0) = T_SCALAR_TYPE(-1); }
305 else { res(0,1) = T_SCALAR_TYPE(-1); res(1,0) = T_SCALAR_TYPE(1); }
309 static Eigen::Matrix<T_SCALAR_TYPE,3,1>
310 GeneratorVector (
int const i)
312 Eigen::Matrix<T_SCALAR_TYPE,3,1> res(Eigen::Matrix<T_SCALAR_TYPE,3,1>::Zero());
313 res(i) = T_SCALAR_TYPE(1);
318 Generator (
int const i)
319 {
return Algebra(Algebra::GeneratorVector(i)); }
323 {
return Algebra(Eigen::Matrix<T_SCALAR_TYPE,3,1>::Zero()); }
328 template <
typename T_SCALAR_TYPE>
330 operator<< (std::ostream& stream, SO3::Algebra<T_SCALAR_TYPE>
const& g)
336 template <
typename T_SCALAR_TYPE>
static Eigen::Matrix< T_SCALAR_TYPE, 3, 3 > GeneratorMatrix(int const i)
Definition: SO3_Algebra.hpp:300
static Algebra< T_SCALAR_TYPE > Identity()
Definition: SO3_Algebra.hpp:70
Algebra< T_SCALAR_TYPE > inverse() const
Definition: SO3_Algebra.hpp:56
Group< T_SCALAR_TYPE > exp() const
Definition: SO3_Algebra.hpp:182
Eigen::Matrix< T_SCALAR_TYPE, 3, 3 > toRotationMatrix() const
Definition: SO3_Group.hpp:169
Definition: SO3_Group.hpp:17
Group< T_SCALAR_TYPE > cay() const
Definition: SO3_Algebra.hpp:229
Definition: SO3_Algebra.hpp:13
Eigen::AngleAxis< T_SCALAR_TYPE > toAngleAxis() const
Definition: SO3_Algebra.hpp:260
Algebra< T_SCALAR_TYPE > bracket(const Algebra< T_SCALAR_TYPE > &g) const
Definition: SO3_Algebra.hpp:106
Definition: SO3_Algebra.hpp:23
Definition: LieAlgebraBase.hpp:29
Eigen::Matrix< T_SCALAR_TYPE, 3, 1 > operator*(const Eigen::Matrix< T_SCALAR_TYPE, 3, 1 > &vec) const
Definition: SO3_Algebra.hpp:126
Definition: NOXVector.hpp:14