| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  | /* ----------------------------------------------------------------------------
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  * GTSAM Copyright 2010, Georgia Tech Research Corporation, | 
					
						
							|  |  |  |  * 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   SmartStereoProjectionFactorPP.h | 
					
						
							|  |  |  |  * @brief  Smart stereo factor on poses and extrinsic calibration | 
					
						
							|  |  |  |  * @author Luca Carlone | 
					
						
							|  |  |  |  * @author Frank Dellaert | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <gtsam_unstable/slam/SmartStereoProjectionFactorPP.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace gtsam { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SmartStereoProjectionFactorPP::SmartStereoProjectionFactorPP( | 
					
						
							|  |  |  |     const SharedNoiseModel& sharedNoiseModel, | 
					
						
							|  |  |  |     const SmartStereoProjectionParams& params) | 
					
						
							|  |  |  |     : Base(sharedNoiseModel, params) {} // note: no extrinsic specified!
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SmartStereoProjectionFactorPP::add( | 
					
						
							|  |  |  |     const StereoPoint2& measured, | 
					
						
							|  |  |  |     const Key& w_P_body_key, const Key& body_P_cam_key, | 
					
						
							|  |  |  |     const boost::shared_ptr<Cal3_S2Stereo>& K) { | 
					
						
							|  |  |  |   // we index by cameras..
 | 
					
						
							|  |  |  |   Base::add(measured, w_P_body_key); | 
					
						
							|  |  |  |   // but we also store the extrinsic calibration keys in the same order
 | 
					
						
							| 
									
										
										
										
											2021-04-04 05:45:02 +08:00
										 |  |  |   world_P_body_keys_.push_back(w_P_body_key); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |   body_P_cam_keys_.push_back(body_P_cam_key); | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-27 05:25:27 +08:00
										 |  |  |   // pose keys are assumed to be unique (1 observation per time stamp), but calibration can be shared
 | 
					
						
							|  |  |  |   if(std::find(keys_.begin(), keys_.end(), body_P_cam_key) == keys_.end()) | 
					
						
							|  |  |  |       keys_.push_back(body_P_cam_key); // add only unique keys
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |   K_all_.push_back(K); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SmartStereoProjectionFactorPP::add( | 
					
						
							|  |  |  |     const std::vector<StereoPoint2>& measurements, | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |     const KeyVector& world_P_body_keys, const KeyVector& body_P_cam_keys, | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |     const std::vector<boost::shared_ptr<Cal3_S2Stereo>>& Ks) { | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |   assert(world_P_body_keys.size() == measurements.size()); | 
					
						
							|  |  |  |   assert(world_P_body_keys.size() == body_P_cam_keys.size()); | 
					
						
							|  |  |  |   assert(world_P_body_keys.size() == Ks.size()); | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  |   for (size_t i = 0; i < measurements.size(); i++) { | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |       Base::add(measurements[i], world_P_body_keys[i]); | 
					
						
							| 
									
										
										
										
											2021-03-27 05:25:27 +08:00
										 |  |  |       // pose keys are assumed to be unique (1 observation per time stamp), but calibration can be shared
 | 
					
						
							|  |  |  |       if(std::find(keys_.begin(), keys_.end(), body_P_cam_keys[i]) == keys_.end()) | 
					
						
							|  |  |  |           keys_.push_back(body_P_cam_keys[i]); // add only unique keys
 | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |       world_P_body_keys_.push_back(world_P_body_keys[i]); | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  |       body_P_cam_keys_.push_back(body_P_cam_keys[i]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       K_all_.push_back(Ks[i]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void SmartStereoProjectionFactorPP::add( | 
					
						
							|  |  |  |     const std::vector<StereoPoint2>& measurements, | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |     const KeyVector& world_P_body_keys, const KeyVector& body_P_cam_keys, | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |     const boost::shared_ptr<Cal3_S2Stereo>& K) { | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |   assert(world_P_body_keys.size() == measurements.size()); | 
					
						
							|  |  |  |   assert(world_P_body_keys.size() == body_P_cam_keys.size()); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |   for (size_t i = 0; i < measurements.size(); i++) { | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |     Base::add(measurements[i], world_P_body_keys[i]); | 
					
						
							| 
									
										
										
										
											2021-03-27 05:25:27 +08:00
										 |  |  |     // pose keys are assumed to be unique (1 observation per time stamp), but calibration can be shared
 | 
					
						
							|  |  |  |     if(std::find(keys_.begin(), keys_.end(), body_P_cam_keys[i]) == keys_.end()) | 
					
						
							|  |  |  |       keys_.push_back(body_P_cam_keys[i]); // add only unique keys
 | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-04-04 06:10:39 +08:00
										 |  |  |     world_P_body_keys_.push_back(world_P_body_keys[i]); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |     body_P_cam_keys_.push_back(body_P_cam_keys[i]); | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |     K_all_.push_back(K); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  | void SmartStereoProjectionFactorPP::print( | 
					
						
							|  |  |  |     const std::string& s, const KeyFormatter& keyFormatter) const { | 
					
						
							| 
									
										
										
										
											2021-03-26 09:37:13 +08:00
										 |  |  |   std::cout << s << "SmartStereoProjectionFactorPP: \n "; | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |   for (size_t i = 0; i < K_all_.size(); i++) { | 
					
						
							|  |  |  |     K_all_[i]->print("calibration = "); | 
					
						
							| 
									
										
										
										
											2021-03-22 07:12:40 +08:00
										 |  |  |     std::cout << " extrinsic pose key: " << keyFormatter(body_P_cam_keys_[i]) << std::endl; | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |   } | 
					
						
							|  |  |  |   Base::print("", keyFormatter); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | bool SmartStereoProjectionFactorPP::equals(const NonlinearFactor& p, | 
					
						
							|  |  |  |                                              double tol) const { | 
					
						
							|  |  |  |   const SmartStereoProjectionFactorPP* e = | 
					
						
							|  |  |  |       dynamic_cast<const SmartStereoProjectionFactorPP*>(&p); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   return e && Base::equals(p, tol) && | 
					
						
							| 
									
										
										
										
											2021-03-14 02:54:23 +08:00
										 |  |  |       body_P_cam_keys_ == e->getExtrinsicPoseKeys(); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | double SmartStereoProjectionFactorPP::error(const Values& values) const { | 
					
						
							|  |  |  |   if (this->active(values)) { | 
					
						
							|  |  |  |     return this->totalReprojectionError(cameras(values)); | 
					
						
							|  |  |  |   } else {  // else of active flag
 | 
					
						
							|  |  |  |     return 0.0; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SmartStereoProjectionFactorPP::Base::Cameras | 
					
						
							|  |  |  | SmartStereoProjectionFactorPP::cameras(const Values& values) const { | 
					
						
							| 
									
										
										
										
											2021-04-04 05:45:02 +08:00
										 |  |  |   assert(world_P_body_keys_.size() == K_all_.size()); | 
					
						
							|  |  |  |   assert(world_P_body_keys_.size() == body_P_cam_keys_.size()); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |   Base::Cameras cameras; | 
					
						
							| 
									
										
										
										
											2021-04-04 05:45:02 +08:00
										 |  |  |   for (size_t i = 0; i < world_P_body_keys_.size(); i++) { | 
					
						
							|  |  |  |     Pose3 w_P_body = values.at<Pose3>(world_P_body_keys_[i]); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |     Pose3 body_P_cam = values.at<Pose3>(body_P_cam_keys_[i]); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:54:23 +08:00
										 |  |  |     Pose3 w_P_cam = w_P_body.compose(body_P_cam); | 
					
						
							| 
									
										
										
										
											2021-03-14 02:50:47 +08:00
										 |  |  |     cameras.push_back(StereoCamera(w_P_cam, K_all_[i])); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   return cameras; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | }  // \ namespace gtsam
 |