阿波罗 planning代码-modules\planning\lattice\trajectory_generation\PiecewiseBrakingTrajectoryGenerator类详解

70 篇文章 225 订阅
42 篇文章 7 订阅

概述

PiecewiseBrakingTrajectoryGenerator类是apollo planning模块下modules\planning\lattice\trajectory_generation\piecewise_braking_trajectory_generator.cc/.h实现

从类名来看,应该是PiecewiseBrakingTrajectoryGenerator分段匀减速刹停轨迹生成器类?

从代码来看PiecewiseBrakingTrajectoryGenerator类主要是实现:

1.根据当前车速,纵向位置,目标车速,需要到达的纵向位置计算出一条纵向分段匀减速刹停轨迹,分成4种情况;
//a.距离不够,直接以当前车速刹停至目标点;
//b.先舒适的减速至目标速度巡航一段时间,再舒适的减速刹停停在目标s上;(初始速度大于目标速度)
//c.先舒适的加速至目标速度,巡航一段时间,再刹停(初始速度小于目标速度)
//d.先舒适的加速至最大速度,再刹停(初始速度小于目标速度,纵向长度没办法实现完整的梯形速度规划)
2. 为了实现1的功能,写了一些辅助函数ComputeStopDistance根据加速度,速度计算刹停距离;ComputeStopDeceleration根据距离,速度反推刹停需要的减速度;

简而言之,就是计算一条刹停纵向轨迹

piecewise_braking_trajectory_generator.h

#pragma once

#include <memory>

#include "modules/planning/common/trajectory1d/piecewise_acceleration_trajectory1d.h"

namespace apollo {
namespace planning {

class PiecewiseBrakingTrajectoryGenerator {
 public:
  PiecewiseBrakingTrajectoryGenerator() = delete;

//PiecewiseBrakingTrajectoryGenerator类的主要函数,Genearate()生成分段刹车轨迹的函数?
//其实就是输入当前状态(纵向位置,车速),需要停在的纵向位置来计算纵向的轨迹,分成几种情况:
//a.距离不够,直接以当前车速刹停至目标点;
//b.先舒适的减速至目标速度巡航一段时间,再舒适的减速刹停停在目标s上;(初始速度大于目标速度)
//c.先舒适的加速至目标速度,巡航一段时间,再刹停(初始速度小于目标速度)
//d.先舒适的加速至最大速度,再刹停(初始速度小于目标速度,纵向长度没办法实现完整的梯形速度规划)
//输入参数:目标纵向位置s_target,当前车辆的纵向位置s_curr,目标车速v_target,当前车速v_curr,舒适加速度a_comfort? 舒适的减速度d_comfort?最大时间max_time(指轨迹的时间长度,planning_gflags里trajectory_time_length配置为8.0s)?
  static std::shared_ptr<Curve1d> Generate(
      const double s_target, const double s_curr, const double v_target,
      const double v_curr, const double a_comfort, const double d_comfort,
      const double max_time);

//计算刹停距离,输入v和减速度dec, v^2/2a
  static double ComputeStopDistance(const double v, const double dec);

//根据刹停距离和初始速度反推减速度
//a=v^2/(2x)
  static double ComputeStopDeceleration(const double dist, const double v);
};

}  // namespace planning
}  // namespace apollo

piecewise_braking_trajectory_generator.cc

#include "modules/planning/lattice/trajectory_generation/piecewise_braking_trajectory_generator.h"

#include <cmath>

#include "cyber/common/log.h"

