34 AINFO <<
"Radar component config: " << comp_config.DebugString();
41 if (!algorithm::SensorManager::Instance()->GetSensorInfo(
43 AERROR <<
"Failed to get sensor info, sensor name: "
52 ACHECK(InitAlgorithmPlugin(comp_config))
53 <<
"Failed to init algorithm plugin.";
55 radar2world_trans_.
Init(tf_child_frame_id_);
56 radar2novatel_trans_.
Init(tf_child_frame_id_);
57 localization_subscriber_.Init(
58 odometry_channel_name_,
59 odometry_channel_name_ +
'_' + comp_config.
radar_name());
64 AINFO <<
"Enter radar preprocess, message timestamp: "
65 << message->header().timestamp_sec() <<
" current timestamp "
67 auto out_message = std::make_shared<onboard::SensorFrameMessage>();
69 if (!InternalProc(message, out_message)) {
72 writer_->Write(out_message);
76bool RadarDetectionComponent::InitAlgorithmPlugin(
78 if (onboard::FLAGS_obs_enable_hdmap_input) {
79 hdmap_input_ = map::HDMapInput::Instance();
80 ACHECK(hdmap_input_->
Init()) <<
"Failed to init hdmap input.";
84 PreprocessorInitOptions preprocessor_init_options;
85 preprocessor_init_options.
config_path = preprocessor_param.config_path();
86 preprocessor_init_options.config_file = preprocessor_param.config_file();
87 BasePreprocessor* radar_preprocessor =
88 BasePreprocessorRegisterer::GetInstanceByName(preprocessor_param.name());
89 CHECK_NOTNULL(radar_preprocessor);
90 radar_preprocessor_.reset(radar_preprocessor);
91 ACHECK(radar_preprocessor_->Init(preprocessor_init_options))
92 <<
"Failed to init radar preprocessor.";
95 PerceptionInitOptions perception_init_options;
96 perception_init_options.
config_path = perception_param.config_path();
97 perception_init_options.config_file = perception_param.config_file();
98 BaseRadarObstaclePerception* radar_perception =
99 BaseRadarObstaclePerceptionRegisterer::GetInstanceByName(
100 perception_param.name());
101 CHECK_NOTNULL(radar_perception);
102 radar_perception_.reset(radar_perception);
103 ACHECK(radar_perception_->Init(perception_init_options))
104 <<
"Failed to init radar perception.";
108bool RadarDetectionComponent::InternalProc(
109 const std::shared_ptr<ContiRadar>& in_message,
110 std::shared_ptr<onboard::SensorFrameMessage> out_message) {
112 ContiRadar raw_obstacles = *in_message;
114 std::unique_lock<std::mutex> lock(_mutex);
117 double timestamp = in_message->header().timestamp_sec();
120 PreprocessorOptions preprocessor_options;
121 ContiRadar corrected_obstacles;
122 radar_preprocessor_->Preprocess(raw_obstacles, preprocessor_options,
123 &corrected_obstacles);
125 timestamp = corrected_obstacles.header().timestamp_sec();
127 out_message->timestamp_ = timestamp;
128 out_message->seq_num_ = seq_num_;
129 out_message->process_stage_ =
131 out_message->sensor_id_ = radar_info_.
name;
134 RadarPerceptionOptions options;
135 options.sensor_name = radar_info_.
name;
137 Eigen::Affine3d radar_trans;
140 AERROR <<
"Failed to get pose at time: " << timestamp;
143 Eigen::Affine3d radar2novatel_trans;
144 if (!radar2novatel_trans_.
GetTrans(timestamp, &radar2novatel_trans,
"novatel",
145 tf_child_frame_id_)) {
151 Eigen::Matrix4d radar2world_pose = radar_trans.matrix();
152 options.detector_options.radar2world_pose = &radar2world_pose;
153 Eigen::Matrix4d radar2novatel_trans_m = radar2novatel_trans.matrix();
154 options.detector_options.radar2novatel_trans = &radar2novatel_trans_m;
155 if (!GetCarLocalizationSpeed(timestamp,
156 &(options.detector_options.car_linear_speed),
157 &(options.detector_options.car_angular_speed))) {
164 position.x = radar_trans(0, 3);
165 position.y = radar_trans(1, 3);
166 position.z = radar_trans(2, 3);
167 options.roi_filter_options.roi.reset(
new base::HdmapStruct());
168 if (onboard::FLAGS_obs_enable_hdmap_input) {
170 options.roi_filter_options.roi);
174 std::vector<base::ObjectPtr> radar_objects;
175 if (!radar_perception_->Perceive(corrected_obstacles, options,
177 out_message->error_code_ =
179 AERROR <<
"RadarDetector Proc failed.";
182 out_message->frame_.reset(
new base::Frame());
183 out_message->frame_->sensor_info = radar_info_;
184 out_message->frame_->timestamp =
timestamp;
185 out_message->frame_->sensor2world_pose = radar_trans;
186 out_message->frame_->objects = radar_objects;
192bool RadarDetectionComponent::GetCarLocalizationSpeed(
193 double timestamp, Eigen::Vector3f* car_linear_speed,
194 Eigen::Vector3f* car_angular_speed) {
195 if (car_linear_speed ==
nullptr) {
196 AERROR <<
"car_linear_speed is not available";
199 (*car_linear_speed) = Eigen::Vector3f::Zero();
201 if (car_angular_speed ==
nullptr) {
202 AERROR <<
"car_angular_speed is not available";
205 (*car_angular_speed) = Eigen::Vector3f::Zero();
206 std::shared_ptr<LocalizationEstimate const> loct_ptr;
207 if (!localization_subscriber_.LookupNearest(timestamp, &loct_ptr)) {
208 AERROR <<
"Cannot get car speed.";
211 (*car_linear_speed)[0] =
212 static_cast<float>(loct_ptr->pose().linear_velocity().x());
213 (*car_linear_speed)[1] =
214 static_cast<float>(loct_ptr->pose().linear_velocity().y());
215 (*car_linear_speed)[2] =
216 static_cast<float>(loct_ptr->pose().linear_velocity().z());
217 (*car_angular_speed)[0] =
218 static_cast<float>(loct_ptr->pose().angular_velocity().x());
219 (*car_angular_speed)[1] =
220 static_cast<float>(loct_ptr->pose().angular_velocity().y());
221 (*car_angular_speed)[2] =
222 static_cast<float>(loct_ptr->pose().angular_velocity().z());
a singleton clock that can be used to get the current timestamp.
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< ContiRadar > &message) override
@ PERCEPTION_ERROR_PROCESS
@ LONG_RANGE_RADAR_DETECTION
#define PERF_BLOCK_END_WITH_INDICATOR(indicator, msg)
#define PERF_FUNCTION_WITH_INDICATOR(indicator)
#define PERF_BLOCK_START()
optional string config_path
optional perception::PluginParam preprocessor_param
optional perception::PluginParam perception_param
optional string odometry_channel_name
optional string radar_name
optional string tf_child_frame_id
optional double radar_forward_distance
optional string output_channel_name