oh_my_loam/common/geometry/pose.h

67 lines
1.6 KiB
C
Raw Normal View History

2020-10-28 02:09:59 +08:00
#pragma once
#include <eigen3/Eigen/Dense>
2021-01-04 21:26:09 +08:00
namespace common {
2020-10-28 02:09:59 +08:00
class Pose3D {
2020-10-28 02:09:59 +08:00
public:
Pose3D() {
2020-10-28 02:09:59 +08:00
q_.setIdentity();
p_.setZero();
};
Pose3D(const Eigen::Quaterniond& q, const Eigen::Vector3d& p)
2020-10-28 02:09:59 +08:00
: q_(q), p_(p) {}
Pose3D(const Eigen::Matrix3d& r_mat, const Eigen::Vector3d& p)
2020-10-29 20:32:19 +08:00
: q_(r_mat), p_(p) {}
Pose3D(const double* const q, const double* const p) : q_(q), p_(p) {}
2020-10-28 02:09:59 +08:00
Pose3D Inv() const {
2020-11-02 17:16:42 +08:00
Eigen::Quaterniond q_inv = q_.inverse();
Eigen::Vector3d p_inv = q_inv * p_;
return {q_inv, -p_inv};
2020-10-28 02:09:59 +08:00
}
Eigen::Vector3d Transform(const Eigen::Vector3d& vec) const {
return q_ * vec + p_;
}
2020-10-29 20:32:19 +08:00
Eigen::Vector3d operator*(const Eigen::Vector3d& vec) const {
return Transform(vec);
}
2020-10-28 02:09:59 +08:00
Eigen::Vector3d Translate(const Eigen::Vector3d& vec) const {
return vec + p_;
}
Eigen::Vector3d Rotate(const Eigen::Vector3d& vec) const { return q_ * vec; }
// Spherical linear interpolation to `pose_to`, `t` belongs [0, 1]
Pose3D Interpolate(const Pose3D& pose_to, double t) const {
2020-11-02 17:16:42 +08:00
Eigen::Quaterniond q_interp = q_.slerp(t, pose_to.q_);
Eigen::Vector3d p_interp = (pose_to.p_ - p_) * t + p_;
2020-10-28 02:09:59 +08:00
return {q_interp, p_interp};
}
2020-10-29 20:32:19 +08:00
std::string ToString() const;
Eigen::Quaterniond q() const { return q_; }
2021-01-04 21:26:09 +08:00
2020-10-29 20:32:19 +08:00
Eigen::Vector3d p() const { return p_; }
2020-10-28 02:09:59 +08:00
protected:
Eigen::Quaterniond q_; // orientation
Eigen::Vector3d p_; // position
};
Pose3D Interpolate(const Pose3D& pose_from, const Pose3D& pose_to, double t);
2020-10-28 02:09:59 +08:00
Pose3D operator*(const Pose3D& lhs, const Pose3D& rhs);
2020-10-29 20:32:19 +08:00
using Trans3d = Pose3D;
2020-10-29 20:32:19 +08:00
2021-01-04 21:26:09 +08:00
} // namespace common