- 在ReferenceLine之外,在common目录下还有一个结构:ReferenceLineInfo,ReferenceLineInfo用于存储参考线信息。ReferenceLineInfo结构才是各个模块实际用到数据结构,它其中包含了ReferenceLine,但还有其他更详细的数据。
- 所谓的参考线其实是一条驾驶路径,因此参考线信息实际上就是一条驾驶路径所需的各种信息,包括车辆状态,当前轨迹点,路径数据,速度数据…
- 定义在/planning/common/reference_line_info.h
成员变量
数据类型 | 成员变量名 | 说明 |
---|---|---|
static std::unordered_map<std::string, bool> | junction_right_of_way_map_; |
|
const common::VehicleState | vehicle_state_; |
|
const common::TrajectoryPoint | adc_planning_point_; |
|
ReferenceLine | reference_line_; |
|
double | cost_ = 0.0; |
|
bool | is_drivable_ = true; |
|
PathDecision | path_decision_; |
|
Obstacle* | blocking_obstacle_; |
|
std::vector< PathBoundary> | candidate_path_boundaries_; |
|
std::vector< PathData> | candidate_path_data_; |
|
PathData | path_data_; |
|
PathData | fallback_path_data_; |
|
SpeedData | speed_data_; |
|
DiscretizedTrajectory | discretized_trajectory_; |
|
RSSInfo | rss_info_; |
|
SLBoundary | adc_sl_boundary_; |
|
planning_internal::Debug | debug_; |
|
LatencyStats | latency_stats_; |
|
hdmap::RouteSegments | lanes_; |
|
bool | is_on_reference_line_ = false; |
|
bool | is_path_lane_borrow_ = false; |
|
ADCTrajectory::RightOfWayStatus | status_ = ADCTrajectory::UNPROTECTED; |
|
double | offset_to_other_reference_line_ = 0.0; |
|
double | priority_cost_ = 0.0; |
|
PlanningTarget | planning_target_; |
|
ADCTrajectory::TrajectoryType | trajectory_type_ = ADCTrajectory::UNKNOWN; |
|
std::vector<std::pair<OverlapType, hdmap::PathOverlap>> | first_encounter_overlaps_; |
|
StGraphData | st_graph_data_; |
|
common::VehicleSignal | vehicle_signal_; |
|
double | cruise_speed_ = 0.0; |
|
bool | path_reusable_ = false; |
|
成员函数
该类主要包含以下重要成员函数:AddObstacles、IsStartFrom、IsChangeLanePath、CombinePathAndSpeedProfile、ExportTurnSignal、ExportDecision、ReachedDestination,其他函数是辅助函数
AddObstacles
- 作用:在当前参考线中加入障碍,让参考线更加接近实际的驾驶路径
调用入口
创建ReferenceLineInfo:Frame::CreateReferenceLineInfo
- ReferenceLineInfo由Frame根据ReferenceLine和RouteSegments创建得到。
- 在每个Planning计算循环的开始,都会创建和初始化一个新的Frame,而Frame初始化的时候就会创建ReferenceLineInfo。当有多个ReferenceLine的时候,则意味着需要变道。
bool Frame::CreateReferenceLineInfo(
const std::list<ReferenceLine> &reference_lines,
const std::list<hdmap::RouteSegments> &segments) {
reference_line_info_.clear();
auto ref_line_iter = reference_lines.begin();
auto segments_iter = segments.begin();
while (ref_line_iter != reference_lines.end()) {
if (segments_iter->StopForDestination()) {
is_near_destination_ = true;
}
reference_line_info_.emplace_back(vehicle_state_, planning_start_point_,
*ref_line_iter, *segments_iter);
++ref_line_iter;
++segments_iter;
}
if (FLAGS_enable_change_lane_decider &&
!change_lane_decider_.Apply(&reference_line_info_)) {
AERROR << "Failed to apply change lane decider";
return false;
}
...
}
ReferenceLine主要是静态数据(路径点和限速)的存储,而ReferenceLineInfo中会包含动态信息(障碍物)和更多逻辑。
操作ReferenceLineInfo
主要有下面两个地方会操作ReferenceLineInfo:
- /modules/planning/traffic_rules:该目录下是交通规则的实现。不同Rule会向ReferenceLineInfo添加不同的数据,例如:障碍物,红绿灯等等。
- /modules/planning/tasks:该目录下是许多的决策器和优化器,这是Apollo EM Planner算法的核心。
交通规则的应用是在TrafficDecider::Execute方法中执行的。
每个交通规则都会实现下面这个方法来完成其逻辑:
common::Status ApplyRule(Frame* const frame,
ReferenceLineInfo* const reference_line_info) = 0;
这里的指针类型的参数就意味着方法实现可能会修改参数的值。
对于ReferenceLineInfo的操作,主要是修改该类的以下三个字段:
- PathData path_data_:包含了路径相关的数据,逻辑实现位于modules/planning/common/path/中。
- SpeedData speed_data_:包含了速度相关的数据,逻辑实现位于modules/planning/common/speed/。路径和速度最终将组合起来使用,以生成行车轨迹(见下文)。
- PathDecision path_decision_:这个字段中包含了障碍物的决策信息。
障碍物在Planning模块中通过apollo::planning::Obstacle描述。
障碍物分为横向障碍物和纵向障碍物。横向障碍物将可能导致车辆的nudge行为。而纵向障碍物可能导致车辆出现:stop,yield,follow,overtake行为。这几个行为的优先级从左到右依次递减。
预测模块对于同一个障碍物可能会有多个预测轨迹。此时在Planning模块中,会多个apollo::planning::Obstacle对象分别对应每一个轨迹。