| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file RelativeElevationFactor.h | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @brief Factor representing a known relative altitude in global frame | 
					
						
							|  |  |  |  *  | 
					
						
							|  |  |  |  * @date Aug 17, 2012 | 
					
						
							|  |  |  |  * @author Alex Cunningham | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-14 02:56:21 +08:00
										 |  |  | #include <gtsam_unstable/base/dllexport.h>
 | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | #include <gtsam/geometry/Pose3.h>
 | 
					
						
							|  |  |  | #include <gtsam/nonlinear/NonlinearFactor.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Binary factor for a relative elevation.  Note that this | 
					
						
							|  |  |  |  * factor takes into account only elevation, and corrects for orientation. | 
					
						
							|  |  |  |  * Unlike a range factor, the relative elevation is signed, and only affects | 
					
						
							|  |  |  |  * the Z coordinate.  Measurement function h(pose, pt) = h.z() - pt.z() | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Dimension: 1 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * TODO: enable use of a Pose3 for the target as well | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2013-03-14 02:56:21 +08:00
										 |  |  | class GTSAM_UNSTABLE_EXPORT RelativeElevationFactor: public NoiseModelFactor2<Pose3, Point3> { | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   double measured_; /** measurement */ | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   typedef RelativeElevationFactor This; | 
					
						
							|  |  |  |   typedef NoiseModelFactor2<Pose3, Point3> Base; | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   RelativeElevationFactor() : measured_(0.0) {} /* Default constructor */ | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   RelativeElevationFactor(Key poseKey, Key pointKey, double measured, | 
					
						
							|  |  |  |       const SharedNoiseModel& model); | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   virtual ~RelativeElevationFactor() {} | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   /// @return a deep copy of this factor
 | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  |   virtual gtsam::NonlinearFactor::shared_ptr clone() const { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |     return boost::static_pointer_cast<gtsam::NonlinearFactor>( | 
					
						
							|  |  |  |         gtsam::NonlinearFactor::shared_ptr(new This(*this))); } | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   /** h(x)-z */ | 
					
						
							|  |  |  |   Vector evaluateError(const Pose3& pose, const Point3& point, | 
					
						
							|  |  |  |       boost::optional<Matrix&> H1 = boost::none, boost::optional<Matrix&> H2 = boost::none) const; | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   /** return the measured */ | 
					
						
							|  |  |  |   inline double measured() const { return measured_; } | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   /** equals specialized to this factor */ | 
					
						
							|  |  |  |   virtual bool equals(const NonlinearFactor& expected, double tol=1e-9) const; | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   /** print contents */ | 
					
						
							|  |  |  |   void print(const std::string& s="", const KeyFormatter& keyFormatter = DefaultKeyFormatter) const; | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |   /** Serialization function */ | 
					
						
							|  |  |  |   friend class boost::serialization::access; | 
					
						
							|  |  |  |   template<class ARCHIVE> | 
					
						
							| 
									
										
										
										
											2015-03-06 23:12:09 +08:00
										 |  |  |   void serialize(ARCHIVE & ar, const unsigned int /*version*/) { | 
					
						
							| 
									
										
										
										
											2012-10-02 22:40:07 +08:00
										 |  |  |     ar & boost::serialization::make_nvp("NoiseModelFactor2", | 
					
						
							|  |  |  |         boost::serialization::base_object<Base>(*this)); | 
					
						
							|  |  |  |     ar & BOOST_SERIALIZATION_NVP(measured_); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2012-08-20 22:25:04 +08:00
										 |  |  | }; // RelativeElevationFactor
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } // \namespace gtsam
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 |