98 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
		
		
			
		
	
	
			98 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			C++
		
	
	
|  | /* ----------------------------------------------------------------------------
 | ||
|  | 
 | ||
|  |  * 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   SmartStereoProjectionPoseFactor.cpp | ||
|  |  * @brief  Smart stereo factor on poses, assuming camera calibration is fixed | ||
|  |  * @author Luca Carlone | ||
|  |  * @author Antoni Rosinol | ||
|  |  * @author Chris Beall | ||
|  |  * @author Zsolt Kira | ||
|  |  * @author Frank Dellaert | ||
|  |  */ | ||
|  | 
 | ||
|  | #include <gtsam_unstable/slam/SmartStereoProjectionPoseFactor.h>
 | ||
|  | 
 | ||
|  | namespace gtsam { | ||
|  | 
 | ||
|  | SmartStereoProjectionPoseFactor::SmartStereoProjectionPoseFactor( | ||
|  |     const SharedNoiseModel& sharedNoiseModel, | ||
|  |     const SmartStereoProjectionParams& params, | ||
|  |     const boost::optional<Pose3>& body_P_sensor) | ||
|  |     : Base(sharedNoiseModel, params, body_P_sensor) {} | ||
|  | 
 | ||
|  | void SmartStereoProjectionPoseFactor::add( | ||
|  |     const StereoPoint2& measured, const Key& poseKey, | ||
|  |     const boost::shared_ptr<Cal3_S2Stereo>& K) { | ||
|  |   Base::add(measured, poseKey); | ||
|  |   K_all_.push_back(K); | ||
|  | } | ||
|  | 
 | ||
|  | void SmartStereoProjectionPoseFactor::add( | ||
|  |     const std::vector<StereoPoint2>& measurements, const KeyVector& poseKeys, | ||
|  |     const std::vector<boost::shared_ptr<Cal3_S2Stereo>>& Ks) { | ||
|  |   assert(measurements.size() == poseKeys.size()); | ||
|  |   assert(poseKeys.size() == Ks.size()); | ||
|  |   Base::add(measurements, poseKeys); | ||
|  |   K_all_.insert(K_all_.end(), Ks.begin(), Ks.end()); | ||
|  | } | ||
|  | 
 | ||
|  | void SmartStereoProjectionPoseFactor::add( | ||
|  |     const std::vector<StereoPoint2>& measurements, const KeyVector& poseKeys, | ||
|  |     const boost::shared_ptr<Cal3_S2Stereo>& K) { | ||
|  |   assert(poseKeys.size() == measurements.size()); | ||
|  |   for (size_t i = 0; i < measurements.size(); i++) { | ||
|  |     Base::add(measurements[i], poseKeys[i]); | ||
|  |     K_all_.push_back(K); | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | void SmartStereoProjectionPoseFactor::print( | ||
|  |     const std::string& s, const KeyFormatter& keyFormatter) const { | ||
|  |   std::cout << s << "SmartStereoProjectionPoseFactor, z = \n "; | ||
|  |   for (const boost::shared_ptr<Cal3_S2Stereo>& K : K_all_) { | ||
|  |     K->print("calibration = "); | ||
|  |   } | ||
|  |   Base::print("", keyFormatter); | ||
|  | } | ||
|  | 
 | ||
|  | bool SmartStereoProjectionPoseFactor::equals(const NonlinearFactor& p, | ||
|  |                                              double tol) const { | ||
|  |   const SmartStereoProjectionPoseFactor* e = | ||
|  |       dynamic_cast<const SmartStereoProjectionPoseFactor*>(&p); | ||
|  | 
 | ||
|  |   return e && Base::equals(p, tol); | ||
|  | } | ||
|  | 
 | ||
|  | double SmartStereoProjectionPoseFactor::error(const Values& values) const { | ||
|  |   if (this->active(values)) { | ||
|  |     return this->totalReprojectionError(cameras(values)); | ||
|  |   } else {  // else of active flag
 | ||
|  |     return 0.0; | ||
|  |   } | ||
|  | } | ||
|  | 
 | ||
|  | SmartStereoProjectionPoseFactor::Base::Cameras | ||
|  | SmartStereoProjectionPoseFactor::cameras(const Values& values) const { | ||
|  |   assert(keys_.size() == K_all_.size()); | ||
|  |   Base::Cameras cameras; | ||
|  |   for (size_t i = 0; i < keys_.size(); i++) { | ||
|  |     Pose3 pose = values.at<Pose3>(keys_[i]); | ||
|  |     if (Base::body_P_sensor_) { | ||
|  |       pose = pose.compose(*(Base::body_P_sensor_)); | ||
|  |     } | ||
|  |     cameras.push_back(StereoCamera(pose, K_all_[i])); | ||
|  |   } | ||
|  |   return cameras; | ||
|  | } | ||
|  | 
 | ||
|  | }  // \ namespace gtsam
 |