27 #ifndef G2O_PLANE3D_H_ 28 #define G2O_PLANE3D_H_ 33 #include <Eigen/Geometry> 57 inline const Eigen::Vector4d&
coeffs()
const {
return _coeffs;}
64 static double azimuth(
const Eigen::Vector3d& v) {
65 return atan2(v(1),v(0));
69 return atan2(v(2), v.head<2>().norm());
77 return _coeffs.head<3>();
81 static Eigen::Matrix3d
rotation(
const Eigen::Vector3d& v) {
82 double _azimuth = azimuth(v);
83 double _elevation = elevation(v);
84 return (Eigen::AngleAxisd(_azimuth, Eigen::Vector3d::UnitZ())*Eigen::AngleAxisd(- _elevation, Eigen::Vector3d::UnitY())).toRotationMatrix();
87 inline void oplus(
const Eigen::Vector3d& v){
90 double _elevation=v[1];
91 double s=sin(_elevation), c=cos(_elevation);
92 Eigen::Vector3d n (c*cos(_azimuth), c*sin(_azimuth), s) ;
95 Eigen::Matrix3d R=rotation(normal());
96 double d=distance()+v[2];
97 _coeffs.head<3>() = R*n;
104 Eigen::Matrix3d R=rotation(normal()).transpose();
105 Eigen::Vector3d n=R*plane.
normal();
106 double d=distance()-plane.
distance();
107 return Eigen::Vector3d(azimuth(n), elevation(n), d);
113 double n=coeffs.head<3>().norm();
114 coeffs = coeffs * (1./n);
121 Eigen::Vector4d v=plane.
_coeffs;
123 Eigen::Matrix3d R=t.rotation();
124 v2.head<3>() = R*v.head<3>();
125 v2(3)=v(3) - t.translation().dot(v2.head<3>());
void oplus(const Eigen::Vector3d &v)
some general case utility functions
static double elevation(const Eigen::Vector3d &v)
static void normalize(Eigen::Vector4d &coeffs)
Eigen::Vector3d ominus(const Plane3D &plane)
const Eigen::Vector4d & coeffs() const
static double azimuth(const Eigen::Vector3d &v)
Plane3D(const Eigen::Vector4d &v)
Line2D operator*(const SE2 &t, const Line2D &l)
Eigen::Quaterniond & normalize(Eigen::Quaterniond &q)
void fromVector(const Eigen::Vector4d &coeffs_)
Eigen::Vector3d normal() const
EIGEN_MAKE_ALIGNED_OPERATOR_NEW
#define G2O_TYPES_SLAM3D_ADDONS_API
static Eigen::Matrix3d rotation(const Eigen::Vector3d &v)
Eigen::Vector4d toVector() const