5#include <Eigen/Geometry>
10namespace tinyrobotics {
18 template <
typename Scalar>
19 Eigen::Matrix<Scalar, 3, 3>
skew(
const Eigen::Matrix<Scalar, 3, 3>& input) {
20 return 0.5 * (input - input.transpose());
29 template <
typename Scalar>
30 Eigen::Matrix<Scalar, 3, 3>
skew(
const Eigen::Matrix<Scalar, 3, 1>& input) {
31 Eigen::Matrix<Scalar, 3, 3> out;
32 out << Scalar(0), -input(2), input(1), input(2), Scalar(0), -input(0), -input(1), input(0), Scalar(0);
42 template <
typename Scalar>
43 Eigen::Matrix<Scalar, 6, 6>
cross_spatial(
const Eigen::Matrix<Scalar, 6, 1>& v) {
44 Eigen::Matrix<Scalar, 6, 6> vcross;
45 vcross << 0, -v(2), v(1), 0, 0, 0, v(2), 0, -v(0), 0, 0, 0, -v(1), v(0), 0, 0, 0, 0, 0, -v(5), v(4), 0, -v(2),
46 v(1), v(5), 0, -v(3), v(2), 0, -v(0), -v(4), v(3), 0, -v(1), v(0), 0;
56 template <
typename Scalar>
57 Eigen::Matrix<Scalar, 6, 6>
cross_motion(
const Eigen::Matrix<Scalar, 6, 1>& v) {
66 template <
typename Scalar>
68 Eigen::Matrix<Scalar, 6, 6> X = Eigen::Matrix<Scalar, 6, 6>::Identity();
69 X.block(3, 0, 3, 3) = -
skew(xyz);
79 template <
typename Scalar>
80 Eigen::Matrix<Scalar, 6, 6>
rpy_to_spatial(
const Eigen::Matrix<Scalar, 3, 1>& rpy) {
81 Eigen::Matrix<Scalar, 3, 3> E = rx(rpy(0)) * ry(rpy(1)) * rz(rpy(2));
82 Eigen::Matrix<Scalar, 6, 6> X = Eigen::Matrix<Scalar, 6, 6>::Identity();
83 X.block(0, 0, 3, 3) = E;
84 X.block(3, 3, 3, 3) = E;
94 template <
typename Scalar>
96 Eigen::Matrix<Scalar, 6, 6> X = Eigen::Matrix<Scalar, 6, 6>::Zero();
97 X.block(0, 0, 3, 3) = H.rotation();
98 X.block(3, 3, 3, 3) = H.rotation();
99 X.block(3, 0, 3, 3) =
skew(Eigen::Matrix<Scalar, 3, 1>(H.translation())) * H.rotation();
111 template <
typename Scalar>
113 const Eigen::Matrix<Scalar, 3, 1>& c,
114 const Eigen::Matrix<Scalar, 3, 3>& I) {
115 Eigen::Matrix<Scalar, 6, 6> Ic = Eigen::Matrix<Scalar, 6, 6>::Zero();
116 Eigen::Matrix<Scalar, 3, 3> C =
skew(c);
117 Ic.block(0, 0, 3, 3) = I + m * C * C.transpose();
118 Ic.block(0, 3, 3, 3) = m * C;
119 Ic.block(3, 0, 3, 3) = m * C.transpose();
120 Ic.block(3, 3, 3, 3) = m * Eigen::Matrix<Scalar, 3, 3>::Identity();
131 template <
typename Scalar>
132 Eigen::Matrix<Scalar, 6, 1>
homogeneous_error(
const Eigen::Transform<Scalar, 3, Eigen::Isometry>& H1,
133 const Eigen::Transform<Scalar, 3, Eigen::Isometry>& H2) {
134 Eigen::Matrix<Scalar, 6, 1> e = Eigen::Matrix<Scalar, 6, 1>::Zero();
137 e.head(3) = H1.translation() - H2.translation();
140 Eigen::Matrix<Scalar, 3, 3> Re = H1.rotation() * H2.rotation().transpose();
141 Scalar t = Re.trace();
142 Eigen::Matrix<Scalar, 3, 1> eps(Re(2, 1) - Re(1, 2), Re(0, 2) - Re(2, 0), Re(1, 0) - Re(0, 1));
143 Scalar eps_norm = eps.norm();
144 if (t > -.99 || eps_norm > 1e-10) {
145 if (eps_norm < 1e-3) {
146 e.tail(3) = (0.75 - t / 12) * eps;
149 e.tail(3) = (atan2(eps_norm, t - 1) / eps_norm) * eps;
153 e.tail(3) = M_PI_2 * (Re.diagonal().array() + 1);
Eigen::Matrix< Scalar, 3, 3 > skew(const Eigen::Matrix< Scalar, 3, 3 > &input)
Computes the skew of a 3x3 vector.
Definition: math.hpp:19
Eigen::Matrix< Scalar, 6, 6 > translation_to_spatial(const Eigen::Matrix< Scalar, 3, 1 > &xyz)
Spatial coordinate transform from a xyz translation.
Definition: math.hpp:67
Eigen::Matrix< Scalar, 6, 6 > homogeneous_to_spatial(const Eigen::Transform< Scalar, 3, Eigen::Isometry > &H)
Spatial coordinate transform from homogeneous transformation matrix.
Definition: math.hpp:95
Eigen::Matrix< Scalar, 6, 6 > rpy_to_spatial(const Eigen::Matrix< Scalar, 3, 1 > &rpy)
Spatial coordinate transform from roll-pitch-yaw angles.
Definition: math.hpp:80
Eigen::Matrix< Scalar, 6, 6 > cross_motion(const Eigen::Matrix< Scalar, 6, 1 > &v)
Computes the 6x6 cross-product matrix for a motion vector and a force vector.
Definition: math.hpp:57
Eigen::Matrix< Scalar, 6, 6 > cross_spatial(const Eigen::Matrix< Scalar, 6, 1 > &v)
Computes the 6x6 cross-product matrix for a 6D spatial vector.
Definition: math.hpp:43
Eigen::Matrix< Scalar, 6, 6 > inertia_to_spatial(const Scalar m, const Eigen::Matrix< Scalar, 3, 1 > &c, const Eigen::Matrix< Scalar, 3, 3 > &I)
Spatial inertia matrix from inertia parameters.
Definition: math.hpp:112
Eigen::Matrix< Scalar, 6, 1 > homogeneous_error(const Eigen::Transform< Scalar, 3, Eigen::Isometry > &H1, const Eigen::Transform< Scalar, 3, Eigen::Isometry > &H2)
Computes the error between two homogeneous transformation matrices.
Definition: math.hpp:132