| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-02-09 05:27:38 +08:00
										 |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |  * Atlanta, Georgia 30332-0415 | 
					
						
							|  |  |  |  * All Rights Reserved | 
					
						
							|  |  |  |  * Authors: Frank Dellaert, et al. (see THANKS for the full author list) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * See LICENSE for the license information | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * -------------------------------------------------------------------------- */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  *  @file  Event | 
					
						
							|  |  |  |  *  @brief Space-time event | 
					
						
							|  |  |  |  *  @author Frank Dellaert | 
					
						
							|  |  |  |  *  @author Jay Chakravarty | 
					
						
							|  |  |  |  *  @date December 2014 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gtsam/geometry/Point3.h>
 | 
					
						
							|  |  |  | #include <cmath>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /// A space-time event
 | 
					
						
							|  |  |  | class Event { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   double time_; ///< Time event was generated
 | 
					
						
							|  |  |  |   Point3 location_; ///< Location at time event was generated
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							| 
									
										
										
										
											2014-12-29 01:24:00 +08:00
										 |  |  |   enum { dimension = 4 }; | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   /// Default Constructor
 | 
					
						
							|  |  |  |   Event() : | 
					
						
							| 
									
										
										
										
											2016-02-11 09:48:52 +08:00
										 |  |  |       time_(0), location_(0,0,0) { | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Constructor from time and location
 | 
					
						
							|  |  |  |   Event(double t, const Point3& p) : | 
					
						
							|  |  |  |       time_(t), location_(p) { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Constructor with doubles
 | 
					
						
							|  |  |  |   Event(double t, double x, double y, double z) : | 
					
						
							|  |  |  |       time_(t), location_(x, y, z) { | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-11 04:44:56 +08:00
										 |  |  |   double time() const { return time_;} | 
					
						
							|  |  |  |   Point3 location() const { return location_;} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-11 20:45:15 +08:00
										 |  |  |   // TODO we really have to think of a better way to do linear arguments
 | 
					
						
							|  |  |  |   double height(OptionalJacobian<1,4> H = boost::none) const { | 
					
						
							| 
									
										
										
										
											2016-02-08 12:11:01 +08:00
										 |  |  |     static const Matrix14 JacobianZ = (Matrix14() << 0,0,0,1).finished(); | 
					
						
							| 
									
										
										
										
											2014-12-11 20:45:15 +08:00
										 |  |  |     if (H) *H = JacobianZ; | 
					
						
							|  |  |  |     return location_.z(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |   /** print with optional string */ | 
					
						
							|  |  |  |   void print(const std::string& s = "") const { | 
					
						
							| 
									
										
										
										
											2016-02-12 11:03:11 +08:00
										 |  |  |     std::cout << s << "time = " << time_ << "location = " << location_.transpose(); | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** equals with an tolerance */ | 
					
						
							|  |  |  |   bool equals(const Event& other, double tol = 1e-9) const { | 
					
						
							|  |  |  |     return std::abs(time_ - other.time_) < tol | 
					
						
							| 
									
										
										
										
											2016-02-12 11:03:11 +08:00
										 |  |  |         && traits<Point3>::Equals(location_, other.location_, tol); | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Updates a with tangent space delta
 | 
					
						
							|  |  |  |   inline Event retract(const Vector4& v) const { | 
					
						
							| 
									
										
										
										
											2016-02-09 05:27:38 +08:00
										 |  |  |     return Event(time_ + v[0], location_ + Point3(v.tail<3>())); | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Returns inverse retraction
 | 
					
						
							|  |  |  |   inline Vector4 localCoordinates(const Event& q) const { | 
					
						
							|  |  |  |     return Vector4::Zero(); // TODO
 | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /// Time of arrival to given microphone
 | 
					
						
							|  |  |  |   double toa(const Point3& microphone, //
 | 
					
						
							|  |  |  |       OptionalJacobian<1, 4> H1 = boost::none, //
 | 
					
						
							|  |  |  |       OptionalJacobian<1, 3> H2 = boost::none) const { | 
					
						
							| 
									
										
										
										
											2016-02-08 12:11:01 +08:00
										 |  |  |     static const double Speed = 330; | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |     Matrix13 D1, D2; | 
					
						
							| 
									
										
										
										
											2016-06-07 12:57:52 +08:00
										 |  |  |     double distance = gtsam::distance3(location_, microphone, D1, D2); | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  |     if (H1) | 
					
						
							|  |  |  |       // derivative of toa with respect to event
 | 
					
						
							|  |  |  |       *H1 << 1.0, D1 / Speed; | 
					
						
							|  |  |  |     if (H2) | 
					
						
							|  |  |  |       // derivative of toa with respect to microphone location
 | 
					
						
							|  |  |  |       *H2 << D2 / Speed; | 
					
						
							|  |  |  |     return time_ + distance / Speed; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Define GTSAM traits
 | 
					
						
							|  |  |  | template<> | 
					
						
							| 
									
										
										
										
											2014-12-29 01:24:00 +08:00
										 |  |  | struct GTSAM_EXPORT traits<Event> : internal::Manifold<Event> {}; | 
					
						
							| 
									
										
										
										
											2014-12-11 02:14:18 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | } //\ namespace gtsam
 |