96 lines
3.5 KiB
C++
96 lines
3.5 KiB
C++
/*
|
|
* @file LocalOrientedPlane3Factor.h
|
|
* @brief LocalOrientedPlane3 Factor class
|
|
* @author David Wisth
|
|
* @date February 12, 2021
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <gtsam/geometry/OrientedPlane3.h>
|
|
#include <gtsam/nonlinear/NonlinearFactor.h>
|
|
#include <gtsam_unstable/dllexport.h>
|
|
|
|
#include <string>
|
|
|
|
namespace gtsam {
|
|
|
|
/**
|
|
* Factor to measure a planar landmark from a given pose, with a given local
|
|
* linearization point.
|
|
*
|
|
* This factor is based on the relative plane factor formulation proposed in:
|
|
* Equation 25,
|
|
* M. Kaess, "Simultaneous Localization and Mapping with Infinite Planes",
|
|
* IEEE International Conference on Robotics and Automation, 2015.
|
|
*
|
|
*
|
|
* The main purpose of this factor is to improve the numerical stability of the
|
|
* optimization, especially compared to gtsam::OrientedPlane3Factor. This
|
|
* is especially relevant when the sensor is far from the origin (and thus
|
|
* the derivatives associated to transforming the plane are large).
|
|
*
|
|
* x0 is the current sensor pose, and x1 is the local "anchor pose" - i.e.
|
|
* a local linearisation point for the plane. The plane is representated and
|
|
* optimized in x1 frame in the optimization.
|
|
*/
|
|
class GTSAM_UNSTABLE_EXPORT LocalOrientedPlane3Factor
|
|
: public NoiseModelFactorN<Pose3, Pose3, OrientedPlane3> {
|
|
protected:
|
|
OrientedPlane3 measured_p_;
|
|
typedef NoiseModelFactorN<Pose3, Pose3, OrientedPlane3> Base;
|
|
public:
|
|
// Provide access to the Matrix& version of evaluateError:
|
|
using Base::evaluateError;
|
|
|
|
/// Constructor
|
|
LocalOrientedPlane3Factor() {}
|
|
|
|
~LocalOrientedPlane3Factor() override {}
|
|
|
|
/** Constructor with measured plane (a,b,c,d) coefficients
|
|
* @param z measured plane (a,b,c,d) coefficients as 4D vector
|
|
* @param noiseModel noiseModel Gaussian noise model
|
|
* @param poseKey Key or symbol for unknown pose
|
|
* @param anchorPoseKey Key or symbol for the plane's linearization point,
|
|
(called the "anchor pose").
|
|
* @param landmarkKey Key or symbol for unknown planar landmark
|
|
*
|
|
* Note: The anchorPoseKey can simply be chosen as the first pose a plane
|
|
* is observed.
|
|
*/
|
|
LocalOrientedPlane3Factor(const Vector4& z, const SharedNoiseModel& noiseModel,
|
|
Key poseKey, Key anchorPoseKey, Key landmarkKey)
|
|
: Base(noiseModel, poseKey, anchorPoseKey, landmarkKey), measured_p_(z) {}
|
|
|
|
LocalOrientedPlane3Factor(const OrientedPlane3& z,
|
|
const SharedNoiseModel& noiseModel,
|
|
Key poseKey, Key anchorPoseKey, Key landmarkKey)
|
|
: Base(noiseModel, poseKey, anchorPoseKey, landmarkKey), measured_p_(z) {}
|
|
|
|
/// print
|
|
void print(const std::string& s = "LocalOrientedPlane3Factor",
|
|
const KeyFormatter& keyFormatter = DefaultKeyFormatter) const override;
|
|
|
|
/***
|
|
* Vector of errors
|
|
* @brief Error = measured_plane_.error(a_plane.transform(inv(wTwa) * wTwi))
|
|
*
|
|
* This is the error of the measured and predicted plane in the current
|
|
* sensor frame, i. The plane is represented in the anchor pose, a.
|
|
*
|
|
* @param wTwi The pose of the sensor in world coordinates
|
|
* @param wTwa The pose of the anchor frame in world coordinates
|
|
* @param a_plane The estimated plane in anchor frame.
|
|
*
|
|
* Note: The optimized plane is represented in anchor frame, a, not the
|
|
* world frame.
|
|
*/
|
|
Vector evaluateError(const Pose3& wTwi, const Pose3& wTwa,
|
|
const OrientedPlane3& a_plane, OptionalMatrixType H1,
|
|
OptionalMatrixType H2, OptionalMatrixType H3) const override;
|
|
};
|
|
|
|
} // namespace gtsam
|
|
|