39 #ifndef INCLUDE_OKVIS_KINEMATICS_OPERATORS_HPP_
40 #define INCLUDE_OKVIS_KINEMATICS_OPERATORS_HPP_
45 #include <Eigen/Geometry>
51 namespace kinematics {
61 template<
typename Scalar_T>
62 inline Eigen::Matrix<Scalar_T, 3, 3>
crossMx(Scalar_T x, Scalar_T y, Scalar_T z)
64 Eigen::Matrix<Scalar_T, 3, 3> C;
81 template<
typename Derived_T>
82 inline Eigen::Matrix<typename Eigen::internal::traits<Derived_T>::Scalar, 3, 3>
crossMx(
83 Eigen::MatrixBase<Derived_T>
const & v)
85 EIGEN_STATIC_ASSERT_VECTOR_SPECIFIC_SIZE(Eigen::MatrixBase<Derived_T>, 3);
86 assert((v.cols()==3 && v.rows()==1)||(v.rows()==3 && v.cols()==1));
87 return crossMx(v(0, 0), v(1, 0), v(2, 0));
92 inline Eigen::Matrix4d
plus(
const Eigen::Quaterniond & q_AB) {
93 Eigen::Vector4d q = q_AB.coeffs();
95 Q(0,0) = q[3]; Q(0,1) = -q[2]; Q(0,2) = q[1]; Q(0,3) = q[0];
96 Q(1,0) = q[2]; Q(1,1) = q[3]; Q(1,2) = -q[0]; Q(1,3) = q[1];
97 Q(2,0) = -q[1]; Q(2,1) = q[0]; Q(2,2) = q[3]; Q(2,3) = q[2];
98 Q(3,0) = -q[0]; Q(3,1) = -q[1]; Q(3,2) = -q[2]; Q(3,3) = q[3];
104 inline Eigen::Matrix4d
oplus(
const Eigen::Quaterniond & q_BC) {
105 Eigen::Vector4d q = q_BC.coeffs();
107 Q(0,0) = q[3]; Q(0,1) = q[2]; Q(0,2) = -q[1]; Q(0,3) = q[0];
108 Q(1,0) = -q[2]; Q(1,1) = q[3]; Q(1,2) = q[0]; Q(1,3) = q[1];
109 Q(2,0) = q[1]; Q(2,1) = -q[0]; Q(2,2) = q[3]; Q(2,3) = q[2];
110 Q(3,0) = -q[0]; Q(3,1) = -q[1]; Q(3,2) = -q[2]; Q(3,3) = q[3];
Eigen::Matrix< Scalar_T, 3, 3 > crossMx(Scalar_T x, Scalar_T y, Scalar_T z)
Cross matrix of a vector [x,y,z]. Adopted from Schweizer-Messer by Paul Furgale.
Definition: operators.hpp:62
Eigen::Matrix4d oplus(const Eigen::Quaterniond &q_BC)
Oplus matrix of a quaternion, i.e. q_AB*q_BC = oplus(q_BC)*q_AB.coeffs().
Definition: operators.hpp:104
Eigen::Matrix4d plus(const Eigen::Quaterniond &q_AB)
Plus matrix of a quaternion, i.e. q_AB*q_BC = plus(q_AB)*q_BC.coeffs().
Definition: operators.hpp:92