7 #include <Eigen/Eigenvalues>
8 #include <opencv2/core.hpp>
20 template <
typename Derived>
inline Eigen::Matrix3d
skewMatrix(
const Eigen::MatrixBase<Derived> &w) {
22 skew << 0, -w[2], w[1],
32 Eigen::Vector3d w(skew(2, 1), skew(0, 2), skew(1, 0));
43 double w_norm = w.norm();
46 return Eigen::Matrix3d::Identity();
47 return Eigen::Matrix3d::Identity() - ((1 - cos(w_norm)) / (w_norm * w_norm)) * w_skew +
48 ((w_norm - sin(w_norm)) / (w_norm * w_norm * w_norm)) * w_skew * w_skew;
59 double w_norm = w.norm();
60 Eigen::Vector3d a = w / w_norm;
61 Jl = sin(w_norm) / w_norm * Eigen::Matrix3d::Identity() + (1 - sin(w_norm) / w_norm) * a * a.transpose() +
71 float sy = sqrt(R(0, 0) * R(0, 0) + R(1, 0) * R(1, 0));
73 bool singular = sy < 1e-6;
77 x = atan2(R(2, 1), R(2, 2));
78 y = atan2(-R(2, 0), sy);
79 z = atan2(R(1, 0), R(0, 0));
81 x = atan2(-R(1, 2), R(1, 1));
82 y = atan2(-R(2, 0), sy);
85 return Eigen::Vector3d(x * 180 / 3.1416, y * 180 / 3.1416, z * 180 / 3.1416);
92 Eigen::Matrix3d xF2zF;
103 Eigen::Matrix3d zF2xF;
114 Eigen::Matrix3d xR2xF;
126 const Eigen::Vector3d &reference_vector = Eigen::Vector3d(1, 0, 0)) {
134 Eigen::Vector3d sum = v + reference_vector;
135 Eigen::Matrix3d R = 2.0 * (sum * sum.transpose()) / (sum.transpose() * sum) - Eigen::Matrix3d::Identity();
143 const Eigen::Vector3d &reference_vector = Eigen::Vector3d(1, 0, 0)) {
144 Eigen::Vector3d v = R * reference_vector;
145 return v.normalized();
154 inline Eigen::Matrix3d
exp_so3(
const Eigen::Vector3d &v) {
156 double tolerance = 1e-9;
157 double angle = v.norm();
160 if (angle < tolerance) {
164 Eigen::Vector3d axis = v / angle;
166 Rot = Eigen::Matrix3d::Identity() + (1. - cos(angle)) * skew * skew +
178 inline Eigen::Vector3d
log_so3(
const Eigen::Matrix3d &M) {
179 double tolerance = 1e-9;
180 double cos_angle = 0.5 * M.trace() - 0.5;
183 cos_angle = std::min(std::max(cos_angle, -1.), 1.);
184 double angle = acos(cos_angle);
188 if (std::fabs(sin(angle)) < tolerance || angle < tolerance)
205 Eigen::Vector3d w =
log_so3(RT.linear());
209 Eigen::Vector3d t = RT.translation();
224 Eigen::Vector3d w, t;
225 w << pose(0), pose(1), pose(2);
226 t << pose(3), pose(4), pose(5);
228 RT.translation() = t;
240 RT.linear() =
exp_so3(Eigen::Vector3d(pose[0], pose[1], pose[2]));
241 RT.translation() << pose[3], pose[4], pose[5];
251 RT.linear() = Eigen::Matrix3d::Identity();
252 RT.translation() << p3d[0], p3d[1], p3d[2];
263 Eigen::Transform<T, 3, 4> RT;
265 Eigen::Matrix<T, 3, 1> w, t;
267 w << pose[0], pose[1], pose[2];
268 t << pose[3], pose[4], pose[5];
270 RT.translation() = t;
277 inline double getAngle(Eigen::Vector3d p, Eigen::Vector3d p1, Eigen::Vector3d p2) {
278 Eigen::Vector3d u1 = p - p1;
279 Eigen::Vector3d u2 = p - p2;
281 return std::acos(u1.dot(u2) / (u1.norm() * u2.norm()));
289 template <
typename Derived = Eigen::VectorXd>
inline bool pointInTriangle(Derived pt, std::vector<Derived> triangle) {
291 Derived v0 = triangle.at(2) - triangle.at(0);
292 Derived v1 = triangle.at(1) - triangle.at(0);
293 Derived v2 = pt - triangle.at(0);
296 double dot00 = v0.dot(v0);
297 double dot01 = v0.dot(v1);
298 double dot02 = v0.dot(v2);
299 double dot11 = v1.dot(v1);
300 double dot12 = v1.dot(v2);
303 double inv_denom = 1 / (dot00 * dot11 - dot01 * dot01);
304 double u = (dot11 * dot02 - dot01 * dot12) * inv_denom;
305 double v = (dot00 * dot12 - dot01 * dot02) * inv_denom;
308 return (u >= 0) && (v >= 0) && (u + v < 1);
316 inline Eigen::Matrix2d
cov2dTriangle(std::vector<Eigen::Vector2d> triangle) {
319 Eigen::Vector2d x0 = triangle.at(0);
321 At << triangle.at(1).x() - x0.x(), triangle.at(2).x() - x0.x(), triangle.at(1).y() - x0.y(),
322 triangle.at(2).y() - x0.y();
323 Eigen::Vector2d barycenter = (1.0 / 3.0) * (x0 + triangle.at(1) + triangle.at(2));
327 Mot << 1.0 / 12, 1.0 / 24, 1.0 / 24, 1.0 / 12;
328 Eigen::Matrix2d M = 2 * At * Mot * At.transpose() +
329 (barycenter * x0.transpose() + x0 * barycenter.transpose() - x0 * x0.transpose()) -
330 barycenter * barycenter.transpose();
340 Eigen::Vector2d x0 = triangle.at(0);
342 At << triangle.at(1).x() - x0.x(), triangle.at(2).x() - x0.x(), triangle.at(1).y() - x0.y(),
343 triangle.at(2).y() - x0.y();
345 return At.determinant() / 2;
349 inline Eigen::MatrixXd
J_norm(Eigen::Vector3d X){
350 return X.transpose()/X.norm();
354 return (Eigen::Matrix3d::Identity() - X*X.transpose())/X.norm();
365 inline Eigen::Matrix3d
J_Rexpwt(Eigen::Matrix3d R, Eigen::Matrix3d expw, Eigen::Vector3d t){