This group mostly contains classes relevant to the probabilistics of mobile robot slam.
Include the following at the top of any translation unit that requires the ecl probabilistic tools.
Include the following at the top of any translation unit which requires this library:
#include <ecl/statistics.hpp> // Statistics Classes using ecl::CovarianceEllipsoid; using ecl::CovarianceEllipsoid2f; // also 2d, 3f, 3d typedef variants
You will also need to link to -lecl_statistics.
mplemented by the template class `CovarianceEllipsoid` - this takes two template parameters. The first is the float type used (usually `float`/`double`) and the second, the dimension of the ellipsoid to be determined.
Specialisations are enabled for 2 and 3 dimensional types only as we haven't had a need to develop a general implementation.
== Typedefs ==
Typedefs exist for the template class in the eigen style:
== Usage ==
You typically feed the covariance ellipsoid with a positive definite symmetric matrix (eigen matrix). Take care entering the positive definite symmetric matrix - the class does not yet do checking to make sure it is positive definite symmetric.
You can either input the matrix via the constructor - in which case it will automatically calculate the ellipsoid properties, or pass it in later via the `compute()` method:
Matrix2d M; M << 3.0, 1.0, 1.0, 5.0; // must be a positive definite, symmetric matrix CovarianceEllipsoid2d ellipse(M); // OR CovarianceEllipsoid2d ellipse; ellipse.compute(M);
Matrix2d M; M << 3.0, 1.0, 1.0, 5.0; CovarianceEllipsoid2d ellipse(M); // ellipse minor and major axis lengths const Vector2d& lengths = ellipse.lengths(); double eigen_value_0 = lengths*lengths; // angle between x-axis and major axis of the ellipse double angle = ellipse.rotation(); // values of the intercepts of the ellipse with x and y axes const Vector2d& intercepts = ellipse.intercepts(); // the ellipse axes/covariance eigenvectors as column vectors in a matrix const Matrix2d& axes = ellipse.axes();
The 3d version is similar, but will only calculate intercepts and axes respectively. Note that the axes are sorted (to ensure a right-handed co-ordinate system) and normalised.
Matrix3d P; double sigmaX(0.1); double sigmaY(0.5); double sigmaT(0.3); P << sigmaX*sigmaX, 0, 0, 0, sigmaY*sigmaY, 0, 0, 0, sigmaT*sigmaT; CovarianceEllipsoid3d ellipse(P); const Vector3d& lengths = ellipse.lengths(); double eigen_value_0 = lengths*lengths; const Matrix3d& axes = ellipse.axes();