29uint32_t MultiSensorFusionComponent::s_seq_num_ = 0;
30std::mutex MultiSensorFusionComponent::s_mutex_;
37 AINFO <<
"Fusion Component Configs: " << comp_config.DebugString();
44 ACHECK(InitAlgorithmPlugin(comp_config))
45 <<
"Failed to init algorithm plugin.";
52 algorithm::SensorManager::Instance()->Init();
57 const std::shared_ptr<SensorFrameMessage>& message) {
62 std::shared_ptr<PerceptionObstacles> out_message(
new (std::nothrow)
64 std::shared_ptr<SensorFrameMessage> viz_message(
new (std::nothrow)
66 bool status = InternalProc(message, out_message, viz_message);
70 algorithm::SensorManager::Instance()->IsMainSensor(message->sensor_id_);
72 writer_->Write(out_message);
73 AINFO <<
"Send fusion processing output message.";
75 if (onboard::FLAGS_obs_enable_visualization) {
76 inner_writer_->Write(viz_message);
79 AINFO <<
"Fusion receive from " << message->sensor_id_
80 <<
". Skip because it is not the main sensor.";
86bool MultiSensorFusionComponent::InitAlgorithmPlugin(
90 init_options.
config_path = fusion_param.config_path();
91 init_options.
config_file = fusion_param.config_file();
93 BaseFusionSystemRegisterer::GetInstanceByName(fusion_param.name());
94 CHECK_NOTNULL(fusion);
95 fusion_.reset(fusion);
96 ACHECK(fusion_->Init(init_options)) <<
"Failed to init ProbabilisticFusion";
98 if (onboard::FLAGS_obs_enable_hdmap_input && object_in_roi_check_) {
99 hdmap_input_ = map::HDMapInput::Instance();
100 ACHECK(hdmap_input_->
Init()) <<
"Failed to init hdmap input.";
102 AINFO <<
"Init algorithm successfully, onboard fusion: "
103 << fusion_param.name();
107bool MultiSensorFusionComponent::InternalProc(
108 const std::shared_ptr<SensorFrameMessage const>& in_message,
109 std::shared_ptr<PerceptionObstacles> out_message,
110 std::shared_ptr<SensorFrameMessage> viz_message) {
112 std::unique_lock<std::mutex> lock(s_mutex_);
117 const
double timestamp = in_message->timestamp_;
118 const uint64_t lidar_timestamp = in_message->lidar_timestamp_;
119 std::vector<base::ObjectPtr> valid_objects;
120 if (in_message->error_code_ !=
apollo::common::ErrorCode::OK) {
122 timestamp, lidar_timestamp, in_message->seq_num_, valid_objects,
123 in_message->error_code_, out_message.get())) {
124 AERROR <<
"Failed to gen PerceptionObstacles object.";
127 if (onboard::FLAGS_obs_enable_visualization) {
129 viz_message->error_code_ = in_message->error_code_;
131 AERROR <<
"Fusion receive message with error code, skip it.";
135 frame->timestamp = in_message->timestamp_;
137 std::vector<base::ObjectPtr> fused_objects;
138 if (!fusion_->Fuse(frame, &fused_objects)) {
139 AERROR <<
"Failed to call fusion plugin.";
144 bool is_main_sensor = algorithm::SensorManager::Instance()->IsMainSensor(
145 in_message->sensor_id_);
146 if (!is_main_sensor) {
151 Eigen::Matrix4d sensor2world_pose =
152 in_message->frame_->sensor2world_pose.matrix();
153 if (object_in_roi_check_ && onboard::FLAGS_obs_enable_hdmap_input) {
158 position.x = sensor2world_pose(0, 3);
159 position.y = sensor2world_pose(1, 3);
160 position.z = sensor2world_pose(2, 3);
165 valid_objects.assign(fused_objects.begin(), fused_objects.end());
167 valid_objects.assign(fused_objects.begin(), fused_objects.end());
170 valid_objects.assign(fused_objects.begin(), fused_objects.end());
176 if (onboard::FLAGS_obs_enable_visualization) {
177 viz_message->timestamp_ = in_message->timestamp_;
178 viz_message->seq_num_ = in_message->seq_num_;
179 viz_message->frame_ = base::FramePool::Instance().Get();
180 viz_message->frame_->sensor2world_pose =
181 in_message->frame_->sensor2world_pose;
182 viz_message->sensor_id_ = in_message->sensor_id_;
183 viz_message->hdmap_ = in_message->hdmap_;
185 viz_message->error_code_ = in_message->error_code_;
186 viz_message->frame_->objects = fused_objects;
191 in_message->seq_num_, valid_objects,
192 error_code, out_message.get())) {
193 AERROR <<
"Failed to gen PerceptionObstacles object.";
199 const double latency = (cur_time -
timestamp) * 1e3;
200 AINFO << std::setprecision(16) <<
"FRAME_STATISTICS:Obstacle:End:msg_time["
201 <<
timestamp <<
"]:cur_time[" << cur_time <<
"]:cur_latency[" << latency
202 <<
"]:obj_cnt[" << valid_objects.size() <<
"]";
203 AINFO <<
"publish_number: " << valid_objects.size() <<
" obj";
static double NowInSeconds()
gets the current time in second.
bool GetProtoConfig(T *config) const
std::shared_ptr< Node > node_
bool Proc(const std::shared_ptr< SensorFrameMessage > &message) override
static bool SerializeMsg(double timestamp, uint64_t lidar_timestamp, int seq_num, const std::vector< base::ObjectPtr > &objects, const apollo::common::ErrorCode &error_code, PerceptionObstacles *obstacles)
std::shared_ptr< HdmapStruct > HdmapStructPtr
std::shared_ptr< Frame > FramePtr
#define PERF_FUNCTION(...)
optional double radius_for_roi_object_check
optional perception::PluginParam fusion_param
optional string output_viz_fused_content_channel_name
optional string output_obstacles_channel_name
optional bool object_in_roi_check