00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00036 
00037 #include <monocam_settler/monocam_settler.h>
00038 #include <settlerlib/interval_calc.h>
00039 
00040 using namespace monocam_settler;
00041 
00042 
00043 MonocamSettler::MonocamSettler() : cache_(&DeflatedMsgCache::getPtrStamp)
00044 {
00045   configured_ = false;
00046 }
00047 
00048 bool MonocamSettler::configure(const monocam_settler::ConfigGoal& goal)
00049 {
00050   tol_ = goal.tolerance;
00051   max_step_ = goal.max_step;
00052   ignore_failures_ = goal.ignore_failures;
00053   cache_.clear();
00054   cache_.setMaxSize(goal.cache_size);
00055 
00056   ROS_DEBUG("Configuring MonocamSettler with tolerance of [%.3f]", tol_);
00057 
00058   configured_ = true;
00059   return true;
00060 }
00061 
00062 
00063 bool MonocamSettler::add(const calibration_msgs::CalibrationPatternConstPtr msg,
00064                          calibration_msgs::Interval& interval)
00065 {
00066   if (!configured_)
00067   {
00068     ROS_WARN("Not configured. Going to skip");
00069     return false;
00070   }
00071 
00072   
00073   if (!msg->success)
00074   {
00075     if(!ignore_failures_)   
00076       cache_.clear();
00077     return false;
00078   }
00079 
00080   boost::shared_ptr<DeflatedCalibrationPattern> deflated(new DeflatedCalibrationPattern);
00081   deflate(msg, *deflated);
00082   cache_.add(deflated);
00083 
00084   DeflatedCache* bare_cache = (DeflatedCache*)(&cache_);
00085 
00086   std::vector<double> tol_vec(deflated->channels_.size(), tol_);
00087 
00088   interval = settlerlib::IntervalCalc::computeLatestInterval(*bare_cache, tol_vec, max_step_);
00089 
00090   return true;
00091 }
00092 
00093 void MonocamSettler::deflate(const calibration_msgs::CalibrationPatternConstPtr& msg,
00094                              DeflatedCalibrationPattern& deflated)
00095 {
00096   deflated.header.stamp = msg->header.stamp;
00097 
00098   const unsigned int N = msg->image_points.size();
00099   deflated.channels_.resize( 2 * N );
00100   for (unsigned int i=0; i<N; i++)
00101   {
00102     deflated.channels_[2*i+0] = msg->image_points[i].x;
00103     deflated.channels_[2*i+1] = msg->image_points[i].y;
00104   }
00105   deflated.msg_ = msg;
00106 }