部分转自: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
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;
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 speed_limit_;
std::vector reference_points_;
hdmap::Path map_path_;
priority_
是优先级,不过在 PublicRoadPlanner
中没有用到。 speed_limit_
是限速数据,这两个我们暂时都不用关注。
reference_points_
其实是从 map_path_
得到,具体见ReferenceLine的构造函数。所以这两个数据的作用其实是一样的。
std::vector
是一系列的点,点包含了位置的信息。因此这些点就是生成车辆行驶轨迹的基础数据。
ReferencePoint
由 MapPathPoint
继承而来。下面这幅图是 ReferencePoint
的类继承关系