150 {
152
155
156
157 std::vector<apollo::drivers::Esr_trackmotionpower_540::Motionpower>
158 motionpowers(64);
159 for (const auto& esr_trackmotionpower_540 :
160 delphi_esr.esr_trackmotionpower_540()) {
161 if (!esr_trackmotionpower_540.has_can_tx_track_can_id_group()) {
162 AERROR <<
"ESR track motion power 540 does not have "
163 "can_tx_track_can_id_group()";
164 continue;
165 }
166 const int can_tx_track_can_id_group =
167 esr_trackmotionpower_540.can_tx_track_can_id_group();
168 const int can_tx_track_motion_power_size =
169 esr_trackmotionpower_540.can_tx_track_motion_power_size();
170 for (int index = 0; index < (can_tx_track_can_id_group < 9 ? 7 : 1) &&
171 index < can_tx_track_motion_power_size;
172 ++index) {
173 std::size_t motion_powers_index = can_tx_track_can_id_group * 7 + index;
174 if (motion_powers_index < motionpowers.size()) {
175 motionpowers[motion_powers_index].CopyFrom(
176 esr_trackmotionpower_540.can_tx_track_motion_power(index));
177 }
178 }
179 }
180
185
186 for (int index = 0; index < delphi_esr.esr_track01_500_size() &&
187 index < static_cast<int>(motionpowers.size());
188 ++index) {
190
191
192 if (data_500.can_tx_track_status() ==
194 continue;
195 }
196
197 RadarObstacle rob;
198
199 rob.set_id(index);
200 rob.set_rcs(static_cast<double>(motionpowers[index].can_tx_track_power()) -
201 10.0);
204 rob.set_height(3.0);
205
207 const double angle = data_500.can_tx_track_angle() * M_PI / 180.0;
208 Point relative_pos_sl;
209 relative_pos_sl.set_x(range * std::cos(angle) +
210 FLAGS_radar_pos_adjust +
211 rob.length() /
212 2.0);
213 relative_pos_sl.set_y(range * std::sin(angle));
214 rob.mutable_relative_position()->CopyFrom(relative_pos_sl);
215
216 Point relative_pos_xy =
SLtoXY(relative_pos_sl, adc_theta);
218 absolute_pos.set_x(adc_pos.x() + relative_pos_xy.x());
219 absolute_pos.set_y(adc_pos.y() + relative_pos_xy.y());
220 absolute_pos.set_z(adc_pos.z());
221 rob.mutable_absolute_position()->CopyFrom(absolute_pos);
222
224 rob.set_theta(theta);
225
226 const double range_vel = data_500.can_tx_track_range_rate();
227 const double lateral_vel = data_500.can_tx_track_lat_rate();
228 rob.mutable_relative_velocity()->set_x(range_vel * std::cos(angle) -
229 lateral_vel * std::sin(angle));
230 rob.mutable_relative_velocity()->set_y(range_vel * std::sin(angle) +
231 lateral_vel * std::cos(angle));
232
233 const auto iter = last_radar_obstacles.
radar_obstacle().find(index);
236 rob.set_count(0);
237 rob.set_movable(false);
238 rob.set_moving_frames_count(0);
239 absolute_vel.set_x(0.0);
240 absolute_vel.set_y(0.0);
241 absolute_vel.set_z(0.0);
242 } else {
243 rob.set_count(iter->second.count() + 1);
244 rob.set_movable(iter->second.movable());
245 absolute_vel.set_x(
246 (absolute_pos.x() - iter->second.absolute_position().x()) /
247 (current_timestamp - last_timestamp));
248 absolute_vel.set_y(
249 (absolute_pos.y() - iter->second.absolute_position().y()) /
250 (current_timestamp - last_timestamp));
251 absolute_vel.set_z(0.0);
252 double v_heading = std::atan2(absolute_vel.y(), absolute_vel.x());
254 if (heading_diff < FLAGS_movable_heading_threshold &&
255 Speed(absolute_vel) * std::cos(heading_diff) >
256 FLAGS_movable_speed_threshold) {
257 rob.set_moving_frames_count(iter->second.moving_frames_count() + 1);
258 } else {
259 rob.set_moving_frames_count(0);
260 }
261 }
262
263 rob.mutable_absolute_velocity()->CopyFrom(absolute_vel);
264
265 if (rob.moving_frames_count() >= FLAGS_movable_frames_count_threshold) {
266 rob.set_movable(true);
267 }
268 (*obstacles.mutable_radar_obstacle())[index] = rob;
269 }
270
271 obstacles.mutable_header()->CopyFrom(delphi_esr.
header());
272 return obstacles;
273}
apollo::common::Point3D Point
double GetNearestLaneHeading(const PointENU &point_enu)
optional apollo::common::Header header
repeated Esr_track01_500 esr_track01_500
@ CAN_TX_TRACK_STATUS_NO_TARGET
optional double can_tx_track_range