Derivatives work !!!
							parent
							
								
									0ceb09262c
								
							
						
					
					
						commit
						2dcbc72d8d
					
				|  | @ -52,8 +52,8 @@ public: | |||
| 
 | ||||
|   /** print with optional string */ | ||||
|   void print(const std::string& s = "") const { | ||||
|     std::cout << s << ", time = " << time_ << std::endl; | ||||
|     location_.print("location"); | ||||
|     std::cout << s << "time = " << time_; | ||||
|     location_.print("; location"); | ||||
|   } | ||||
| 
 | ||||
|   /** equals with an tolerance */ | ||||
|  | @ -87,14 +87,12 @@ public: | |||
|       OptionalJacobian<1, 3> H2 = boost::none) const { | ||||
|     Matrix13 D1, D2; | ||||
|     double distance = location_.distance(microphone, D1, D2); | ||||
|     if (H1) { | ||||
|     if (H1) | ||||
|       // derivative of toa with respect to event
 | ||||
|       *H1 << 1, D1 / Speed; | ||||
|     } | ||||
|     if (H2) { | ||||
|       *H1 << 1.0, D1 / Speed; | ||||
|     if (H2) | ||||
|       // derivative of toa with respect to microphone location
 | ||||
|       *H2 << D2 / Speed; | ||||
|     } | ||||
|     return time_ + distance / Speed; | ||||
|   } | ||||
| }; | ||||
|  | @ -108,6 +106,10 @@ template<> | |||
| struct GTSAM_EXPORT dimension<Event> : public boost::integral_constant<int, 4> { | ||||
| }; | ||||
| 
 | ||||
| template<> | ||||
| struct GTSAM_EXPORT is_manifold<Event> : public boost::true_type { | ||||
| }; | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| /// A "Time of Arrival" factor
 | ||||
|  | @ -149,6 +151,10 @@ static const double cm = 1e-2; | |||
| typedef Eigen::Matrix<double, 1, 1> Vector1; | ||||
| static SharedNoiseModel model(noiseModel::Unit::Create(1)); | ||||
| 
 | ||||
| static const double timeOfEvent = 25; | ||||
| static const Event exampleEvent(timeOfEvent, 1, 0, 0); | ||||
| static const Point3 microphoneAt0; | ||||
| 
 | ||||
| //*****************************************************************************
 | ||||
