34 ACHECK(name_intrinsic_map.find(master_sensor_name_) !=
35 name_intrinsic_map.end());
37 name_camera_status_map_.clear();
38 for (
auto iter = name_intrinsic_map.begin(); iter != name_intrinsic_map.end();
40 camera_status.
k_matrix[0] =
static_cast<double>(iter->second(0, 0));
41 camera_status.
k_matrix[4] =
static_cast<double>(iter->second(1, 1));
42 camera_status.
k_matrix[2] =
static_cast<double>(iter->second(0, 2));
43 camera_status.
k_matrix[5] =
static_cast<double>(iter->second(1, 2));
45 name_camera_status_map_.insert(
46 std::pair<std::string, CameraStatus>(iter->first, camera_status));
52 calibrator_init_options.
focal_x =
static_cast<float>(
53 name_camera_status_map_[master_sensor_name_].k_matrix[0]);
54 calibrator_init_options.
focal_y =
static_cast<float>(
55 name_camera_status_map_[master_sensor_name_].k_matrix[4]);
56 calibrator_init_options.
cx =
static_cast<float>(
57 name_camera_status_map_[master_sensor_name_].k_matrix[2]);
58 calibrator_init_options.
cy =
static_cast<float>(
59 name_camera_status_map_[master_sensor_name_].k_matrix[5]);
62 ACHECK(calibrator_ !=
nullptr);
63 ACHECK(calibrator_->Init(calibrator_init_options))
96 int x,
int y, Eigen::Vector3d *point3d)
const {
97 if (!is_service_ready_) {
100 ACHECK(point3d !=
nullptr);
101 double pixel[2] = {
static_cast<double>(x),
static_cast<double>(y)};
102 double point[3] = {0};
103 auto iter = name_camera_status_map_.find(sensor_name_);
105 pixel, &(iter->second.k_matrix[0]), &(iter->second.ground_plane[0]),
108 (*point3d)(0) = (*point3d)(1) = (*point3d)(2) = 0.0;
112 (*point3d)(0) = point[0];
113 (*point3d)(1) = point[1];
114 (*point3d)(2) = point[2];
119 Eigen::Vector4d *plane_param)
const {
120 if (plane_param ==
nullptr) {
121 AERROR <<
"plane_param is nullptr";
124 if (!is_service_ready_) {
125 (*plane_param)(0) = (*plane_param)(1) = (*plane_param)(2) =
126 (*plane_param)(3) = 0.0;
129 auto iter = name_camera_status_map_.find(sensor_name_);
130 (*plane_param)(0) = iter->second.ground_plane[0];
131 (*plane_param)(1) = iter->second.ground_plane[1];
132 (*plane_param)(2) = iter->second.ground_plane[2];
133 (*plane_param)(3) = iter->second.ground_plane[3];
158 if (frame ==
nullptr) {
159 AERROR <<
"frame is nullptr";
163 if (sensor_name_ == master_sensor_name_) {
171 float pitch_angle = 0.f;
172 bool updated = calibrator_->Calibrate(calibrator_options, &pitch_angle);
175 name_camera_status_map_[master_sensor_name_].pitch_angle = pitch_angle;
176 for (
auto iter = name_camera_status_map_.begin();
177 iter != name_camera_status_map_.end(); iter++) {
179 iter->second.pitch_angle =
180 iter->second.pitch_angle_diff +
181 name_camera_status_map_[master_sensor_name_].pitch_angle;
183 iter->second.ground_plane[1] = cos(iter->second.pitch_angle);
184 iter->second.ground_plane[2] = -sin(iter->second.pitch_angle);
188 auto iter = name_camera_status_map_.find(sensor_name_);
189 AINFO <<
"camera_ground_height: " << iter->second.camera_ground_height
191 AINFO <<
"pitch_angle: " << iter->second.pitch_angle * 180.0 / M_PI
194 is_service_ready_ =
true;
198 if (frame ==
nullptr) {
199 AERROR <<
"frame is nullptr";
203 if (sensor_name_ == master_sensor_name_) {
207 std::make_shared<std::vector<base::LaneLine>>(frame->
lane_objects);
211 float pitch_angle = 0.f;
212 bool updated = calibrator_->Calibrate(calibrator_options, &pitch_angle);
215 name_camera_status_map_[master_sensor_name_].pitch_angle = pitch_angle;
216 for (
auto iter = name_camera_status_map_.begin();
217 iter != name_camera_status_map_.end(); iter++) {
219 iter->second.pitch_angle =
220 iter->second.pitch_angle_diff +
221 name_camera_status_map_[master_sensor_name_].pitch_angle;
223 iter->second.ground_plane[1] = cos(iter->second.pitch_angle);
224 iter->second.ground_plane[2] = -sin(iter->second.pitch_angle);
228 auto iter = name_camera_status_map_.find(sensor_name_);
229 AINFO <<
"camera_ground_height: " << iter->second.camera_ground_height
231 AINFO <<
"pitch_angle: " << iter->second.pitch_angle * 180.0 / M_PI
234 is_service_ready_ =
true;
238 const std::map<std::string, float> &name_camera_ground_height_map,
239 const std::map<std::string, float> &name_camera_pitch_angle_diff_map,
240 const float &pitch_angle_master_sensor) {
241 name_camera_status_map_[master_sensor_name_].pitch_angle =
242 pitch_angle_master_sensor;
243 for (
auto iter = name_camera_status_map_.begin();
244 iter != name_camera_status_map_.end(); ++iter) {
246 auto iter_ground_height = name_camera_ground_height_map.find(iter->first);
247 auto iter_pitch_angle_diff =
248 name_camera_pitch_angle_diff_map.find(iter->first);
249 ACHECK(iter_ground_height != name_camera_ground_height_map.end());
250 ACHECK(iter_pitch_angle_diff != name_camera_pitch_angle_diff_map.end());
252 name_camera_status_map_[iter->first].camera_ground_height =
253 iter_ground_height->second;
254 name_camera_status_map_[iter->first].pitch_angle_diff =
255 iter_pitch_angle_diff->second;
256 name_camera_status_map_[iter->first].pitch_angle =
257 pitch_angle_master_sensor + iter_pitch_angle_diff->second;
258 name_camera_status_map_[iter->first].ground_plane[1] =
259 cos(name_camera_status_map_[iter->first].pitch_angle);
260 name_camera_status_map_[iter->first].ground_plane[2] =
261 -sin(name_camera_status_map_[iter->first].pitch_angle);
262 name_camera_status_map_[iter->first].ground_plane[3] =
263 -name_camera_status_map_[iter->first].camera_ground_height;