#pragma oncejkl
#include
#include
#include “modules/common/math/vec8d.h”
#include “modules/common/monitor_log/monitor_log_buffer.h”
#include “modules/common/proto/geometry.pb.h”
#include “modules/common/status/status.h”
#include “modules/common/vehicle_state/proto/vehicle_state.pb.h”
#include “modules/localization/proto/pose.pb.h”
#include “modules/planning/common/ego_info.h”
#include “modules/planning/common/indexed_queue.h”
#include “modules/planning/common/local_view.h”
#include “modules/planning/common/obstacle.h”
#include “modules/planning/common/open_space_info.h”
#include “modules/planning/common/reference_line_info.h”
#include “modules/planning/common/trajectory/publishable_trajectory.h”
#include “modules/planning/proto/pad_msg.pb.h”
#include “modules/planning/proto/planning.pb.h”
#include “modules/planning/proto/planning_config.pb.h”
#include “modules/planning/proto/planning_internal.pb.h”
#include “modules/planning/reference_line/reference_line_provider.h”
#include “modules/prediction/proto/prediction_obstacle.pb.h”
#include “modules/routing/proto/routing.pb.h”
namespace apollo {
namespace planning {
/**
- @class Frame
- @brief Frame类储存了一个规划周期的所有数据
*/
class Frame {
public:
//Frame类的构造函数,参数是序列号
explicit Frame(uint32_t sequence_num);
//Frame类的带参构造函数,
//参数:序列号sequence_num
//参数:local_view modules\planning\common\local_view.h定义的LocalView类
//LocalView类包含了规划模块输入所需的所有数据
//参数:planning_start_point规划轨迹起始点
//参数:车辆状态vehicle_state
//参数:reference_line_provider参考线提供器
Frame(uint32_t sequence_num, const LocalView &local_view,
const common::TrajectoryPoint &planning_start_point,
const common::VehicleState &vehicle_state,
ReferenceLineProvider *reference_line_provider);
//Frame类带参构造函数,跟上面的构造函数区别就是没有最后一个参数参考线提供器
//但其实调用的还是上面的构造函数,只不过最后一个参数传个nullptr空指针
Frame(uint32_t sequence_num, const LocalView &local_view,
const common::TrajectoryPoint &planning_start_point,
const common::VehicleState &vehicle_state);
//析构函数
virtual ~Frame() = default;
//获取Frame类的数据成员规划起始点planning_start_point_
const common::TrajectoryPoint &PlanningStartPoint() const;
//Frame类的初始化函数
//输入参数 车辆状态提供器类指针对象vehicle_state_provider
//输入参数 参考线类对象列表reference_lines
//输入参数 导航路径段类对象列表segments
//输入参数: 将来的导航的车道航点序列future_route_waypoints
//输入参数: 自车信息类指针对象ego_info
//其实该函数主要就是用输入参数去初始化Frame类的数据成员
common::Status Init(
const common::VehicleStateProvider *vehicle_state_provider,
const std::list &reference_lines,
const std::listhdmap::RouteSegments &segments,
const std::vectorrouting::LaneWaypoint &future_route_waypoints,
const EgoInfo *ego_info);
//针对OpenSpace的规划器的初始化
//相比上面的Init函数少了结构化的车道,以及车道上的segments的相关的操作
common::Status InitForOpenSpace(
const common::VehicleStateProvider *vehicle_state_provider,
const EgoInfo *ego_info);
//返回Frame类数据成员序列号,这个序列号是干什么的?
uint32_t SequenceNum() const;
//获取debug string打印序列号字符串,所以序列号是类似于id一样的识别号代表特定一帧frame
//数据?
std::string DebugString() const;
//返回待发布的规划轨迹?
const PublishableTrajectory &ComputedTrajectory() const;
//其实这个函数就记录planning的所有输入数据用于debug
//这些输入数据几乎都是从Frame类成员local_view_里拷贝的
//planning_internal::Debug 是modules\planning\proto\planning_internal.proto
//里定义的message类,Debug下面包含planning_data
//planning_data里又包含规划的相关数据,如自车位置,底盘反馈,routing响应,
//起始点,路径,速度规划,st图,sl坐标,障碍物,信号灯,前方畅通距离,场景信息等等,几
//乎所有的planning输入debug数据?
//google protobuf的用法,可以根据.proto文件生成相应的c++类,视为一种数据结构
void RecordInputDebug(planning_internal::Debug *debug);
//获取Frame类成员参考线信息类对象reference_line_info_,它是一个参考线信息的列表list
const std::list &reference_line_info() const;
//返回Frame类成员参考线信息类对象reference_line_info_的地址?
std::list *mutable_reference_line_info();
//在障碍物列表中寻找输入参数id对应的障碍物对象
Obstacle *Find(const std::string &id);
//找驾驶参考线信息
//其实这个函数就是找到Frame类数据成员reference_line_info_道路参考线列表中cost最小且可行驶的道路参考线对象
const ReferenceLineInfo *FindDriveReferenceLineInfo();
//找目标道路参考线,返回的是道路参考线信息ReferenceLineInfo类对象
//这个函数其实是找变道参考线?
const ReferenceLineInfo *FindTargetReferenceLineInfo();
//查找失败的参考线信息,返回道路参考线信息类ReferenceLineInfo类对象
//遍历道路参考线列表,找到不可驾驶的变道参考线信息类对象?
const ReferenceLineInfo *FindFailedReferenceLineInfo();
//返回Frame类的数据成员驾驶参考线信息类对象
const ReferenceLineInfo *DriveReferenceLineInfo() const;
//返回Frame类的数据成员障碍物列表obstacles_
const std::vector<const Obstacle *> obstacles() const;
/**
- 用车道的宽度创建虚拟的静态障碍物,主要是针对虚拟的停止墙
*/
//参数 参考线信息类对象reference_line_info,这里不是列表了,只是一条参考线信息
//参数 障碍物obstacle_id,引用变量&应该是用来存放构建的虚拟障碍物的Id
//参数 障碍物id
//参数 障碍物对应的frenet系的s坐标
//这个函数主要是针对虚拟静态障碍物的位置建立虚拟障碍物对象,如红绿灯停止线等
const Obstacle *CreateStopObstacle(
ReferenceLineInfo *const reference_line_info,
const std::string &obstacle_id, const double obstacle_s);
/**
- 用车道宽度创建虚拟静态障碍物对象,主要是用于虚拟停止墙
*/
//参数 障碍物id,车道id,车道对应的终点的frenet系s坐标lane_s
//这个函数主要是针对终点位置建立虚拟障碍物对象
const Obstacle *CreateStopObstacle(const std::string &obstacle_id,
const std::string &lane_id,
const double lane_s);
/**
- 用车道宽度创建虚拟静态障碍物对象
*/
//这个函数主要是根据3个输入参数:障碍物frenet系下的起始s坐标和终点s坐标,以及障碍物的
//id,在参考线信息类对象上构建虚拟障碍物
const Obstacle *CreateStaticObstacle(
ReferenceLineInfo *const reference_line_info,
const std::string &obstacle_id, const double obstacle_start_s,
const double obstacle_end_s);
//重新规划全局路径函数,输入参数是planning_context就是规划状态
//就是从自车位置出发再次routing,主要是更新routing_request的起始点为自车位置
//PlanningContext里包含routing_request
//这里找到自车最近的匹配车道上的最近点作为routing_request的起始点重新routing
//来设置PlanningContext里的rerouting对象
bool Rerouting(PlanningContext *planning_context);
//返回车辆自身状态
const common::VehicleState &vehicle_state() const;
//这个函数是是实现预测时间对齐planning起始时间?
//输入参数 规划起始时间planning_start_time
//输入参数 预测障碍物列表prediction_obstacles
static void AlignPredictionTime(
const double planning_start_time,
prediction::PredictionObstacles *prediction_obstacles);
//设置当前frame帧的规划轨迹,用ADCTrajectory类轨迹对象
void set_current_frame_planned_trajectory(
ADCTrajectory current_frame_planned_trajectory) {
current_frame_planned_trajectory_ =
std::move(current_frame_planned_trajectory);
}
//返回当前frame的规划轨迹ADCTrajectory类对象
const ADCTrajectory ¤t_frame_planned_trajectory() const {
return current_frame_planned_trajectory_;
}
//设置当前frame的离散路径 轨迹trajectory=路径path + 速度规划
void set_current_frame_planned_path(
DiscretizedPath current_frame_planned_path) {
current_frame_planned_path_ = std::move(current_frame_planned_path);
}
//返回当前frame的离散路径对象
const DiscretizedPath ¤t_frame_planned_path() const {
return current_frame_planned_path_;
}
//离目标点是否足够近?
const bool is_near_destination() const {
return is_near_destination_;
}
/**
- @brief 调整参考线优先级通过实际的道路情况
- @id_to_priority laneid和优先级的map映射关系
*/
//更新参考线优先级?输入参数是一个map,看上去像是存放一系列id和优先级数字的映射关系的
//map id_to_priority,&引用变量做参数通常代表其要被函数修改
//其实就是将 输入参数里map各个参考线id对应的优先级数字设置到
//设置到类成员reference_line_info_参考线对象列表里
void UpdateReferenceLinePriority(
const std::map<std::string, uint32_t> &id_to_priority);
//返回frame类的数据成员local_view_对象,其包含了所有的规划输入数据,是一个struct
//障碍物/底盘/交通灯/定位等信息
const LocalView &local_view() const {
return local_view_;
}
//获取Frame类数据成员障碍物列表
ThreadSafeIndexedObstacles *GetObstacleList() {
return &obstacles_;
}
//返回开放空间信息类对象?
const OpenSpaceInfo &open_space_info() const {
return open_space_info_;
}
//设置开放空间信息类对象?
OpenSpaceInfo *mutable_open_space_info() {
return &open_space_info_;
}
//根据id获取交通灯对象,输入的是交通灯的id
perception::TrafficLight GetSignal(const std::string &traffic_light_id) const;
//获取frame类的数据成员存放人机交互动作对象?
const DrivingAction &GetPadMsgDrivingAction() const {
return pad_msg_driving_action_;
}
private:
//函数名其实意思就是初始化Frame类的数据
//输入参数 车辆状态提供器类指针对象vehicle_state_provider
//输入参数: 自车信息类指针对象ego_info
common::Status InitFrameData(
const common::VehicleStateProvider *vehicle_state_provider,
const EgoInfo *ego_info);
//创建参考线信息类对象?
//参数 参考线类对象列表reference_lines
//参数 导航路径段类对象列表segments 导航route指全局路径规划
//其实这个函数就是将参数里的参考线列表reference_lines,导航路径段RouteSegments列表设
//置到Frame类数据成员reference_line_info_参考线信息类对象列表里
bool CreateReferenceLineInfo(const std::list &reference_lines,
const std::listhdmap::RouteSegments &segments);
/**
- 找到一个会与ADC(Autonomous Driving Car)自车碰撞的障碍物
- @return 返回障碍物的指针,否则返回空
*/
const Obstacle *FindCollisionObstacle(const EgoInfo *ego_info) const;
//根据障碍物id和障碍物对应的边界盒对象作为参数去调用构建虚拟障碍物的函数,
//返回一个虚拟障碍物对象类
const Obstacle *CreateStaticVirtualObstacle(const std::string &id,
const common::math::Box2d &box);
//增加一个障碍物对象到类数据成员障碍物列表里
void AddObstacle(const Obstacle &obstacle);
//读交通灯函数,从数据成员local_view_读到Frame类数据成员traffic_lights_交通灯列表中
//local_view_包含规划的所有输入数据
void ReadTrafficLights();
//读取local_view_中的驾驶员交互操作行为
void ReadPadMsgDrivingAction();
//复位人机交互动作对象
void ResetPadMsgDrivingAction();
private: //Frame类的数据成员
//人机交互动作,自驾模式选择等…
static DrivingAction pad_msg_driving_action_;
//序列号?
uint32_t sequence_num_ = 0;
//LocalView类对象,包含规划所有输入数据
LocalView local_view_;
//高精度地图对象,初始化为空指针
const hdmap::HDMap *hdmap_ = nullptr;
//规划起始点
common::TrajectoryPoint planning_start_point_;
//车辆状态
common::VehicleState vehicle_state_;
//参考线列表
std::list reference_line_info_;
//是否接近目标点?
bool is_near_destination_ = false;
/**
- 车辆最终选择驾驶的道路参考线
**/
const ReferenceLineInfo *drive_reference_line_info_ = nullptr;
//障碍物列表
ThreadSafeIndexedObstacles obstacles_;
//无序map,存放id,和交通灯对象的映射关系
std::unordered_map<std::string, const perception::TrafficLight *>
traffic_lights_;
// 当前帧的规划发布轨迹,也就是输出结果
ADCTrajectory current_frame_planned_trajectory_;
//当前帧的路径点,为了将来可能的speed fallback速度规划失败?
DiscretizedPath current_frame_planned_path_;
//参考线提供器类对象
const ReferenceLineProvider *reference_line_provider_ = nullptr;
//开放空间信息类对象?非结构化道路?
OpenSpaceInfo open_space_info_;
//将来的路由点vector,用于rerouting时将自车在轨迹上最近点与之拼接
//用于将之前设定的routing请求改为从自车位置出发
std::vectorrouting::LaneWaypoint future_route_waypoints_;
//监视缓存?
common::monitor::MonitorLogBuffer monitor_logger_buffer_;
};
class FrameHistory : public IndexedQueue<uint32_t, Frame> {
public:
//frame.h里定义了一个FrameHistory类也定义了一个Frame
//可以将FrameHistory类看成是历史Frame数据的队列
//FLAGS_就是GFLAGS用法去
//modules\planning\common\planning_gflags.cc里取出
//储存的最大历史Frame的数量,默认为1
FrameHistory();
};
} // namespace planning
} // namespace apollo
``mermaid
flowchat
st=>start: 开始
e=>end: 结束
op=>operation: 我的操作
cond=>condition: 确认?
st->op->cond
cond(yes)->e
cond(no)->op
Gamma公式展示 $\Gamma(n) = (n-1)!\quad\forall
n\in\mathbb N$ 是通过 Euler integral
$$
\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.
$$