一、Task
Planning的task集中在planning/tasks目录下,相关task都可以在这里找到。VALET_PARKING_PARKING包含四个Task:
task_type: OPEN_SPACE_ROI_DECIDER
task_type: OPEN_SPACE_TRAJECTORY_PROVIDER
task_type: OPEN_SPACE_TRAJECTORY_PARTITION
task_type: OPEN_SPACE_FALLBACK_DECIDER
1.1 OPEN_SPACE_ROI_DECIDER
通过OpenSpaceRoiDecider类(open_space_roi_decider.cc)实现,主要是为后面的算法提供数据整理等准备工作。
Status OpenSpaceRoiDecider::Process(Frame *frame) {
...
if (roi_type == OpenSpaceRoiDeciderConfig::PARKING) {
...
// Find parking spot,得到车位四个角点
if (!GetParkingSpot(frame, &spot_vertices, &nearby_path)) {
...
}
// 根据车位角点设置原点信息
SetOrigin(frame, spot_vertices);
// 自车停车终止状态
SetParkingSpotEndPose(frame, spot_vertices);
// 获得车位边界
if (!GetParkingBoundary(frame, spot_vertices, nearby_path, &roi_boundary)) {
...
}
} else if (roi_type == OpenSpaceRoiDeciderConfig::DEAD_END) {
...
} else if (roi_type == OpenSpaceRoiDeciderConfig::PULL_OVER) {
...
} else if (roi_type == OpenSpaceRoiDeciderConfig::PARK_AND_GO) {
...
} else {
...
}
// 以顶点表示障碍物,并按顺时针加载到vec_变量;
// 将障碍物顶点转为线性方程表示;
if (!FormulateBoundaryConstraints(roi_boundary, frame)) {
...
}
return Status::OK();
}
1.2 OPEN_SPACE_TRAJECTORY_PROVIDER
通过OpenSpaceTrajectoryProvider类实现(代码地址planning/tasks/optimizers/open_space_trajectory_generation/open_space_trajectory_provider.cc),主要提供状态机(stop/replan等)以及多线程计算的功能.里面会去调用OpenSpaceTrajectoryOptimizer类,具体实现规划算法,是核心部分,其中又分为四个计算模块:
- HybridAStar: A*搜索获取粗轨迹