无人驾驶的解释方法

#pragma oncejkl

#include
#include
#include
#include
#include <unordered_map>
#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 &current_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 &current_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\,.
$$

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

python无人驾驶 医学芯片

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值