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 }