概述
对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










