百度apollo自动驾驶planning代码学习-Apollo\modules\planning\lattice\behavior\FeasibleRegion类代码详解

70 篇文章 249 订阅
42 篇文章 7 订阅
Apollo 的 planning 模块中,FeasibleRegion 类用于表示车辆的可行区域。它存储车辆的初始状态,并计算在给定时间和加速度限制下,车辆能够达到的s和v的上下界。类的成员函数包括计算最大和最小速度以及到达特定s值所需的时间。这些功能对于路径规划至关重要。
摘要由CSDN通过智能技术生成

概述

跳过
apollo/modules/planning/dag/,
apollo/modules/planning/data/,
apollo/modules/planning/images/,
apollo/modules/planning/integration_tests/
这四个目录没有讲解,要么与规划无关,要么涉及时再讲解,规划模块的integration_tests集成测试可以等解析完所有planning下其他所有代码再来解析。

FeasibleRegion类是apollo planning模块下modules\planning\lattice\behavior\feasible_region.cc/.h实现

从类名来看,应该是可行区域类?

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

1.储存车辆的初始状态s,v,a;
2.获取以最大的加速度4m/s^2在指定时间t内能到达的最远的s(supper),能达到的最
大速度v(vupper);
3.获取以最大的减速度-6m/s^2在指定时间t内能到达的最近的s——slower,能达到的
最小速度v(VLower);
4.获取以最大加速度4m/s^2到达指定s的最小时间TLower;

feasible_region.h

#pragma once

#include <algorithm>

#include "modules/common/proto/pnc_point.pb.h"

namespace apollo {
namespace planning {

class FeasibleRegion {
 public:
 //带参构造函数
//输入参数是个三维数组类 init_s?至少init_s[0]代表s,init_s[1]代表v,第三个参数好像没用到?init_s是初始状态?
  explicit FeasibleRegion(const std::array<double, 3>& init_s);

//获取s的上界?输入参数是时间t
//获取以最大加速度4.0m/s^2指定时间能到达的最远的s?
  double SUpper(const double t) const;

//获取s的下界?输入参数是时间t
//获取以最小加速度-6.0m/s^2在指定时间能到达的最远的s?
  double SLower(const double t) const;

//获取v的上界?输入参数是时间t
//获取以最大加速度4.0m/s^2在指定时间能达到的最大的速度?
//v=v0+at
  double VUpper(const double t) const;

//获取v的下界?输入参数是时间t
//获取以最大减速度-6.0m/s^2在指定时间能达到的最小的速度?
//v=v0+at,但是速度不能小于0
  double VLower(const double t) const;

//获取达到输入的s处需要的最小时间t,那就是以最大加速度过去
  double TLower(const double s) const;

 private:
 //车辆的初始状态,s,v,第3个参数是a?
  std::array<double, 3> init_s_;

  double t_at_zero_speed_;

  double s_at_zero_speed_;
};

}  // namespace planning
}  // namespace apollo

feasible_region.cc

#include "modules/planning/lattice/behavior/feasible_region.h"

#include <cmath>

#include "cyber/common/log.h"
#include "modules/planning/common/planning_gflags.h"

namespace apollo {
namespace planning {

//带参构造函数
//输入参数是个三维数组类 init_s?至少init_s[0]代表s,init_s[1]代表v,第三个参数好像没用到?init_s是初始状态?
FeasibleRegion::FeasibleRegion(const std::array<double, 3>& init_s) {
  //输入参数init_s用来初始化类成员init_s_
  init_s_ = init_s;

//获取初始状态里的速度
  double v = init_s[1];
  //检查v>=0?
  CHECK_GE(v, 0.0);
//获取最大的减速度6.0m/s^2,在planning_gflags.cc里定义
  const double max_deceleration = -FLAGS_longitudinal_acceleration_lower_bound;
 //获取以最大减速度减到0的时间t_at_zero_speed_
  t_at_zero_speed_ = v / max_deceleration;
  //获取以最大减速度减到0时的纵向坐标s_at_zero_speed_
  //s=s0+v^2/2a
  s_at_zero_speed_ = init_s[0] + v * v / (2.0 * max_deceleration);
}

//获取s的上界?输入参数是时间t
//获取以最大加速度4.0m/s^2指定时间能到达的最远的s?
double FeasibleRegion::SUpper(const double t) const {
  //检查t>=0?
  ACHECK(t >= 0.0);
  //以最大加速度4.0m/s^2加速输入的时间所达到的纵向位置s
  //s=s0+v0t+1/2*a*t^2匀加速
  return init_s_[0] + init_s_[1] * t +
         0.5 * FLAGS_longitudinal_acceleration_upper_bound * t * t;
}

//获取s的下界?输入参数是时间t
//获取以最小加速度-6.0m/s^2在指定时间能到达的最远的s?
double FeasibleRegion::SLower(const double t) const {
  //如果输入的t小于减速度到0需要的时间,返回纵向的位置s
  if (t < t_at_zero_speed_) {
    return init_s_[0] + init_s_[1] * t +
           0.5 * FLAGS_longitudinal_acceleration_lower_bound * t * t;
  }
  return s_at_zero_speed_;
}

//获取v的上界?输入参数是时间t
//获取以最大加速度4.0m/s^2在指定时间能达到的最大的速度?
//v=v0+at
double FeasibleRegion::VUpper(const double t) const {
  return init_s_[1] + FLAGS_longitudinal_acceleration_upper_bound * t;
}

//获取v的下界?输入参数是时间t
//获取以最大减速度-6.0m/s^2在指定时间能达到的最小的速度?
//v=v0+at,但是速度不能小于0
double FeasibleRegion::VLower(const double t) const {
  return t < t_at_zero_speed_
             ? init_s_[1] + FLAGS_longitudinal_acceleration_lower_bound * t
             : 0.0;
}

//获取达到输入的s处需要的最小时间t,那就是以最大加速度过去
double FeasibleRegion::TLower(const double s) const {
  //首先检查输入的s是否比初始纵向位置s要大
  ACHECK(s >= init_s_[0]);

//获取从当前纵向位置到输入的s剩余的距离
  double delta_s = s - init_s_[0];
  //获取初始状态的速度v
  double v = init_s_[1];
  //设定加速度为最大加速度,这样才会是最短时间到s
  double a = FLAGS_longitudinal_acceleration_upper_bound;
  //求解需要的时间t并返回
  double t = (std::sqrt(v * v + 2.0 * a * delta_s) - v) / a;
  return t;
}

}  // namespace planning
}  // namespace apollo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wujiangzhu_xjtu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值