diff --git a/gtsam_unstable/slam/SmartRangeFactor.h b/gtsam_unstable/slam/SmartRangeFactor.h index b054a249f..08a9035e4 100644 --- a/gtsam_unstable/slam/SmartRangeFactor.h +++ b/gtsam_unstable/slam/SmartRangeFactor.h @@ -60,6 +60,7 @@ public: /// Add a range measurement to a pose with given key. void addRange(Key key, double measuredRange) { measurements_.push_back(KeyedRange(key, measuredRange)); + keys_.push_back(key); } /// Number of measurements added @@ -102,8 +103,7 @@ public: } std::list solutions = Point2::CircleCircleIntersection( circle1.center, best_circle->center, best_fh); - solutions.front().print("front"); - solutions.back().print("back"); + // TODO, pick winner based on other measurement return solutions.front(); } @@ -118,13 +118,19 @@ public: std::list circles; BOOST_FOREACH(const KeyedRange& it, measurements_) { const Pose2& pose = x.at(it.key); - circles.push_back( - Circle2(pose.translation(), it.range)); + circles.push_back(Circle2(pose.translation(), it.range)); } Point2 optimizedPoint = triangulate(circles); size_t i = 0; - BOOST_FOREACH(const Circle2& it, circles) { - errors[i++] = it.radius - it.center.distance(optimizedPoint); + if (H) *H = std::vector(); + BOOST_FOREACH(const KeyedRange& it, measurements_) { + const Pose2& pose = x.at(it.key); + if (H) { + Matrix Hi; + errors[i] = pose.range(optimizedPoint, Hi) - it.range; + H->push_back(Hi); + } else + i += 1; } } return errors; diff --git a/gtsam_unstable/slam/tests/testSmartRangeFactor.cpp b/gtsam_unstable/slam/tests/testSmartRangeFactor.cpp index 0b8be50ef..a0836128c 100644 --- a/gtsam_unstable/slam/tests/testSmartRangeFactor.cpp +++ b/gtsam_unstable/slam/tests/testSmartRangeFactor.cpp @@ -70,8 +70,14 @@ TEST( SmartRangeFactor, unwhitenedError ) { EXPECT(assert_equal(Vector2(0,0), actual2)); f.addRange(3, r3); - Vector actual3 = f.unwhitenedError(values); + vector H; + Vector actual3 = f.unwhitenedError(values,H); EXPECT(assert_equal(Vector3(0,0,0), actual3)); + + // Check keys and Jacobian + EXPECT_LONGS_EQUAL(3,f.keys().size()); + EXPECT(assert_equal(Matrix_(1,3,0.0,-1.0,0.0), H.front())); + EXPECT(assert_equal(Matrix_(1,3,sqrt(2)/2,-sqrt(2)/2,0.0), H.back())); } /* ************************************************************************* */