27 #ifndef __se3_symmetric3_hpp__ 28 #define __se3_symmetric3_hpp__ 30 #include "pinocchio/macros.hpp" 35 template<
typename _Scalar,
int _Options>
39 typedef _Scalar Scalar;
40 enum { Options = _Options };
41 typedef Eigen::Matrix<Scalar,3,1,Options> Vector3;
42 typedef Eigen::Matrix<Scalar,6,1,Options> Vector6;
43 typedef Eigen::Matrix<Scalar,3,3,Options> Matrix3;
44 typedef Eigen::Matrix<Scalar,2,2,Options> Matrix2;
45 typedef Eigen::Matrix<Scalar,3,2,Options> Matrix32;
47 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
50 Symmetric3Tpl(): data_() {}
61 template<
typename Sc,
int N,
int Opt>
62 explicit Symmetric3Tpl(
const Eigen::Matrix<Sc,N,N,Opt> & I)
64 EIGEN_STATIC_ASSERT(N==3,THIS_METHOD_IS_ONLY_FOR_MATRICES_OF_A_SPECIFIC_SIZE)
65 assert( (I-I.transpose()).isMuchSmallerThan(I) );
67 data_(1) = I(1,0); data_(2) = I(1,1);
68 data_(3) = I(2,0); data_(4) = I(2,1); data_(5) = I(2,2);
71 explicit Symmetric3Tpl(const Vector6 & I) : data_(I) {}
73 Symmetric3Tpl(
const Scalar & a0,
const Scalar & a1,
const Scalar & a2,
74 const Scalar & a3,
const Scalar & a4,
const Scalar & a5)
75 { data_ << a0,a1,a2,a3,a4,a5; }
77 static Symmetric3Tpl Zero() {
return Symmetric3Tpl(Vector6::Zero()); }
78 void setZero() { data_.setZero(); }
80 static Symmetric3Tpl Random() {
return RandomPositive(); }
84 a = Scalar(std::rand())/RAND_MAX*2.0-1.0,
85 b = Scalar(std::rand())/RAND_MAX*2.0-1.0,
86 c = Scalar(std::rand())/RAND_MAX*2.0-1.0,
87 d = Scalar(std::rand())/RAND_MAX*2.0-1.0,
88 e = Scalar(std::rand())/RAND_MAX*2.0-1.0,
89 f = Scalar(std::rand())/RAND_MAX*2.0-1.0;
91 data_ << a, b, c, d, e, f;
94 static Symmetric3Tpl Identity() {
return Symmetric3Tpl(1, 0, 1, 0, 0, 1); }
95 void setIdentity() { data_ << 1, 0, 1, 0, 0, 1; }
98 bool operator== (
const Symmetric3Tpl & S2)
const {
return data_ == S2.data_; }
100 bool isApprox(
const Symmetric3Tpl & other,
101 const Scalar & prec = Eigen::NumTraits<Scalar>::dummy_precision())
const 102 {
return data_.isApprox(other.data_,prec); }
104 void fill(
const Scalar value) { data_.fill(value); }
112 const Scalar & x = v[0], & y = v[1], & z = v[2];
115 x*z , y*z , -x*x-y*y );
121 const Scalar & x = v.v[0], & y = v.v[1], & z = v.v[2];
123 data_[1]-x*y,data_[2]+x*x+z*z,
124 data_[3]-x*z,data_[4]-y*z,data_[5]+x*x+y*y);
129 const Scalar & x = v.v[0], & y = v.v[1], & z = v.v[2];
131 data_[1]-=x*y; data_[2]+=x*x+z*z;
132 data_[3]-=x*z; data_[4]-=y*z; data_[5]+=x*x+y*y;
137 friend Matrix3 operator- (
const Symmetric3Tpl & S,
const Eigen::MatrixBase <D> & M)
139 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(D,3,3);
140 Matrix3 result (S.matrix());
156 const Scalar & x = v[0], & y = v[1], & z = v[2];
159 m* x*z,m* y*z,-m*(x*x+y*y));
168 const Scalar & x = v.v[0], & y = v.v[1], & z = v.v[2];
170 data_[1]-v.m* x*y, data_[2]+v.m*(x*x+z*z),
171 data_[3]-v.m* x*z, data_[4]-v.m* y*z,
172 data_[5]+v.m*(x*x+y*y));
177 const Scalar & x = v.v[0], & y = v.v[1], & z = v.v[2];
178 data_[0]+=v.m*(y*y+z*z);
179 data_[1]-=v.m* x*y; data_[2]+=v.m*(x*x+z*z);
180 data_[3]-=v.m* x*z; data_[4]-=v.m* y*z; data_[5]+=v.m*(x*x+y*y);
184 const Vector6 & data ()
const {
return data_;}
185 Vector6 & data () {
return data_;}
199 a = Scalar(std::rand())/RAND_MAX*2.0-1.0,
200 b = Scalar(std::rand())/RAND_MAX*2.0-1.0,
201 c = Scalar(std::rand())/RAND_MAX*2.0-1.0,
202 d = Scalar(std::rand())/RAND_MAX*2.0-1.0,
203 e = Scalar(std::rand())/RAND_MAX*2.0-1.0,
204 f = Scalar(std::rand())/RAND_MAX*2.0-1.0;
206 a*b+b*c+d*e, b*b+c*c+e*e,
207 a*d+b*e+d*f, b*d+c*e+e*f, d*d+e*e+f*f );
210 Matrix3 matrix()
const 213 res(0,0) = data_(0); res(0,1) = data_(1); res(0,2) = data_(3);
214 res(1,0) = data_(1); res(1,1) = data_(2); res(1,2) = data_(4);
215 res(2,0) = data_(3); res(2,1) = data_(4); res(2,2) = data_(5);
218 operator Matrix3 ()
const {
return matrix(); }
220 Scalar vtiv (
const Vector3 & v)
const 222 const Scalar & x = v[0];
223 const Scalar & y = v[1];
224 const Scalar & z = v[2];
226 const Scalar xx = x*x;
227 const Scalar xy = x*y;
228 const Scalar xz = x*z;
229 const Scalar yy = y*y;
230 const Scalar yz = y*z;
231 const Scalar zz = z*z;
233 return data_(0)*xx + data_(2)*yy + data_(5)*zz + 2.*(data_(1)*xy + data_(3)*xz + data_(4)*yz);
246 template<
typename Vector3,
typename Matrix3>
247 static void vxs(
const Eigen::MatrixBase<Vector3> & v,
249 const Eigen::MatrixBase<Matrix3> & M)
251 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3,3);
252 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix3,3,3);
254 const Scalar & a = S3.data()[0];
255 const Scalar & b = S3.data()[1];
256 const Scalar & c = S3.data()[2];
257 const Scalar & d = S3.data()[3];
258 const Scalar & e = S3.data()[4];
259 const Scalar & f = S3.data()[5];
262 const typename Vector3::RealScalar & v0 = v[0];
263 const typename Vector3::RealScalar & v1 = v[1];
264 const typename Vector3::RealScalar & v2 = v[2];
266 Matrix3 & M_ =
const_cast<Eigen::MatrixBase<Matrix3> &
>(M).derived();
267 M_(0,0) = d * v1 - b * v2;
268 M_(1,0) = a * v2 - d * v0;
269 M_(2,0) = b * v0 - a * v1;
271 M_(0,1) = e * v1 - c * v2;
272 M_(1,1) = b * v2 - e * v0;
273 M_(2,1) = c * v0 - b * v1;
275 M_(0,2) = f * v1 - e * v2;
276 M_(1,2) = d * v2 - f * v0;
277 M_(2,2) = e * v0 - d * v1;
290 template<
typename Vector3>
291 Matrix3
vxs(
const Eigen::MatrixBase<Vector3> & v)
const 307 template<
typename Vector3,
typename Matrix3>
308 static void svx(
const Eigen::MatrixBase<Vector3> & v,
310 const Eigen::MatrixBase<Matrix3> & M)
312 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Vector3,3);
313 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(Matrix3,3,3);
315 const Scalar & a = S3.data()[0];
316 const Scalar & b = S3.data()[1];
317 const Scalar & c = S3.data()[2];
318 const Scalar & d = S3.data()[3];
319 const Scalar & e = S3.data()[4];
320 const Scalar & f = S3.data()[5];
322 const typename Vector3::RealScalar & v0 = v[0];
323 const typename Vector3::RealScalar & v1 = v[1];
324 const typename Vector3::RealScalar & v2 = v[2];
326 Matrix3 & M_ =
const_cast<Eigen::MatrixBase<Matrix3> &
>(M).derived();
327 M_(0,0) = b * v2 - d * v1;
328 M_(1,0) = c * v2 - e * v1;
329 M_(2,0) = e * v2 - f * v1;
331 M_(0,1) = d * v0 - a * v2;
332 M_(1,1) = e * v0 - b * v2;
333 M_(2,1) = f * v0 - d * v2;
335 M_(0,2) = a * v1 - b * v0;
336 M_(1,2) = b * v1 - c * v0;
337 M_(2,2) = d * v1 - e * v0;
348 template<
typename Vector3>
349 Matrix3
svx(
const Eigen::MatrixBase<Vector3> & v)
const 363 data_ += s2.data_;
return *
this;
366 template<
typename V3in,
typename V3out>
368 const Eigen::MatrixBase<V3in> & vin,
369 const Eigen::MatrixBase<V3out> & vout)
371 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(V3in,Vector3);
372 EIGEN_STATIC_ASSERT_SAME_VECTOR_SIZE(V3out,Vector3);
374 Eigen::MatrixBase<V3out> & vout_ =
const_cast<Eigen::MatrixBase<V3out>&
>(vout);
376 vout_[0] = S3.data_(0) * vin[0] + S3.data_(1) * vin[1] + S3.data_(3) * vin[2];
377 vout_[1] = S3.data_(1) * vin[0] + S3.data_(2) * vin[1] + S3.data_(4) * vin[2];
378 vout_[2] = S3.data_(3) * vin[0] + S3.data_(4) * vin[1] + S3.data_(5) * vin[2];
381 template<
typename V3>
382 Vector3 operator*(
const Eigen::MatrixBase<V3> & v)
const 385 rhsMult(*
this,v,res);
401 const Scalar& operator()(
const int &i,
const int &j)
const 403 return ((i!=2)&&(j!=2)) ? data_[i+j] : data_[i+j+1];
408 assert( (S-S.transpose()).isMuchSmallerThan(S) );
410 data_(1)-S(1,0), data_(2)-S(1,1),
411 data_(3)-S(2,0), data_(4)-S(2,1), data_(5)-S(2,2) );
416 assert( (S-S.transpose()).isMuchSmallerThan(S) );
418 data_(1)+S(1,0), data_(2)+S(1,1),
419 data_(3)+S(2,0), data_(4)+S(2,1), data_(5)+S(2,2) );
431 data_(0) - data_(5), data_(1),
432 data_(1), data_(2) - data_(5),
433 2*data_(3), data_(4) + data_(4);
441 EIGEN_STATIC_ASSERT_MATRIX_SPECIFIC_SIZE(D,3,3);
442 assert( (R.transpose()*R).isApprox(Matrix3::Identity()) );
450 const Matrix2 Y( R.template block<2,3>(1,0) * L );
453 Sres.data_(1) = Y(0,0)*R(0,0) + Y(0,1)*R(0,1);
454 Sres.data_(2) = Y(0,0)*R(1,0) + Y(0,1)*R(1,1);
455 Sres.data_(3) = Y(1,0)*R(0,0) + Y(1,1)*R(0,1);
456 Sres.data_(4) = Y(1,0)*R(1,0) + Y(1,1)*R(1,1);
457 Sres.data_(5) = Y(1,0)*R(2,0) + Y(1,1)*R(2,1);
460 const Vector3 r(-R(0,0)*data_(4) + R(0,1)*data_(3),
461 -R(1,0)*data_(4) + R(1,1)*data_(3),
462 -R(2,0)*data_(4) + R(2,1)*data_(3));
465 Sres.data_(0) = L(0,0) + L(1,1) - Sres.data_(2) - Sres.data_(5);
468 Sres.data_(0) += data_(5);
469 Sres.data_(1) += r(2); Sres.data_(2)+= data_(5);
470 Sres.data_(3) +=-r(1); Sres.data_(4)+= r(0); Sres.data_(5) += data_(5);
482 #endif // ifndef __se3_symmetric3_hpp__ static void svx(const Eigen::MatrixBase< Vector3 > &v, const Symmetric3Tpl &S3, const Eigen::MatrixBase< Matrix3 > &M)
Performs the operation .
Matrix3 vxs(const Eigen::MatrixBase< Vector3 > &v) const
Performs the operation . This operation is equivalent to applying the cross product of v on each colu...
Matrix32 decomposeltI() const
Computes L for a symmetric matrix A.
static void vxs(const Eigen::MatrixBase< Vector3 > &v, const Symmetric3Tpl &S3, const Eigen::MatrixBase< Matrix3 > &M)
Performs the operation . This operation is equivalent to applying the cross product of v on each colu...
Matrix3 svx(const Eigen::MatrixBase< Vector3 > &v) const
Performs the operation .