10 #include <aliceVision/numeric/numeric.hpp>
11 #include <boost/math/constants/constants.hpp>
12 #include <aliceVision/geometry/lie.hpp>
21 SE3::Matrix _homogeneous{SE3::Matrix::Identity()};
26 Pose3(
const Mat3& c_R_w,
const Vec3& w_c)
28 _homogeneous.setIdentity();
29 _homogeneous.block<3, 3>(0, 0) = c_R_w;
30 _homogeneous.block<3, 1>(0, 3) = -c_R_w * w_c;
38 Mat3 rotation()
const {
return _homogeneous.block<3, 3>(0, 0); }
40 void setRotation(
const Mat3& rotation) { _homogeneous.block<3, 3>(0, 0) = rotation; }
42 Vec3 translation()
const {
return _homogeneous.block<3, 1>(0, 3); }
44 void setTranslation(
const Vec3& translation) { _homogeneous.block<3, 1>(0, 3) = translation; }
46 Vec3 center()
const {
return -rotation().transpose() * translation(); }
48 void setCenter(
const Vec3& center) { _homogeneous.block<3, 1>(0, 3) = -rotation() * center; }
51 inline Mat3X operator()(
const Mat3X& p)
const {
return rotation() * (p.colwise() - center()); }
54 Pose3 operator*(
const Pose3& P)
const {
return Pose3(_homogeneous * P._homogeneous); }
57 bool operator==(
const Pose3& other)
const
59 return AreMatNearEqual(rotation(), other.rotation(), 1e-6) && AreVecNearEqual(center(), other.center(), 1e-6);
66 return Pose3(rotation().transpose(), translation());
70 double depth(
const Vec3& X)
const {
return (rotation() * (X - center()))[2]; }
76 pose.setRotation(rotation() * R.transpose());
77 pose.setCenter(S * R * center() + t);
82 const SE3::Matrix& getHomogeneous()
const {
return _homogeneous; }
91 inline Pose3 poseFromRT(
const Mat3& R,
const Vec3& t) {
return Pose3(R, -R.transpose() * t); }
93 inline Pose3 randomPose()
95 Vec3 vecR = Vec3::Random().normalized() * boost::math::constants::pi<double>();
97 return geometry::Pose3(SO3::expm(vecR), Vec3::Random());