| TEST( Event, Constructor ) { | ||||
|   const double t = 0; | ||||
|  | @ -157,35 +163,43 @@ TEST( Event, Constructor ) { | |||
| 
 | ||||
| //*****************************************************************************
 | ||||
| TEST( Event, Toa1 ) { | ||||
|   Point3 microphone; | ||||
|   Event event(0, 1, 0, 0); | ||||
|   double expected = 1 / Event::Speed; | ||||
|   EXPECT_DOUBLES_EQUAL(expected, event.toa(microphone), 1e-9); | ||||
|   EXPECT_DOUBLES_EQUAL(expected, event.toa(microphoneAt0), 1e-9); | ||||
| } | ||||
| 
 | ||||
| //*****************************************************************************
 | ||||
| TEST( Event, Toa2 ) { | ||||
|   Point3 microphone; | ||||
|   double timeOfEvent = 25; | ||||
|   Event event(timeOfEvent, 1, 0, 0); | ||||
|   double expectedTOA = timeOfEvent + 1 / Event::Speed; | ||||
|   EXPECT_DOUBLES_EQUAL(expectedTOA, event.toa(microphone), 1e-9); | ||||
|   EXPECT_DOUBLES_EQUAL(expectedTOA, exampleEvent.toa(microphoneAt0), 1e-9); | ||||
| } | ||||
| 
 | ||||
| //*************************************************************************
 | ||||
| TEST (Event, Derivatives) { | ||||
|   Matrix14 actualH1; | ||||
|   Matrix13 actualH2; | ||||
|   exampleEvent.toa(microphoneAt0, actualH1, actualH2); | ||||
|   Matrix expectedH1 = numericalDerivative11<double, Event>( | ||||
|       boost::bind(&Event::toa, _1, microphoneAt0, boost::none, boost::none), | ||||
|       exampleEvent); | ||||
|   EXPECT(assert_equal(expectedH1, actualH1, 1e-8)); | ||||
|   Matrix expectedH2 = numericalDerivative11<double, Point3>( | ||||
|       boost::bind(&Event::toa, exampleEvent, _1, boost::none, boost::none), | ||||
|       microphoneAt0); | ||||
|   EXPECT(assert_equal(expectedH2, actualH2, 1e-8)); | ||||
| } | ||||
| 
 | ||||
| //*****************************************************************************
 | ||||
| TEST( Event, Expression ) { | ||||
|   Key key = 12; | ||||
|   Expression<Event> event_(key); | ||||
|   Point3 microphone; | ||||
|   Expression<Point3> knownMicrophone_(microphone); // constant expression
 | ||||
|   Expression<Point3> knownMicrophone_(microphoneAt0); // constant expression
 | ||||
|   Expression<double> expression(&Event::toa, event_, knownMicrophone_); | ||||
| 
 | ||||
| //  double timeOfEvent = 25;
 | ||||
| //  Event event12(timeOfEvent, 1, 0, 0);
 | ||||
| //  Values values;
 | ||||
| //  values.insert(key,event12);
 | ||||
| //  double expectedTOA = timeOfEvent + 1 / Event::Speed;
 | ||||
| //  EXPECT_DOUBLES_EQUAL(expectedTOA, expression.value(values), 1e-9);
 | ||||
|   Values values; | ||||
|   values.insert(key, exampleEvent); | ||||
|   double expectedTOA = timeOfEvent + 1 / Event::Speed; | ||||
|   EXPECT_DOUBLES_EQUAL(expectedTOA, expression.value(values), 1e-9); | ||||
| } | ||||
| 
 | ||||
| //*****************************************************************************
 | ||||
|  | @ -200,8 +214,7 @@ TEST(Event, Retract) { | |||
| TEST( TOAFactor, Construct ) { | ||||
|   Key key = 12; | ||||
|   Expression<Event> event_(key); | ||||
|   Point3 microphone; | ||||
|   Expression<Point3> knownMicrophone_(microphone); // constant expression
 | ||||
|   Expression<Point3> knownMicrophone_(microphoneAt0); // constant expression
 | ||||
|   double measurement = 7; | ||||
|   TOAFactor factor(event_, knownMicrophone_, measurement, model); | ||||
| } | ||||
|  | @ -236,11 +249,11 @@ TEST( TOAFactor, WholeEnchilada ) { | |||
|   } | ||||
| 
 | ||||
|   /// Print the graph
 | ||||
|   GTSAM_PRINT(graph); | ||||
| //  GTSAM_PRINT(graph);
 | ||||
| 
 | ||||
|   // Create initial estimate
 | ||||
|   Values initialEstimate; | ||||
|   Event estimatedEvent(timeOfEvent + 0.1, 200 * cm, 150 * cm, 50 * cm); | ||||
|   Event estimatedEvent(timeOfEvent + 10, 200 * cm, 150 * cm, 50 * cm); | ||||
|   initialEstimate.insert(key, estimatedEvent); | ||||
| 
 | ||||
|   // Print
 | ||||
|  | @ -249,10 +262,12 @@ TEST( TOAFactor, WholeEnchilada ) { | |||
|   // Optimize using Levenberg-Marquardt optimization.
 | ||||
|   LevenbergMarquardtParams params; | ||||
|   params.setVerbosity("ERROR"); | ||||
|   params.setAbsoluteErrorTol(1e-10); | ||||
|   LevenbergMarquardtOptimizer optimizer(graph, initialEstimate); | ||||
|   Values result = optimizer.optimize(); | ||||
| 
 | ||||
|   result.print("Final Result:\n"); | ||||
|   EXPECT(assert_equal(groundTruthEvent, result.at<Event>(key))); | ||||
|   EXPECT(assert_equal(groundTruthEvent, result.at<Event>(key), 1e-6)); | ||||
| } | ||||
| 
 | ||||
| //*****************************************************************************
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue