| 
									
										
										
										
											2009-08-29 09:24:26 +08:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * @file  Pose2.cpp | 
					
						
							|  |  |  |  * @brief 2D Pose | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "Pose2.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | using namespace std; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   /* ************************************************************************* */ | 
					
						
							|  |  |  |   void Pose2::print(const string& s) const { | 
					
						
							|  |  |  |     cout << s << "(" << t_.x() << ", " << t_.y() << ", " << r_.theta() << ")" << endl; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-08-29 09:24:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   /* ************************************************************************* */ | 
					
						
							|  |  |  |   bool Pose2::equals(const Pose2& q, double tol) const { | 
					
						
							|  |  |  |     return t_.equals(q.t_, tol) && r_.equals(q.r_, tol); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-08-29 09:24:26 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   /* ************************************************************************* */ | 
					
						
							|  |  |  |   //	Pose2 Pose2::rotate(double theta) const {
 | 
					
						
							|  |  |  |   //		//return Pose2(t_, Rot2(theta)*r_);
 | 
					
						
							|  |  |  |   //	  return Pose2(Point2(0.0,0.0),-theta)*(*this);
 | 
					
						
							|  |  |  |   //	}
 | 
					
						
							| 
									
										
										
										
											2009-12-08 22:02:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   /* ************************************************************************* */ | 
					
						
							|  |  |  |   Point2 transform_to(const Pose2& pose, const Point2& point) { | 
					
						
							|  |  |  |     return pose*point; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-09 03:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   // TODO, have a combined function that returns both function value and derivative
 | 
					
						
							|  |  |  |   Matrix Dtransform_to1(const Pose2& pose, const Point2& point) { | 
					
						
							| 
									
										
										
										
											2009-12-22 00:43:23 +08:00
										 |  |  |     Matrix dx_dt = Matrix_(2,2, -1.0, 0.0, 0.0, -1.0); | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |     Matrix dx_dr = Dunrotate1(pose.r(), point-pose.t()); | 
					
						
							|  |  |  |     return collect(2, &dx_dt, &dx_dr); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-09 03:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   Matrix Dtransform_to2(const Pose2& pose, const Point2& point) { | 
					
						
							|  |  |  |     return pose.r().transpose(); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-09 03:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   /* ************************************************************************* */ | 
					
						
							|  |  |  |   Pose2 between(const Pose2& p1, const Pose2& p2) { | 
					
						
							|  |  |  |     return Pose2( | 
					
						
							|  |  |  |         p1.r().invcompose(p2.r()), | 
					
						
							|  |  |  |         p1.r().unrotate(p2.t() - p1.t())); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-09 03:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   Matrix Dbetween1(const Pose2& p1, const Pose2& p2) { | 
					
						
							| 
									
										
										
										
											2009-12-22 00:43:23 +08:00
										 |  |  |     Matrix dt_dr = Dunrotate1(p1.r(), p2.t()-p1.t()); | 
					
						
							|  |  |  |     Matrix dt_dt1 = -p2.r().invcompose(p1.r()).matrix(); | 
					
						
							|  |  |  |     Matrix dt_dr1 = Dunrotate1(p2.r(), p2.t()-p1.t()); | 
					
						
							|  |  |  |     return Matrix_(3,3, | 
					
						
							|  |  |  |         dt_dt1(0,0), dt_dt1(0,1), dt_dr1(0,0), | 
					
						
							|  |  |  |         dt_dt1(1,0), dt_dt1(1,1), dt_dr1(1,0), | 
					
						
							|  |  |  |         0.0,         0.0,         -1.0); | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-09 03:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   Matrix Dbetween2(const Pose2& p1, const Pose2& p2) { | 
					
						
							|  |  |  |     Matrix db_dt2 = p1.r().transpose(); | 
					
						
							|  |  |  |     return Matrix_(3,3, | 
					
						
							| 
									
										
										
										
											2009-12-22 00:43:23 +08:00
										 |  |  |         1.0, 0.0, 0.0, | 
					
						
							|  |  |  |         0.0, 1.0, 0.0, | 
					
						
							|  |  |  |         0.0, 0.0, 1.0); | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2009-12-09 03:12:20 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-15 08:00:02 +08:00
										 |  |  |   /* ************************************************************************* */ | 
					
						
							| 
									
										
										
										
											2009-08-29 09:24:26 +08:00
										 |  |  | } // namespace gtsam
 |