Apollo 11.0
自动驾驶开放平台
frame.cc
浏览该文件的文档.
1/******************************************************************************
2 * Copyright 2017 The Apollo Authors. All Rights Reserved.
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *****************************************************************************/
16
21
22#include <algorithm>
23#include <limits>
24
25#include "absl/strings/str_cat.h"
26
27#include "modules/common_msgs/routing_msgs/routing.pb.h"
28
29#include "cyber/common/log.h"
30#include "cyber/time/clock.h"
42
43namespace apollo {
44namespace planning {
45
52
53PadMessage::DrivingAction Frame::pad_msg_driving_action_ = PadMessage::NONE;
54
56 : IndexedQueue<uint32_t, Frame>(FLAGS_max_frame_history_num) {}
57
58Frame::Frame(uint32_t sequence_num)
59 : sequence_num_(sequence_num),
60 monitor_logger_buffer_(common::monitor::MonitorMessageItem::PLANNING) {}
61
62Frame::Frame(uint32_t sequence_num, const LocalView &local_view,
63 const common::TrajectoryPoint &planning_start_point,
64 const common::VehicleState &vehicle_state,
65 ReferenceLineProvider *reference_line_provider)
66 : sequence_num_(sequence_num),
67 local_view_(local_view),
68 planning_start_point_(planning_start_point),
69 vehicle_state_(vehicle_state),
70 reference_line_provider_(reference_line_provider),
71 monitor_logger_buffer_(common::monitor::MonitorMessageItem::PLANNING) {}
72
73Frame::Frame(uint32_t sequence_num, const LocalView &local_view,
74 const common::TrajectoryPoint &planning_start_point,
75 const common::VehicleState &vehicle_state)
76 : Frame(sequence_num, local_view, planning_start_point, vehicle_state,
77 nullptr) {}
78
80 return planning_start_point_;
81}
82
84 return vehicle_state_;
85}
86
87bool Frame::Rerouting(PlanningContext *planning_context) {
88 if (FLAGS_use_navigation_mode) {
89 AERROR << "Rerouting not supported in navigation mode";
90 return false;
91 }
92 if (local_view_.planning_command == nullptr) {
93 AERROR << "No previous routing available";
94 return false;
95 }
96 if (!hdmap_) {
97 AERROR << "Invalid HD Map.";
98 return false;
99 }
100 auto *rerouting =
101 planning_context->mutable_planning_status()->mutable_rerouting();
102 rerouting->set_need_rerouting(true);
103 auto *lane_follow_command = rerouting->mutable_lane_follow_command();
104 if (future_route_waypoints_.size() < 1) {
105 AERROR << "Failed to find future waypoints";
106 return false;
107 }
108 for (size_t i = 0; i < future_route_waypoints_.size() - 1; i++) {
109 auto waypoint = lane_follow_command->add_way_point();
110 waypoint->set_x(future_route_waypoints_[i].pose().x());
111 waypoint->set_y(future_route_waypoints_[i].pose().y());
112 waypoint->set_heading(future_route_waypoints_[i].heading());
113 }
114 auto *end_pose = lane_follow_command->mutable_end_pose();
115 end_pose->set_x(future_route_waypoints_.back().pose().x());
116 end_pose->set_y(future_route_waypoints_.back().pose().y());
117 end_pose->set_heading(future_route_waypoints_.back().heading());
118
119 monitor_logger_buffer_.INFO("Planning send Rerouting request");
120 return true;
121}
122
123const std::list<ReferenceLineInfo> &Frame::reference_line_info() const {
124 return reference_line_info_;
125}
126
127std::list<ReferenceLineInfo> *Frame::mutable_reference_line_info() {
128 return &reference_line_info_;
129}
130
132 const std::map<std::string, uint32_t> &id_to_priority) {
133 for (const auto &pair : id_to_priority) {
134 const auto id = pair.first;
135 const auto priority = pair.second;
136 auto ref_line_info_itr =
137 std::find_if(reference_line_info_.begin(), reference_line_info_.end(),
138 [&id](const ReferenceLineInfo &ref_line_info) {
139 return ref_line_info.Lanes().Id() == id;
140 });
141 if (ref_line_info_itr != reference_line_info_.end()) {
142 ref_line_info_itr->SetPriority(priority);
143 }
144 }
145}
146
147bool Frame::CreateReferenceLineInfo(
148 const std::list<ReferenceLine> &reference_lines,
149 const std::list<hdmap::RouteSegments> &segments) {
150 reference_line_info_.clear();
151 if (reference_lines.empty()) {
152 return true;
153 }
154 auto ref_line_iter = reference_lines.begin();
155 auto segments_iter = segments.begin();
156 std::size_t ref_line_index = 0;
157 while (ref_line_iter != reference_lines.end()) {
158 if (segments_iter->StopForDestination()) {
159 is_near_destination_ = true;
160 }
161 reference_line_info_.emplace_back(vehicle_state_, planning_start_point_,
162 *ref_line_iter, *segments_iter);
163 reference_line_info_.back().set_index(ref_line_index);
164 ++ref_line_index;
165 ++ref_line_iter;
166 ++segments_iter;
167 }
168
169 if (reference_line_info_.size() == 2) {
170 common::math::Vec2d xy_point(vehicle_state_.x(), vehicle_state_.y());
171 common::SLPoint first_sl;
172 if (!reference_line_info_.front().reference_line().XYToSL(xy_point,
173 &first_sl)) {
174 return false;
175 }
176 common::SLPoint second_sl;
177 if (!reference_line_info_.back().reference_line().XYToSL(xy_point,
178 &second_sl)) {
179 return false;
180 }
181 const double offset = first_sl.l() - second_sl.l();
182 reference_line_info_.front().SetOffsetToOtherReferenceLine(offset);
183 reference_line_info_.back().SetOffsetToOtherReferenceLine(-offset);
184 }
185 double target_speed = FLAGS_default_cruise_speed;
186 if (local_view_.planning_command->has_target_speed()) {
187 target_speed = local_view_.planning_command->target_speed();
188 }
189 bool has_valid_reference_line = false;
190 ref_line_index = 0;
191 for (auto iter = reference_line_info_.begin();
192 iter != reference_line_info_.end();) {
193 if (!iter->Init(obstacles(), target_speed)) {
194 reference_line_info_.erase(iter++);
195 } else {
196 has_valid_reference_line = true;
197 iter->set_index(ref_line_index);
198 AINFO << "get referenceline: index: " << iter->index()
199 << ", id: " << iter->id() << ", key: " << iter->key();
200 ref_line_index++;
201 iter++;
202 }
203 }
204 if (!has_valid_reference_line) {
205 AINFO << "No valid reference line";
206 }
207 return true;
208}
209
215 ReferenceLineInfo *const reference_line_info,
216 const std::string &obstacle_id, const double obstacle_s,
217 double stop_wall_width) {
218 if (reference_line_info == nullptr) {
219 AERROR << "reference_line_info nullptr";
220 return nullptr;
221 }
222
223 const auto &reference_line = reference_line_info->reference_line();
224 const double box_center_s = obstacle_s + FLAGS_virtual_stop_wall_length / 2.0;
225 auto box_center = reference_line.GetReferencePoint(box_center_s);
226 double heading = reference_line.GetReferencePoint(obstacle_s).heading();
227 Box2d stop_wall_box{box_center, heading, FLAGS_virtual_stop_wall_length,
228 stop_wall_width};
229
230 return CreateStaticVirtualObstacle(obstacle_id, stop_wall_box);
231}
232
237const Obstacle *Frame::CreateStopObstacle(const std::string &obstacle_id,
238 const std::string &lane_id,
239 const double lane_s) {
240 if (!hdmap_) {
241 AERROR << "Invalid HD Map.";
242 return nullptr;
243 }
244 hdmap::LaneInfoConstPtr lane = nullptr;
245 if (nullptr == reference_line_provider_) {
246 lane = hdmap_->GetLaneById(hdmap::MakeMapId(lane_id));
247 } else {
248 lane = reference_line_provider_->GetLaneById(hdmap::MakeMapId(lane_id));
249 }
250
251 if (!lane) {
252 AERROR << "Failed to find lane[" << lane_id << "]";
253 return nullptr;
254 }
255
256 double dest_lane_s = std::max(0.0, lane_s);
257 auto dest_point = lane->GetSmoothPoint(dest_lane_s);
258
259 double lane_left_width = 0.0;
260 double lane_right_width = 0.0;
261 lane->GetWidth(dest_lane_s, &lane_left_width, &lane_right_width);
262
263 Box2d stop_wall_box{{dest_point.x(), dest_point.y()},
264 lane->Heading(dest_lane_s),
265 FLAGS_virtual_stop_wall_length,
266 lane_left_width + lane_right_width};
267
268 return CreateStaticVirtualObstacle(obstacle_id, stop_wall_box);
269}
270
275 ReferenceLineInfo *const reference_line_info,
276 const std::string &obstacle_id, const double obstacle_start_s,
277 const double obstacle_end_s) {
278 if (reference_line_info == nullptr) {
279 AERROR << "reference_line_info nullptr";
280 return nullptr;
281 }
282
283 const auto &reference_line = reference_line_info->reference_line();
284
285 // start_xy
286 common::SLPoint sl_point;
287 sl_point.set_s(obstacle_start_s);
288 sl_point.set_l(0.0);
289 common::math::Vec2d obstacle_start_xy;
290 if (!reference_line.SLToXY(sl_point, &obstacle_start_xy)) {
291 AERROR << "Failed to get start_xy from sl: " << sl_point.DebugString();
292 return nullptr;
293 }
294
295 // end_xy
296 sl_point.set_s(obstacle_end_s);
297 sl_point.set_l(0.0);
298 common::math::Vec2d obstacle_end_xy;
299 if (!reference_line.SLToXY(sl_point, &obstacle_end_xy)) {
300 AERROR << "Failed to get end_xy from sl: " << sl_point.DebugString();
301 return nullptr;
302 }
303
304 double left_lane_width = 0.0;
305 double right_lane_width = 0.0;
306 if (!reference_line.GetLaneWidth(obstacle_start_s, &left_lane_width,
307 &right_lane_width)) {
308 AERROR << "Failed to get lane width at s[" << obstacle_start_s << "]";
309 return nullptr;
310 }
311
312 common::math::Box2d obstacle_box{
313 common::math::LineSegment2d(obstacle_start_xy, obstacle_end_xy),
314 left_lane_width + right_lane_width};
315
316 return CreateStaticVirtualObstacle(obstacle_id, obstacle_box);
317}
318
319const Obstacle *Frame::CreateStaticVirtualObstacle(const std::string &id,
320 const Box2d &box) {
321 const auto *object = obstacles_.Find(id);
322 if (object) {
323 AWARN << "obstacle " << id << " already exist.";
324 return object;
325 }
326 auto *ptr =
327 obstacles_.Add(id, *Obstacle::CreateStaticVirtualObstacles(id, box));
328 if (!ptr) {
329 AERROR << "Failed to create virtual obstacle " << id;
330 }
331 return ptr;
332}
333
335 const common::VehicleStateProvider *vehicle_state_provider,
336 const std::list<ReferenceLine> &reference_lines,
337 const std::list<hdmap::RouteSegments> &segments,
338 const std::vector<routing::LaneWaypoint> &future_route_waypoints,
339 const EgoInfo *ego_info) {
340 // TODO(QiL): refactor this to avoid redundant nullptr checks in scenarios.
341 auto status = InitFrameData(vehicle_state_provider, ego_info);
342 if (!status.ok()) {
343 AERROR << "failed to init frame:" << status.ToString();
344 return status;
345 }
346 if (!CreateReferenceLineInfo(reference_lines, segments)) {
347 const std::string msg = "Failed to init reference line info.";
348 AERROR << msg;
349 return Status(ErrorCode::PLANNING_ERROR, msg);
350 }
351 future_route_waypoints_ = future_route_waypoints;
352 for (auto &reference_line_info : reference_line_info_) {
353 reference_line_info.PrintReferenceSegmentDebugString();
354 }
355 return Status::OK();
356}
357
359 const common::VehicleStateProvider *vehicle_state_provider,
360 const EgoInfo *ego_info) {
361 return InitFrameData(vehicle_state_provider, ego_info);
362}
363
364Status Frame::InitFrameData(
365 const common::VehicleStateProvider *vehicle_state_provider,
366 const EgoInfo *ego_info) {
368 CHECK_NOTNULL(hdmap_);
369 vehicle_state_ = vehicle_state_provider->vehicle_state();
370 if (!util::IsVehicleStateValid(vehicle_state_)) {
371 AERROR << "Adc init point is not set";
372 return Status(ErrorCode::PLANNING_ERROR, "Adc init point is not set");
373 }
374 ADEBUG << "Enabled align prediction time ? : " << std::boolalpha
375 << FLAGS_align_prediction_time;
376
377 if (FLAGS_align_prediction_time) {
378 auto prediction = *(local_view_.prediction_obstacles);
379 AlignPredictionTime(vehicle_state_.timestamp(), &prediction);
380 local_view_.prediction_obstacles->CopyFrom(prediction);
381 }
382 for (auto &ptr :
383 Obstacle::CreateObstacles(*local_view_.prediction_obstacles)) {
384 AddObstacle(*ptr);
385 }
386 if (planning_start_point_.v() < 1e-3) {
387 const auto *collision_obstacle = FindCollisionObstacle(ego_info);
388 if (collision_obstacle != nullptr) {
389 const std::string msg = absl::StrCat("Found collision with obstacle: ",
390 collision_obstacle->Id());
391 AERROR << msg;
392 monitor_logger_buffer_.ERROR(msg);
393 return Status(ErrorCode::PLANNING_ERROR, msg);
394 }
395 }
396
397 ReadTrafficLights();
398
399 ReadPadMsgDrivingAction();
400
401 return Status::OK();
402}
403
404const Obstacle *Frame::FindCollisionObstacle(const EgoInfo *ego_info) const {
405 if (obstacles_.Items().empty()) {
406 return nullptr;
407 }
408
409 const auto &adc_polygon = Polygon2d(ego_info->ego_box());
410 for (const auto &obstacle : obstacles_.Items()) {
411 if (obstacle->IsVirtual()) {
412 continue;
413 }
414
415 const auto &obstacle_polygon = obstacle->PerceptionPolygon();
416 if (obstacle_polygon.HasOverlap(adc_polygon)) {
417 return obstacle;
418 }
419 }
420 return nullptr;
421}
422
423uint32_t Frame::SequenceNum() const { return sequence_num_; }
424
425std::string Frame::DebugString() const {
426 return absl::StrCat("Frame: ", sequence_num_);
427}
428
430 if (!debug) {
431 ADEBUG << "Skip record input into debug";
432 return;
433 }
434 auto *planning_debug_data = debug->mutable_planning_data();
435 auto *adc_position = planning_debug_data->mutable_adc_position();
436 adc_position->CopyFrom(*local_view_.localization_estimate);
437
438 auto debug_chassis = planning_debug_data->mutable_chassis();
439 debug_chassis->CopyFrom(*local_view_.chassis);
440
441 if (!FLAGS_use_navigation_mode) {
442 auto debug_routing = planning_debug_data->mutable_routing();
443 debug_routing->CopyFrom(
444 local_view_.planning_command->lane_follow_command());
445 }
446
447 planning_debug_data->mutable_prediction_header()->CopyFrom(
448 local_view_.prediction_obstacles->header());
449 /*
450 auto relative_map = AdapterManager::GetRelativeMap();
451 if (!relative_map->Empty()) {
452 planning_debug_data->mutable_relative_map()->mutable_header()->CopyFrom(
453 relative_map->GetLatestObserved().header());
454 }
455 */
456}
457
458void Frame::AlignPredictionTime(const double planning_start_time,
459 PredictionObstacles *prediction_obstacles) {
460 if (!prediction_obstacles || !prediction_obstacles->has_header() ||
461 !prediction_obstacles->header().has_timestamp_sec()) {
462 return;
463 }
464 double prediction_header_time =
465 prediction_obstacles->header().timestamp_sec();
466 for (auto &obstacle : *prediction_obstacles->mutable_prediction_obstacle()) {
467 for (auto &trajectory : *obstacle.mutable_trajectory()) {
468 for (auto &point : *trajectory.mutable_trajectory_point()) {
469 point.set_relative_time(prediction_header_time + point.relative_time() -
470 planning_start_time);
471 }
472 if (!trajectory.trajectory_point().empty() &&
473 trajectory.trajectory_point().begin()->relative_time() < 0) {
474 auto it = trajectory.trajectory_point().begin();
475 while (it != trajectory.trajectory_point().end() &&
476 it->relative_time() < 0) {
477 ++it;
478 }
479 trajectory.mutable_trajectory_point()->erase(
480 trajectory.trajectory_point().begin(), it);
481 }
482 }
483 }
484}
485
486Obstacle *Frame::Find(const std::string &id) { return obstacles_.Find(id); }
487
488void Frame::AddObstacle(const Obstacle &obstacle) {
489 obstacles_.Add(obstacle.Id(), obstacle);
490}
491
492void Frame::ReadTrafficLights() {
493 traffic_lights_.clear();
494
495 const auto traffic_light_detection = local_view_.traffic_light;
496 if (traffic_light_detection == nullptr) {
497 return;
498 }
499 const double delay =
500 traffic_light_detection->header().timestamp_sec() - Clock::NowInSeconds();
501 if (delay > FLAGS_signal_expire_time_sec) {
502 ADEBUG << "traffic signals msg is expired, delay = " << delay
503 << " seconds.";
504 return;
505 }
506 for (const auto &traffic_light : traffic_light_detection->traffic_light()) {
507 traffic_lights_[traffic_light.id()] = &traffic_light;
508 }
509}
510
512 const std::string &traffic_light_id) const {
513 const auto *result =
514 apollo::common::util::FindPtrOrNull(traffic_lights_, traffic_light_id);
515 if (result == nullptr) {
516 perception::TrafficLight traffic_light;
517 traffic_light.set_id(traffic_light_id);
518 traffic_light.set_color(perception::TrafficLight::UNKNOWN);
519 traffic_light.set_confidence(0.0);
520 traffic_light.set_tracking_time(0.0);
521 return traffic_light;
522 }
523 return *result;
524}
525
526void Frame::ReadPadMsgDrivingAction() {
527 if (local_view_.pad_msg) {
528 if (local_view_.pad_msg->has_action()) {
529 pad_msg_driving_action_ = local_view_.pad_msg->action();
530 }
531 }
532}
533
534void Frame::ResetPadMsgDrivingAction() {
535 pad_msg_driving_action_ = PadMessage::NONE;
536}
537
539 double min_cost = std::numeric_limits<double>::infinity();
540 drive_reference_line_info_ = nullptr;
541 for (const auto &reference_line_info : reference_line_info_) {
542 if (reference_line_info.IsDrivable() &&
543 reference_line_info.Cost() < min_cost) {
544 drive_reference_line_info_ = &reference_line_info;
545 min_cost = reference_line_info.Cost();
546 }
547 }
548 return drive_reference_line_info_;
549}
550
552 const ReferenceLineInfo *target_reference_line_info = nullptr;
553 for (const auto &reference_line_info : reference_line_info_) {
554 if (reference_line_info.IsChangeLanePath()) {
555 return &reference_line_info;
556 }
557 target_reference_line_info = &reference_line_info;
558 }
559 return target_reference_line_info;
560}
561
563 for (const auto &reference_line_info : reference_line_info_) {
564 // Find the unsuccessful lane-change path
565 if (!reference_line_info.IsDrivable() &&
566 reference_line_info.IsChangeLanePath()) {
567 return &reference_line_info;
568 }
569 }
570 return nullptr;
571}
572
574 return drive_reference_line_info_;
575}
576
577const std::vector<const Obstacle *> Frame::obstacles() const {
578 return obstacles_.Items();
579}
580
581} // namespace planning
582} // namespace apollo
A general class to denote the return status of an API call.
Definition status.h:43
static Status OK()
generate a success status.
Definition status.h:60
Rectangular (undirected) bounding box in 2-D.
Definition box2d.h:52
The class of polygon in 2-D.
Definition polygon2d.h:42
Implements a class of 2-dimensional vectors.
Definition vec2d.h:42
a singleton clock that can be used to get the current timestamp.
Definition clock.h:39
static double NowInSeconds()
gets the current time in second.
Definition clock.cc:56
static const HDMap * BaseMapPtr()
LaneInfoConstPtr GetLaneById(const Id &id) const
Definition hdmap.cc:34
Frame holds all data for one planning cycle.
Definition frame.h:62
const std::vector< const Obstacle * > obstacles() const
Definition frame.cc:577
static void AlignPredictionTime(const double planning_start_time, prediction::PredictionObstacles *prediction_obstacles)
Definition frame.cc:458
uint32_t SequenceNum() const
Definition frame.cc:423
Frame(uint32_t sequence_num)
Definition frame.cc:58
const common::VehicleState & vehicle_state() const
Definition frame.cc:83
const Obstacle * CreateStaticObstacle(ReferenceLineInfo *const reference_line_info, const std::string &obstacle_id, const double obstacle_start_s, const double obstacle_end_s)
: create static virtual object with lane width,
Definition frame.cc:274
common::Status Init(const common::VehicleStateProvider *vehicle_state_provider, const std::list< ReferenceLine > &reference_lines, const std::list< hdmap::RouteSegments > &segments, const std::vector< routing::LaneWaypoint > &future_route_waypoints, const EgoInfo *ego_info)
Definition frame.cc:334
void UpdateReferenceLinePriority(const std::map< std::string, uint32_t > &id_to_priority)
Adjust reference line priority according to actual road conditions @id_to_priority lane id and refere...
Definition frame.cc:131
const ReferenceLineInfo * FindDriveReferenceLineInfo()
Definition frame.cc:538
perception::TrafficLight GetSignal(const std::string &traffic_light_id) const
Definition frame.cc:511
std::string DebugString() const
Definition frame.cc:425
Obstacle * Find(const std::string &id)
Definition frame.cc:486
bool Rerouting(PlanningContext *planning_context)
Definition frame.cc:87
void RecordInputDebug(planning_internal::Debug *debug)
Definition frame.cc:429
const ReferenceLineInfo * FindFailedReferenceLineInfo()
Definition frame.cc:562
common::Status InitForOpenSpace(const common::VehicleStateProvider *vehicle_state_provider, const EgoInfo *ego_info)
Definition frame.cc:358
const ReferenceLineInfo * DriveReferenceLineInfo() const
Definition frame.cc:573
const std::list< ReferenceLineInfo > & reference_line_info() const
Definition frame.cc:123
const Obstacle * CreateStopObstacle(ReferenceLineInfo *const reference_line_info, const std::string &obstacle_id, const double obstacle_s, double stop_wall_width=4.0)
: create static virtual object with lane width, mainly used for virtual stop wall
Definition frame.cc:214
std::list< ReferenceLineInfo > * mutable_reference_line_info()
Definition frame.cc:127
const ReferenceLineInfo * FindTargetReferenceLineInfo()
Definition frame.cc:551
const common::TrajectoryPoint & PlanningStartPoint() const
Definition frame.cc:79
This is the class that associates an Obstacle with its path properties.
Definition obstacle.h:62
const std::string & Id() const
Definition obstacle.h:75
static std::unique_ptr< Obstacle > CreateStaticVirtualObstacles(const std::string &id, const common::math::Box2d &obstacle_box)
Definition obstacle.cc:244
PlanningStatus * mutable_planning_status()
ReferenceLineInfo holds all data for one reference line.
The class of ReferenceLineProvider.
hdmap::LaneInfoConstPtr GetLaneById(const hdmap::Id &id) const
T * Add(const I id, const T &object)
std::vector< const T * > Items() const
Planning module main class.
#define ADEBUG
Definition log.h:41
#define AERROR
Definition log.h:44
#define AINFO
Definition log.h:42
#define AWARN
Definition log.h:43
apollo::hdmap::Id MakeMapId(const std::string &id)
create a Map ID given a string.
Definition hdmap_util.h:85
std::shared_ptr< const LaneInfo > LaneInfoConstPtr
bool IsVehicleStateValid(const VehicleState &vehicle_state)
Definition util.cc:35
class register implement
Definition arena_queue.h:37
Declaration of the class ReferenceLineProvider.
optional double timestamp_sec
Definition header.proto:9
std::shared_ptr< PadMessage > pad_msg
Definition local_view.h:46
std::shared_ptr< localization::LocalizationEstimate > localization_estimate
Definition local_view.h:43
std::shared_ptr< PlanningCommand > planning_command
Definition local_view.h:48
std::shared_ptr< prediction::PredictionObstacles > prediction_obstacles
Definition local_view.h:41
std::shared_ptr< canbus::Chassis > chassis
Definition local_view.h:42
std::shared_ptr< perception::TrafficLightDetection > traffic_light
Definition local_view.h:44
LocalView contains all necessary data as planning input
Defines the Vec2d class.