部分转自:https://www.tuicool.com/articles/UfIr6fM
import "modules/canbus/proto/chassis.proto"; import "modules/localization/proto/pose.proto"; message VehicleState { optional double x = 1 [default =0.0]; // 车辆世界ENU坐标系x坐标 optional double y = 2 [default =0.0]; // 车辆世界ENU坐标系y坐标 optional double z = 3 [default =0.0]; // 车辆世界ENU坐标系z坐标 optional double timestamp = 4 [default =0.0]; // 时间戳信息 optional double roll = 5 [default =0.0]; // 车辆姿态相对于世界坐标系x轴旋转角度 optional double pitch = 6 [default =0.0]; // 车辆姿态相对于世界坐标系y轴旋转角度 optional double yaw = 7 [default =0.0]; // 车辆姿态相对于世界坐标系z轴旋转角度 optional double heading = 8 [default =0.0]; // 车辆速度方向 optional double kappa = 9 [default =0.0]; // 车辆半径倒数1/R optional double linear_velocity = 10 [default =0.0]; // 车辆线速度 optional double angular_velocity = 11 [default =0.0]; // 车辆角速度 optional double linear_acceleration = 12 [default =0.0]; // 车辆线加速度 optional apollo.canbus.Chassis.GearPosition gear = 13; // 车辆齿轮状态,包含前进、倒车。停车、低速等状态 optional apollo.canbus.Chassis.DrivingMode driving_mode = 14; // 驾驶状态,包含手动驾驶、自动驾驶、转向、刹车与油门等状态 optional apollo.localization.Pose pose = 15; // 车辆姿态,包含坐标,局部到世界坐标系变换矩阵,线速度(矢量),线加速度(矢量)等信息。 }
class Chassis:
speed_mps 底盘速度
gear_location_ 设置齿轮驱动,底盘的齿轮数据
engine_rpm 发动机转速
odometer_m_ 里程表
fuel_range_m 燃料范围
throttle_percentage: 0 油门百分比
brake_percentage: 0 刹车百分比
steering_percentage: -0.65058869 操舵
steering_torque_nm: -7.125 方向盘转矩
parking_brake: false 停车制动
driving_mode: EMERGENCY_MODE
error_code: NO_ERROR
gear_location: GEAR_DRIVE
class VehicleStateProvider://车辆状态类,包括基本信息和车辆状况
vehicle_state_.x() x坐标
vehicle_state_.heading() 车辆的头部的偏角,这个是与X的夹角
vehicle_state_.roll() 欧拉滚转角
vehicle_state_.pitch() 欧拉螺距角
vehicle_state_.yaw() 获得车辆的偏航角。现在,使用航向而不是偏航角。航向角为东为零,偏航角为北为零@返回欧拉偏航角
vehicle_state_.linear_velocity() 线速度
vehicle_state_.angular_velocity() 角速度
vehicle_state_.linear_acceleration() 线加速度
pose {
position {//距离
x: 682523.70666380867 //经度
y: 3111135.3617914952//纬度
z: 66.2406011223793//海拔高度
}
orientation {//海拔朝向
qx: -0.0026926400088655485
qy: -0.012844194819580395
qz: -0.40334199690238054
qw: -0.9149551955609736
}
}
轨迹结构
前面我们已经多次提到“轨迹”一次。我们知道,”轨迹“不同于“路径”,“轨迹”不仅仅包含了行驶路线,还要包含每个时刻的车辆的速度,加速度,方向转向等信息。
就和高精地图通过一系列的点来描述道路的中心线一样,车辆的行驶轨迹也是由一系列的点来描述的。具体的结构在proto文件中定义,如下所示:
// common/proto/pnc_point.proto
message PathPoint {
optional double x = 1;
optional double y = 2;
optional double z = 3;
optional double theta = 4;
optional double kappa = 5;
optional double s = 6;
optional double dkappa = 7;
optional double ddkappa = 8;
optional string lane_id = 9;
optional double x_derivative = 10;
optional double y_derivative = 11;
}
message TrajectoryPoint {
optional PathPoint path_point = 1;
optional double v = 2; // in [m/s]
optional double a = 3;
optional double relative_time = 4;
optional double da = 5;
optional double steer = 6;
}
轨迹中的点通过 TrajectoryPoint
这个结构来描述。它的字段说明如下:
path_point
:PathPoint
类型数据。描述了一个点的位置,曲率,朝向,所属车道等信息。v
:描述车辆的速度。a
:描述车辆的加速度。relative_time
:描述车辆达到该点的相对时间(以轨迹的开始为起点)。da
:加速度的导数,也称之为jerk。steer
:车辆的前轮方向。
TrajectoryPoint
仅仅是一个点。而一条轨迹一定是由许多个点构成的。因此,描述轨迹的类 DiscretizedTrajectory
继承自 std::vector<common::TrajectoryPoint>
PointENU
:描述了地图上的一个点。定位,感知,预测和决策模块都会使用这个数据结构。目前,Apollo地图使用 Universal Transverse Mercator坐标系统 。在一些情况下,z
字段可能会被忽略。
# modules/common/proto/geometry.proto
message PointENU {
optional double x = 1 [default = nan]; // East from the origin, in meters.
optional double y = 2 [default = nan]; // North from the origin, in meters.
optional double z = 3 [default = 0.0]; // Up from the WGS-84 ellipsoid, in meters.
}
SLPoint
:描述了Frenet坐标系上的一个点。s
表示距离起点的纵向距离,l
表示距离中心线的侧向距离。
# modules/common/proto/pnc_point.proto
message SLPoint {
optional double s = 1;
optional double l = 2;
}
LaneWaypoint
:描述了车道上的点。
// modules/map/pnc_map/path.h
using LaneInfoConstPtr = std::shared_ptr<const LaneInfo>;
struct LaneWaypoint {
LaneWaypoint() = default;
LaneWaypoint(LaneInfoConstPtr lane, const double s)
: lane(CHECK_NOTNULL(lane)), s(s) {}
LaneWaypoint(LaneInfoConstPtr lane, const double s, const double l)
: lane(CHECK_NOTNULL(lane)), s(s), l(l) {}
LaneInfoConstPtr lane = nullptr;
double s = 0.0;
double l = 0.0;
std::string DebugString() const;
};
VehicleState
:描述车辆状态,包含了自车位置,姿态,方向,速度,加速度等信息。
# modules/common/vehicle_state/proto/vehicle_state.proto
message VehicleState {
optional double x = 1 [default = 0.0];
optional double y = 2 [default = 0.0];
optional double z = 3 [default = 0.0];
optional double timestamp = 4 [default = 0.0];
optional double roll = 5 [default = 0.0];
optional double pitch = 6 [default = 0.0];
optional double yaw = 7 [default = 0.0];
optional double heading = 8 [default = 0.0];
optional double kappa = 9 [default = 0.0];
optional double linear_velocity = 10 [default = 0.0];
optional double angular_velocity = 11 [default = 0.0];
optional double linear_acceleration = 12 [default = 0.0];
optional apollo.canbus.Chassis.GearPosition gear = 13;
optional apollo.canbus.Chassis.DrivingMode driving_mode = 14;
optional apollo.localization.Pose pose = 15;
}
roll, pitch 和 yaw 分布描述了车辆在纵向,侧向和垂直方向上的角度,具体如下图所示:
下面是 ReferenceLine
类中的数据成员:
// modules/planning/reference_line/reference_line.h
uint32_t priority_ = 0;
struct SpeedLimit {
double start_s = 0.0;
double end_s = 0.0;
double speed_limit = 0.0; // unit m/s
};
std::vector<SpeedLimit> speed_limit_;
std::vector<ReferencePoint> reference_points_;
hdmap::Path map_path_;
priority_
是优先级,不过在 PublicRoadPlanner
中没有用到。 speed_limit_
是限速数据,这两个我们暂时都不用关注。
reference_points_
其实是从 map_path_
得到,具体见ReferenceLine的构造函数。所以这两个数据的作用其实是一样的。
std::vector<ReferencePoint>
是一系列的点,点包含了位置的信息。因此这些点就是生成车辆行驶轨迹的基础数据。
ReferencePoint
由 MapPathPoint
继承而来。下面这幅图是 ReferencePoint
的类继承关系
- 什么是ADCTrajectory?
- ADCTrajectory的字面意思地自动驾驶车的轨迹, 在planning.proto中定义;
- 主要有总路径的长度(total_path_length), 单位是米meters;
- 总路径的时间(total_path_time), 单位是seconds;
- 重复的轨迹点TrajectoryPoint,TrajectoryPoint中主要包含的有(PathPoint,线性的速度v,线性的加速度a,相对时间relative_time(从轨迹的开始的相对时间))。
- TrajectoryPoint包含PathPoint和一些速度、加速度和时间相关的信息。
- PathPoint主要包含了一些坐标、曲率、path开始的距离、lane的id, x方向的导数和y方向的导数。
- 是否有紧急停车EStop;
- 路径点PathPoint(没有速度信息)。
- 是否重新规划is_replan;
- 具体的档位位置GearPosition;
- planning的决策结果DecisionResult,主要包含了主要决策(MainDecision)、目标决策(ObjectDecisions)和车辆信号(VehicleSignal);
- MainDecision主要包含: 当前的任务是那个(MainCruise, MainStop, MainEmergencyStop, MainChangeLane, MainMissionComplete, MainNotReady, MainParking)和重复的TargetLane;
- TargetLane主要包括了lane的id, 起点和终点限制的速度(speed_limit)。
- ObjectDecisions就是多个ObjectDecision, 每个ObjectDecision中包含了一个字符串的id, 感知目标的id和一个目标的决策类型ObjectDecisionType;
- ObjectDecisionType主要有几种类型: 忽略, 停止, 跟随, 避让, 超车, 绕行, 从旁边超过, avoid听让;
- MainDecision主要包含: 当前的任务是那个(MainCruise, MainStop, MainEmergencyStop, MainChangeLane, MainMissionComplete, MainNotReady, MainParking)和重复的TargetLane;
- LatencyStats(潜在的状态): 主要包括了总时间(total_time_ms), 任务的状态(task_stats)和初始frame的时间init_frame_time_ms;
- 其中task_stats主要包括了任务的名字和运行时间(time_ms);
- routing相关的航向角和debug的控制选项;
- ADCPathPoint(车辆路径的点) -- 主要包括x,y,z的三个坐标,曲率(curvature)和航向角(heading, 相对于绝对坐标系来说的)。
- ADCTrajectoryPoint(Deprecated: replaced by apollo.common.TrajectoryPoint), 里面主要是一个些坐标, 速度, 加速度, 曲率, 曲率的变化率, 相对时间, theta值, 从第一个点开始的距离, sl坐标系中的位置。
- 车辆的信号VehicleSignal, 主要包括(转向信号TurnSignal), 远光灯(high_beam), 近光灯(low_beam), 喇叭(horn)和应急灯(emergency_light)。
- 道路右边的状态;
- 沿车道中线参考线的lane ID;
- 根据当前的计划结果设置engage的建议; -- 这是一个遇到critical时才给予的运行时建议。
- 致命区域(CriticalRegion)。
- 轨迹的类型(TrajectoryType) -- 不知道是什么类型, 正常的类型, 路径反馈的类型, 速度反馈的类型;
- ADCTrajectory的字面意思地自动驾驶车的轨迹, 在planning.proto中定义;
- ScenarioFeature,是在scenario_feature.proto文件重定义的;
- 主要包括了速度,加速度,航向角, 当前lane的id, lane被走过的距离, 左边相邻的laneid和lanes, 右边相邻的laneid和lanes, 连接处的距离和id, 障碍物的id。