30bool CameraDetectionBevComponent::InitDetector(
35 init_options.
config_path = plugin_param.config_path();
36 init_options.
config_file = plugin_param.config_file();
40 std::string camera_name = detection_param.
camera_name();
42 algorithm::SensorManager::Instance()->GetUndistortCameraModel(
44 ACHECK(model) <<
"Can't find " << camera_name
45 <<
" in data/conf/sensor_meta.pb.txt";
47 init_options.
intrinsic = pinhole->get_intrinsic_params();
50 image_height_ = model->get_height();
51 image_width_ = model->get_width();
55 BaseObstacleDetectorRegisterer::GetInstanceByName(plugin_param.name()));
56 detector_->Init(init_options);
60bool CameraDetectionBevComponent::InitCameraFrame(
71 frame_ptr_ = std::make_shared<CameraFrame>();
73 frame_ptr_->data_provider.resize(num);
74 for (
int i = 0; i < num; ++i) {
75 frame_ptr_->data_provider[i] = std::make_shared<DataProvider>();
76 frame_ptr_->data_provider[i]->Init(init_options);
81bool CameraDetectionBevComponent::InitListeners(
83 for (
const auto &channel :
85 std::shared_ptr<cyber::Reader<drivers::Image>> reader;
86 if (channel ==
"/apollo/sensor/camera/CAM_BACK/image") {
88 channel, [&](
const std::shared_ptr<drivers::Image> &msg) {
94 readers_.emplace_back(reader);
99bool CameraDetectionBevComponent::InitTransformWrapper(
103 trans_wrapper_->Init(detection_param.
frame_id());
110 AERROR <<
"Load camera detection 3d component config failed!";
115 InitDetector(detection_param);
116 InitCameraFrame(detection_param);
117 InitListeners(detection_param);
118 InitTransformWrapper(detection_param);
125void CameraDetectionBevComponent::CameraToWorldCoor(
126 const Eigen::Affine3d &camera2world, std::vector<base::ObjectPtr> *objs) {
127 for (
auto &obj : *objs) {
128 Eigen::Vector3d local_center =
129 obj->camera_supplement.local_center.cast<
double>();
130 obj->center = camera2world * local_center;
132 obj->direction = camera2world.linear().cast<
float>() * obj->direction;
133 obj->theta = std::atan2(obj->direction(1), obj->direction(0));
137int CameraDetectionBevComponent::ConvertObjectToPb(
139 if (!object_ptr || !pb_msg) {
142 pb_msg->set_id(object_ptr->track_id);
145 obj_center->set_x(object_ptr->center(0));
146 obj_center->set_y(object_ptr->center(1));
147 obj_center->set_z(object_ptr->center(2));
149 pb_msg->set_length(object_ptr->size(0));
150 pb_msg->set_width(object_ptr->size(1));
151 pb_msg->set_height(object_ptr->size(2));
153 pb_msg->set_theta(object_ptr->theta);
157 pb_msg->set_sub_type(
159 pb_msg->set_timestamp(object_ptr->latest_tracked_time);
161 pb_msg->set_height_above_ground(object_ptr->size(2));
166int CameraDetectionBevComponent::MakeProtobufMsg(
167 double msg_timestamp,
int seq_num,
168 const std::vector<base::ObjectPtr> &objects,
169 PerceptionObstacles *obstacles) {
171 auto header = obstacles->mutable_header();
172 header->set_timestamp_sec(publish_time);
173 header->set_module_name(
"perception_camera");
174 header->set_sequence_num(seq_num);
177 header->set_lidar_timestamp(
static_cast<uint64_t
>(msg_timestamp * 1e9));
178 header->set_camera_timestamp(
static_cast<uint64_t
>(msg_timestamp * 1e9));
182 for (
const auto &obj : objects) {
183 obj->track_id = count++;
185 if (ConvertObjectToPb(obj, obstacle) !=
cyber::SUCC) {
186 AERROR <<
"ConvertObjectToPb failed, Object:" << obj->ToString();
194bool CameraDetectionBevComponent::OnReceiveImage(
195 const std::shared_ptr<drivers::Image> &msg) {
196 const double msg_timestamp = msg->measurement_time() + timestamp_offset_;
198 for (
size_t i = 0; i < readers_.size(); ++i) {
199 readers_[i]->Observe();
200 const auto &camera_msg = readers_[i]->GetLatestObserved();
201 if (camera_msg ==
nullptr) {
204 frame_ptr_->data_provider[i]->FillImageData(
205 image_height_, image_width_,
206 reinterpret_cast<const uint8_t *
>(camera_msg->data().data()),
207 camera_msg->encoding());
210 frame_ptr_->timestamp = msg_timestamp;
211 ++frame_ptr_->frame_id;
214 detector_->Detect(frame_ptr_.get());
217 Eigen::Affine3d lidar2world_trans;
218 if (!trans_wrapper_->GetSensor2worldTrans(msg_timestamp,
219 &lidar2world_trans)) {
220 const std::string err_str =
221 absl::StrCat(
"failed to get camera to world pose, ts: ", msg_timestamp,
222 " camera_name: ", msg->frame_id());
226 CameraToWorldCoor(lidar2world_trans, &frame_ptr_->detected_objects);
228 std::shared_ptr<PerceptionObstacles> out_message(
new (std::nothrow)
230 if (MakeProtobufMsg(msg_timestamp, seq_num_, frame_ptr_->detected_objects,
232 AERROR <<
"MakeProtobufMsg failed ts: " << msg_timestamp;
237 writer_->Write(out_message);