38 for (
const auto &t : xyz) {
39 xyz_[std::get<0>(t)][std::get<1>(t)] = std::get<2>(t);
43 AERROR <<
"calibration map is not correct.";
51 double keysize = xyz_.begin()->second.size();
52 auto itr_ = xyz_.begin();
53 for (; itr_ != xyz_.end(); itr_++) {
54 if (FLAGS_use_calibration_dimension_equal_check) {
55 if (keysize != itr_->second.size()) {
56 AERROR <<
"calibration map dimension is not equal.";
57 AERROR <<
"first value: " << keysize
58 <<
", second value: " << itr_->second.size();
65 auto inner_itr_ = itr_->second.begin();
66 for (; inner_itr_ != itr_->second.end(); inner_itr_++) {
67 if (inner_itr_->first > 0) {
69 }
else if (inner_itr_->first < 0) {
74 AERROR <<
"calibration has all pos map";
78 AERROR <<
"calibration has all nag map";
86 double max_x = xyz_.rbegin()->first;
87 double min_x = xyz_.begin()->first;
89 return InterpolateYz(xyz_.rbegin()->second, xy.second);
92 return InterpolateYz(xyz_.begin()->second, xy.second);
95 auto itr_after = xyz_.lower_bound(xy.first);
96 auto itr_before = itr_after;
97 if (itr_before != xyz_.begin()) {
101 double x_before = itr_before->first;
102 double z_before = InterpolateYz(itr_before->second, xy.second);
103 double x_after = itr_after->first;
104 double z_after = InterpolateYz(itr_after->second, xy.second);
106 double x_diff_before = std::fabs(xy.first - x_before);
107 double x_diff_after = std::fabs(xy.first - x_after);
109 return InterpolateValue(z_before, x_diff_before, z_after, x_diff_after);
112double Interpolation2D::InterpolateYz(
const std::map<double, double> &yz_table,
114 if (yz_table.empty()) {
115 AERROR <<
"Unable to interpolateYz because yz_table is empty.";
118 double max_y = yz_table.rbegin()->first;
119 double min_y = yz_table.begin()->first;
121 return yz_table.rbegin()->second;
124 return yz_table.begin()->second;
127 auto itr_after = yz_table.lower_bound(y);
128 auto itr_before = itr_after;
130 if (itr_before != yz_table.begin()) {
134 double y_before = itr_before->first;
135 double z_before = itr_before->second;
136 double y_after = itr_after->first;
137 double z_after = itr_after->second;
139 double y_diff_before = std::fabs(y - y_before);
140 double y_diff_after = std::fabs(y - y_after);
142 return InterpolateValue(z_before, y_diff_before, z_after, y_diff_after);
145double Interpolation2D::InterpolateValue(
const double value_before,
146 const double dist_before,
147 const double value_after,
148 const double dist_after)
const {
155 double value_gap = value_after - value_before;
156 double value_buff = value_gap * dist_before / (dist_before + dist_after);
157 return value_before + value_buff;
bool Init(const DataType &xyz)
initialize Interpolation2D internal table
std::pair< double, double > KeyType
std::vector< std::tuple< double, double, double > > DataType
double Interpolate(const KeyType &xy) const
linear interpolate from 2D key (double, double) to one double value.
const double kDoubleEpsilon