PoseManifoldGaussian.cpp
Go to the documentation of this file.
1 #include "PoseManifoldGaussian.h"
2 
3 #include <SimoxUtility/math/pose/invert.h>
4 #include <SimoxUtility/math/pose/pose.h>
5 
6 namespace armarx::objpose
7 {
8 
11  {
12  const float minSize = 0.005;
13 
14  const Eigen::Matrix3f covarianceTranslation = this->covariance.block<3, 3>(0, 0);
15 
16  const Eigen::EigenSolver<Eigen::Matrix3f> eigen(covarianceTranslation);
17  const Eigen::Vector3f eval = eigen.eigenvalues().real();
18  const Eigen::Matrix3f evec = eigen.eigenvectors().real();
19 
20  Ellipsoid result;
21  result.center = simox::math::position(this->mean);
22 
23  /* Eigen values are local x, y, and z of ellipsoid:
24  * ( )
25  * ( x y z ) = u
26  * ( )
27  *
28  * Eigen vectors are sorted by the singular values:
29  * ( e_x )
30  * ( e_y ) = ev, (e_x >= e_y >= e_z)
31  * ( e_z )
32  */
33  result.orientation = evec.determinant() > 0 ? evec : -evec;
34 
35  result.size = eval;
36 
37  // Handle very small values.
38  result.size = result.size.cwiseMax(Eigen::Vector3f::Constant(minSize));
39 
40  return result;
41  }
42 
43  Eigen::AngleAxisf
45  {
46  Eigen::Vector3f axis = covariance.block<3, 1>(3, 3 + index);
47  const float angle = axis.norm();
48  axis /= angle;
49  if (global)
50  {
51  axis = simox::math::orientation(mean) * axis;
52  }
53  return {angle, axis};
54  }
55 
58  {
60  covRotation.block<3, 3>(0, 0) = covRotation.block<3, 3>(3, 3) =
61  simox::math::orientation(transform);
62 
63  PoseManifoldGaussian transformed = *this;
64  transformed.mean = transform * transformed.mean;
65  // We just need to apply the orientation.
66  transformed.covariance = covRotation * transformed.covariance * covRotation.transpose();
67  return transformed;
68  }
69 
72  const Eigen::Matrix4f& toFrame) const
73  {
74  // T_to = T_(from->to) * T_from
75  // T_(from->to) = T_to * (T_from)^-1
76  Eigen::Matrix4f transform = toFrame * simox::math::inverted_pose(fromFrame);
77  return getTransformed(transform);
78  }
79 
80 } // namespace armarx::objpose
armarx::objpose::PoseManifoldGaussian::Ellipsoid::orientation
Eigen::Matrix3f orientation
Definition: PoseManifoldGaussian.h:63
armarx::navigation::components::laser_scanner_feature_extraction::Ellipsoid
memory::Ellipsoid Ellipsoid
Definition: EnclosingEllipsoid.h:44
index
uint8_t index
Definition: EtherCATFrame.h:59
armarx::objpose::PoseManifoldGaussian::mean
Eigen::Matrix4f mean
The mean (i.e. a pose).
Definition: PoseManifoldGaussian.h:28
GfxTL::Matrix4f
MatrixXX< 4, 4, float > Matrix4f
Definition: MatrixXX.h:650
armarx::objpose::PoseManifoldGaussian::Ellipsoid::size
Eigen::Vector3f size
Definition: PoseManifoldGaussian.h:64
armarx::objpose::PoseManifoldGaussian
A "gaussian" distribution in pose space (i.e.
Definition: PoseManifoldGaussian.h:24
armarx::objpose::PoseManifoldGaussian::covariance
Eigen::Matrix< float, 6, 6 > covariance
The covariance matrix.
Definition: PoseManifoldGaussian.h:30
armarx::objpose::PoseManifoldGaussian::getScaledRotationAxis
Eigen::AngleAxisf getScaledRotationAxis(int index, bool global=false) const
Get a column of the pure orientational covariance matrix as axis-angle rotation.
Definition: PoseManifoldGaussian.cpp:44
armarx::objpose::PoseManifoldGaussian::getTransformed
PoseManifoldGaussian getTransformed(const Eigen::Matrix4f &transform) const
Transform this gaussian by the given transform (e.g.
Definition: PoseManifoldGaussian.cpp:57
armarx::objpose::PoseManifoldGaussian::getPositionEllipsoid
Ellipsoid getPositionEllipsoid() const
Get the parameters of a 3D ellipsoid illustrating this gaussian.
Definition: PoseManifoldGaussian.cpp:10
armarx::objpose::PoseManifoldGaussian::Ellipsoid
Definition: PoseManifoldGaussian.h:60
armarx::objpose
Definition: objpose.h:6
PoseManifoldGaussian.h
armarx::transform
auto transform(const Container< InputT, Alloc > &in, OutputT(*func)(InputT const &)) -> Container< OutputT, typename std::allocator_traits< Alloc >::template rebind_alloc< OutputT >>
Convenience function (with less typing) to transform a container of type InputT into the same contain...
Definition: algorithm.h:351
angle
double angle(const Point &a, const Point &b, const Point &c)
Definition: point.hpp:109
armarx::objpose::PoseManifoldGaussian::Ellipsoid::center
Eigen::Vector3f center
Definition: PoseManifoldGaussian.h:62
Eigen::Matrix< float, 6, 6 >
GfxTL::Matrix3f
MatrixXX< 3, 3, float > Matrix3f
Definition: MatrixXX.h:649