12 #include <gtsam_unstable/dllexport.h> 34 center(p), radius(r) {
68 throw std::invalid_argument(
69 "SmartRangeFactor::addRange: adding duplicate measurement for key.");
72 measurements_.push_back(measuredRange);
73 size_t n =
keys_.size();
81 void print(
const std::string& s =
"",
82 const KeyFormatter& keyFormatter = DefaultKeyFormatter)
const override {
83 std::cout << s <<
"SmartRangeFactor with " <<
size() <<
" measurements\n";
101 std::list<Circle2> circles;
103 for (
size_t j = 0; j < n; j++) {
108 Circle2 circle1 = circles.front();
109 std::optional<Point2> best_fh;
110 std::optional<Circle2> bestCircle2 = std::nullopt;
113 for (
const Circle2& it : circles) {
115 double d =
distance2(circle1.center, it.center);
119 std::optional<Point2> fh = circleCircleIntersection(
120 circle1.radius / d, it.radius / d);
123 if (fh && (!best_fh || fh->y() > best_fh->y())) {
130 if (bestCircle2 && best_fh) {
131 auto bestCircleCenter = bestCircle2->center;
132 std::list<Point2> intersections =
133 circleCircleIntersection(circle1.center, bestCircleCenter, best_fh);
136 double error1 = 0, error2 = 0;
137 Point2 p1 = intersections.front(), p2 = intersections.back();
138 for (
const Circle2& it : circles) {
142 return (error1 < error2) ? p1 : p2;
144 throw std::runtime_error(
"triangulate failed");
156 for (
size_t j = 0; j < n; j++)
157 (*H)[j] = Matrix::Zero(3, 1);
161 Vector
error = Z_1x1;
169 for (
size_t j = 0; j < n; j++) {
173 error[0] += pose.
range(optimizedPoint, (*H)[j]) - measurements_[j];
175 error[0] += pose.
range(optimizedPoint) - measurements_[j];
182 gtsam::NonlinearFactor::shared_ptr
clone()
const override {
184 gtsam::NonlinearFactor::shared_ptr(
new This(*
this)));
double error(const Values &c) const override
std::vector< Matrix > * OptionalMatrixVecType
Definition: NonlinearFactor.h:61
gtsam::NonlinearFactor::shared_ptr clone() const override
Definition: SmartRangeFactor.h:182
const ValueType at(Key j) const
Definition: Values-inl.h:204
size_t size() const
Definition: Factor.h:159
Vector2 Point2
Definition: Point2.h:32
Definition: NonlinearFactor.h:68
SmartRangeFactor(double s)
Definition: SmartRangeFactor.h:58
KeyVector keys_
The keys involved in this factor.
Definition: Factor.h:87
void addRange(Key key, double measuredRange)
Add a range measurement to a pose with given key.
Definition: SmartRangeFactor.h:66
std::vector< double > measurements_
Range measurements.
Definition: SmartRangeFactor.h:42
SmartRangeFactor()
Definition: SmartRangeFactor.h:51
Definition: NonlinearFactor.h:197
Point2 triangulate(const Values &x) const
Definition: SmartRangeFactor.h:99
Definition: SmartRangeFactor.h:32
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Definition: SmartRangeFactor.h:81
const SharedNoiseModel & noiseModel() const
access to the noise model
Definition: NonlinearFactor.h:245
double variance_
variance on noise
Definition: SmartRangeFactor.h:43
static shared_ptr Variance(size_t dim, double variance, bool smart=true)
Definition: SmartRangeFactor.h:30
std::function< std::string(Key)> KeyFormatter
Typedef for a function to format a key, i.e. to convert it to a string.
Definition: Key.h:35
GTSAM_EXPORT double distance2(const Point2 &p1, const Point2 &q, OptionalJacobian< 1, 2 > H1={}, OptionalJacobian< 1, 2 > H2={})
distance between two points
Definition: chartTesting.h:28
virtual Vector unwhitenedError(const Values &x, OptionalMatrixVecType H=nullptr) const =0
void print(const std::string &s="", const KeyFormatter &keyFormatter=DefaultKeyFormatter) const override
Non-linear factor base classes.
bool equals(const NonlinearFactor &f, double tol=1e-9) const override
Definition: SmartRangeFactor.h:88
const Point2 & translation() const
translation
Definition: Pose2.h:261
GTSAM_EXPORT double range(const Point2 &point, OptionalJacobian< 1, 3 > H1={}, OptionalJacobian< 1, 2 > H2={}) const
std::uint64_t Key
Integer nonlinear key type.
Definition: types.h:102
Vector unwhitenedError(const Values &x, OptionalMatrixVecType H=nullptr) const override
Definition: SmartRangeFactor.h:151