概述
对constant_jerk_trajectory1d.cc和.h进行解析,来了解ConstantJerkTrajectory1d类的使用。
从名字字面意义来看是 常数加加速度1维轨迹类。
从代码来看该类实现的功能非常简单:
ConstantJerkTrajectory1d类其实主要就是实现车辆匀加加速度运动过程中,根据时间t对纵向相对位置s,速度v,加速度a等的插值计算功能。
constant_jerk_trajectory1d.h
#pragma once
#include <string>
#include "modules/planning/math/curve1d/curve1d.h"
namespace apollo {
namespace planning {
class ConstantJerkTrajectory1d : public Curve1d {
public:
//ConstantJerkTrajectory1d类带参构造函数
//根据下面代码p0是初始纵向位置
//v0是初速度,a0是初始加速度
//j就是加加速度
//param就是匀加加速运动持续总时间
ConstantJerkTrajectory1d(const double p0, const double v0, const double a0,
const double jerk, const double param);
//默认析构函数
virtual ~ConstantJerkTrajectory1d() = default;
//Apollo看到Evaluate里多半是插值,根据时间param即阶数order,实现匀加加速过程中对位移
//速度,加速度及加加速度的插值
double Evaluate(const std::uint32_t order, const double param) const;
//下面都是一些返回数据成员的函数,包括匀加加速度的时间,位移,速度,加速度,加加速度等
double ParamLength() const;
std::string ToString() const;
double start_position() const;
double start_velocity() const;
double start_acceleration() const;
double end_position() const;
double end_velocity() const;
double end_acceleration() const;
double jerk() const;
private:
double p0_;
double v0_;
double a0_;
double p1_;
double v1_;
double a1_;
double param_;
double jerk_;
};
} // namespace planning
} // namespace apollo
constant_jerk_trajectory1d.cc
#include "modules/planning/common/trajectory1d/constant_jerk_trajectory1d.h"
#include "cyber/common/log.h"
#include "modules/planning/common/planning_gflags.h"
namespace apollo {
namespace planning {
//ConstantJerkTrajectory1d类带参构造函数
//根据下面代码p0是初始纵向位置
//v0是初速度,a0是初始加速度
//j就是加加速度
//param就是匀加加速运动持续总时间
ConstantJerkTrajectory1d::ConstantJerkTrajectory1d(const double p0,
const double v0,
const double a0,
const double j,
const double param)
: p0_(p0), v0_(v0), a0_(a0), param_(param), jerk_(j) { //参数用来初始化类成员
//CHECK_GT判断 param > FLAGS_numerical_epsilon?
//FLAGS_numerical_epsilon去modules\planning\common\planning_gflags.cc中
//取出numerical_epsilon的值 1e-6,否则报错
CHECK_GT(param, FLAGS_numerical_epsilon);
//计算匀加加速运动的终点的相对纵向位置
p1_ = Evaluate(0, param_); //根据时间零阶插值即为位移
//计算匀加加速运动的终点的速度
v1_ = Evaluate(1, param_);//根据时间1阶插值即为速度
//计算匀加加速运动的终点的加速度
a1_ = Evaluate(2, param_);//根据时间2阶插值即为加速度
}
//Apollo看到Evaluate里多半是插值,根据时间param即阶数order,实现匀加加速过程中对位移
//速度,加速度及加加速度的插值
double ConstantJerkTrajectory1d::Evaluate(const std::uint32_t order,
const double param) const {
switch (order) {
case 0: {
return p0_ + v0_ * param + 0.5 * a0_ * param * param +
jerk_ * param * param * param / 6.0;
}
case 1: {
return v0_ + a0_ * param + 0.5 * jerk_ * param * param;
}
case 2: {
return a0_ + jerk_ * param;
}
case 3: {
return jerk_;
}
default:
return 0.0;
}
}
//下面都是一些返回数据成员的函数,包括匀加加速度的时间,位移,速度,加速度,加加速度等
double ConstantJerkTrajectory1d::start_position() const { return p0_; }
double ConstantJerkTrajectory1d::start_velocity() const { return v0_; }
double ConstantJerkTrajectory1d::start_acceleration() const { return a0_; }
double ConstantJerkTrajectory1d::end_position() const { return p1_; }
double ConstantJerkTrajectory1d::end_velocity() const { return v1_; }
double ConstantJerkTrajectory1d::end_acceleration() const { return a1_; }
double ConstantJerkTrajectory1d::ParamLength() const { return param_; }
std::string ConstantJerkTrajectory1d::ToString() const { return ""; }
double ConstantJerkTrajectory1d::jerk() const { return jerk_; }
} // namespace planning
} // namespace apollo