namespace apollo {
namespace planning {

//PiecewiseBrakingTrajectoryGenerator类的主要函数,Genearate()生成分段刹车轨迹的函数?
//其实就是输入当前状态(纵向位置,车速),需要停在的纵向位置来计算纵向的轨迹,分成几种情况:
//a.距离不够,直接以当前车速刹停至目标点;
//b.先舒适的减速至目标速度巡航一段时间,再舒适的减速刹停停在目标s上;(初始速度大于目标速度)
//c.先舒适的加速至目标速度,巡航一段时间,再刹停(初始速度小于目标速度)
//d.先舒适的加速至最大速度,再刹停(初始速度小于目标速度,纵向长度没办法实现完整的梯形速度规划)
//输入参数:目标纵向位置s_target,当前车辆的纵向位置s_curr,目标车速v_target,当前车速v_curr,舒适加速度a_comfort? 舒适的减速度d_comfort?最大时间max_time(指轨迹的时间长度,planning_gflags里trajectory_time_length配置为8.0s)?
std::shared_ptr<Curve1d> PiecewiseBrakingTrajectoryGenerator::Generate(
    const double s_target, const double s_curr, const double v_target,
    const double v_curr, const double a_comfort, const double d_comfort,
    const double max_time) {
    //首先创建一个共享指针,分段匀加速1维轨迹类,用当前纵向位置和速度去初始化这个类对象ptr_trajectory 
  std::shared_ptr<PiecewiseAccelerationTrajectory1d> ptr_trajectory =
      std::make_shared<PiecewiseAccelerationTrajectory1d>(s_curr, v_curr);

//计算要走过的纵向距离,用纵向目标位置减去当前的纵向位置
  double s_dist = s_target - s_curr;

//计算舒适的刹停距离?输入当前车速和舒适的减速度作为参数
  double comfort_stop_dist = ComputeStopDistance(v_curr, d_comfort);

  // if cannot stop using comfort deceleration, then brake in the beginning.
  //如果用舒适的减速度无法在规定的纵向距离内完成降速,那么一开始就刹车?
  //如果舒适的减速完成距离>要求的减速完成距离(至少不能超过纵向目标位置)
  if (comfort_stop_dist > s_dist) {
    //这是从要求的减速距离s_dist,以及当前车速反推刹停需要的减速度
    double stop_d = ComputeStopDeceleration(s_dist, v_curr);
    //计算出刹停需要的时间
    double stop_t = v_curr / stop_d;
    //在轨迹里初始s,v之后增加一段以反推的减速度刹停的这一段纵向轨迹
    ptr_trajectory->AppendSegment(-stop_d, stop_t);
//若刹停的的时间小于轨迹需要的时间长度8s,就在该轨迹后面增加一段加速度为0的轨迹填补剩下的时间
    if (ptr_trajectory->ParamLength() < max_time) {
      ptr_trajectory->AppendSegment(0.0,
                                    max_time - ptr_trajectory->ParamLength());
    }
    //返回这个分段匀减速刹车轨迹(该情况下必须从一开始就刹车,而且是以不舒适的减速度刹停)
    return ptr_trajectory;
  }

  // otherwise, the vehicle can stop from current speed with comfort brake.
  //车辆可以以舒服的减速度减速至目标速度的话
  //如果当前车速大于目标车速
  if (v_curr > v_target) {
  //计算巡航时间,也就是减速至目标速度后匀速运动的时间
  //用从当前纵向位置到目标纵向位置的总的距离 - 舒适的减速至目标速度的距离 = 剩下的需要匀速运动完成的距离,剩下的需要匀速运动完成的距离 / 目标速度 = 匀速巡航时间
    double t_cruise = (s_dist - comfort_stop_dist) / v_target;
    //计算舒适的减速至目标速度需要的时间
    double t_rampdown = (v_curr - v_target) / d_comfort;
    
    //这个是计算目标速度再以舒适的减速度刹停需要的时间?
    double t_dec = v_target / d_comfort;

//在分段匀减速轨迹里,在初始的s和速度之后增加一段以舒适的减速度-2m/s^2减少至目标速度的轨迹
    ptr_trajectory->AppendSegment(-d_comfort, t_rampdown);
  //在分段匀减速轨迹里,在减速至目标速度后再增加一段匀速巡航的轨迹
    ptr_trajectory->AppendSegment(0.0, t_cruise);
    //最后增加一段以舒服的减速度刹停的减速段轨迹
    ptr_trajectory->AppendSegment(-d_comfort, t_dec);

//如果这一通操作下来,待设置的分段匀减速刹停轨迹时间还是小于8s,用加速度0去填补剩下的时间,直到轨迹的时间达到8s
    if (ptr_trajectory->ParamLength() < max_time) {
      ptr_trajectory->AppendSegment(0.0,
                                    max_time - ptr_trajectory->ParamLength());
    }
    //返回这个分段匀减速刹停轨迹(该情况下先舒适的减速至目标速度巡航一段时间,再舒适的减速刹停停在目标s上,另外apollo里定义的舒适减速度是-2m/s^2)
    return ptr_trajectory;

  } else {
  //如果当前车速小于目标车速
  //反过来计算以当前车速以舒适的加速度2m/s^2(apollo里定义的,实际上也并不能算舒适)到目标速度的加速时间
    double t_rampup = (v_target - v_curr) / a_comfort;
    //以目标速度舒适的减速至当前车速的时间t_rampdown 
    double t_rampdown = (v_target - v_curr) / d_comfort;
    //这是 车辆先匀加速至目标速度,再匀减速至当前初始车速的距离,加减速的距离总长s_ramp 
    double s_ramp = (v_curr + v_target) * (t_rampup + t_rampdown) * 0.5;
//计算需要走过的纵向距离 - 加减速走过的距离 - 从当前车速出发舒适的刹停距离 
//剩下的距离就是需要保持目标车速匀速行驶的距离
    double s_rest = s_dist - s_ramp - comfort_stop_dist;
    //如果计算出的剩下的保持目标车速匀速行驶的距离是 > 0的话
    if (s_rest > 0) {
    //计算巡航时间 
      double t_cruise = s_rest / v_target;
      //计算从目标速度刹停的时间
      double t_dec = v_target / d_comfort;

      // construct the trajectory
      //构建这条轨迹
      
      //在待设置的分段匀减速刹停轨迹里在初始状态(当前车速,当前纵向位置)后新增一段
      //舒适匀加速到目标速度的轨迹
      ptr_trajectory->AppendSegment(a_comfort, t_rampup);
      //新增一段以目标速度巡航的轨迹
      ptr_trajectory->AppendSegment(0.0, t_cruise);
      //新增一段从目标速度开始刹停的轨迹
      ptr_trajectory->AppendSegment(-d_comfort, t_dec);

      //如果轨迹的时间长度小于8s就在刹停后补全一段速度为0加速度为0的轨迹到8s
      if (ptr_trajectory->ParamLength() < max_time) {
        ptr_trajectory->AppendSegment(0.0,
                                      max_time - ptr_trajectory->ParamLength());
      }
      //返回这个分段匀减速刹停轨迹(该情况下先舒适的加速至目标速度,巡航一段时间,再刹停)
      return ptr_trajectory;
    } else { //如果计算出的剩下的保持目标车速匀速行驶的距离是 <= 0的话,
    //就说明不需要匀速段,直接从当前车速舒适加速至最多目标车速,再舒适的刹停
      double s_rampup_rampdown = s_dist - comfort_stop_dist;
      //计算从当前车速舒适加速的最大速度
      double v_max = std::sqrt(v_curr * v_curr + 2.0 * a_comfort * d_comfort *
                                                     s_rampup_rampdown /
                                                     (a_comfort + d_comfort));
//计算加速的时间
      double t_acc = (v_max - v_curr) / a_comfort;
      //计算舒适减速的时间
      double t_dec = v_max / d_comfort;

      // construct the trajectory
      //构建这段分段匀减速刹停轨迹
      //再当前状态后增加一段 舒适加速至最大速度的轨迹
      ptr_trajectory->AppendSegment(a_comfort, t_acc);
      //再增加一段舒适减速至0的轨迹
      ptr_trajectory->AppendSegment(-d_comfort, t_dec);

//轨迹上不满8s,加速度为0,速度为0补全至8s
      if (ptr_trajectory->ParamLength() < max_time) {
        ptr_trajectory->AppendSegment(0.0,
                                      max_time - ptr_trajectory->ParamLength());
      }
      //返回这个分段匀减速刹停轨迹(该情况下先舒适的加速至最大速度,再刹停)
      return ptr_trajectory;
    }
  }
}

//计算刹停距离,输入v和减速度dec, v^2/2a
double PiecewiseBrakingTrajectoryGenerator::ComputeStopDistance(
    const double v, const double dec) {
  ACHECK(dec > 0.0);
  return v * v / dec * 0.5;
}

//根据刹停距离和初始速度反推减速度
//a=v^2/(2x)
double PiecewiseBrakingTrajectoryGenerator::ComputeStopDeceleration(
    const double dist, const double v) {
  return v * v / dist * 0.5;
}

}  // namespace planning
}  // namespace apollo

附录 apollo中默认定义的舒适加减速度

在这里插入图片描述
apollo里的舒适加速度和减速度都在planning_gflags里配置,定义最大加减速度为±4m/s2,然后舒适加减速度在最大值基础上乘以一个factor,这个factor同样在planning_gflags.cc里配置为0.5,也就是apollo里默认配置的舒适的加减速度为±2m/s2。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wujiangzhu_xjtu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值