tinyrobotics
Loading...
Searching...
No Matches
math.hpp
Go to the documentation of this file.
1#ifndef TR_MATH_HPP
2#define TR_MATH_HPP
3
4#include <Eigen/Core>
5#include <Eigen/Geometry>
6
10namespace tinyrobotics {
11
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());
21 }
22
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);
33 return out;
34 }
35
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;
47 return vcross;
48 }
49
56 template <typename Scalar>
57 Eigen::Matrix<Scalar, 6, 6> cross_motion(const Eigen::Matrix<Scalar, 6, 1>& v) {
58 return -cross_spatial(v).transpose();
59 }
60
66 template <typename Scalar>
67 Eigen::Matrix<Scalar, 6, 6> translation_to_spatial(const Eigen::Matrix<Scalar, 3, 1>& xyz) {
68 Eigen::Matrix<Scalar, 6, 6> X = Eigen::Matrix<Scalar, 6, 6>::Identity();
69 X.block(3, 0, 3, 3) = -skew(xyz);
70 return X;
71 }
72
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;
85 return X;
86 }
87
94 template <typename Scalar>
95 Eigen::Matrix<Scalar, 6, 6> homogeneous_to_spatial(const Eigen::Transform<Scalar, 3, Eigen::Isometry>& H) {
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();
100 return X;
101 }
102
111 template <typename Scalar>
112 Eigen::Matrix<Scalar, 6, 6> inertia_to_spatial(const Scalar m,
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();
121 return Ic;
122 }
123
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();
135
136 // Translational error
137 e.head(3) = H1.translation() - H2.translation();
138
139 // Orientation error
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;
147 }
148 else {
149 e.tail(3) = (atan2(eps_norm, t - 1) / eps_norm) * eps;
150 }
151 }
152 else {
153 e.tail(3) = M_PI_2 * (Re.diagonal().array() + 1);
154 }
155 return e;
156 }
157} // namespace tinyrobotics
158
159#endif
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