百度apollo planning代码学习-Apollo\modules\planning\math\curve1d\PiecewiseQuinticSpiralPath类代码详解

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

概述

PiecewiseQuinticSpiralPath类是apollo planning模块下modules\planning\math\curve1d\piecewise_quintic_spiral_path.cc /.h实现

从类名来看,应该是PiecewiseQuinticSpiralPath是分段五次螺旋路径类?

从代码来看PiecewiseQuinticSpiralPath类主要是实现:
全局搜索此类好像并没有用到?该类仅在piecewise_quintic_spiral_path.cc /.h以及其测试用例里出现,并没有被外部调用?
1.增加一段5次螺旋路径,输入这一段路径长delta_s,终点曲率kappa,终点曲率变化率dkappa,终点处航向角theta,起点的曲率和航向角及s等信息在构造类对象时就已经确定,根据起点终点的信息可以求解到一段螺旋线;
2.插值函数返回螺旋线在s处对应的曲率/曲率变化率/…;
3.获取整个分段五次螺旋线的总长度;
4.根据输入的纵向位置s定位其所属哪一段五次螺旋路径,以便确定起点终点theta,曲率及曲率变化率以及总长度等信息,也就能确定这一段螺旋线的表达式,也还是作为了插值的辅助函数;

简而言之,该类就是输入每一段起点终点曲率航向纵向位置等信息构造一段段五次螺旋线路径,并能实现输入s插值曲率/曲率变化率等信息

*五次螺旋路径,螺旋线,根据起点曲率,曲率变化率,终点曲率,曲率变化率,起点终点航向角,确定一段螺旋曲线
五次螺旋路径参数曲线{(s0,theta0),(s1,theta1)…}
曲率的定义:曲线某点切线方向对弧长的转动率
*五次螺旋路径 曲率是纵向位置s的5次函数

piecewise_quintic_spiral_path.h

#pragma once

#include <string>
#include <vector>

#include "modules/planning/math/curve1d/curve1d.h"
#include "modules/planning/math/curve1d/quintic_spiral_path.h"

namespace apollo {
namespace planning {
//分段五次螺旋路径类公有继承了1维参数曲线类
class PiecewiseQuinticSpiralPath : public Curve1d {
 public:
 //分段五次螺旋路径类构造函数,输入参数航向角theta,曲率kappa,和曲率变化率dkappa
  PiecewiseQuinticSpiralPath(const double theta, const double kappa,
                             const double dkappa);

  virtual ~PiecewiseQuinticSpiralPath() = default;

//增加一段5次螺旋路径,这一段路径长delta_s,终点曲率kappa,终点曲率变化率dkappa,终点处航向角theta,
  void Append(const double theta, const double kappa, const double dkappa,
              const double delta_s);
//插值函数返回螺旋线在s处对应的曲率/曲率变化率/...,取决于输入参数的order是什么
  double Evaluate(const std::uint32_t order, const double param) const override;
//对曲率进行插值?
  double DeriveKappaS(const double s) const;
//获取整个分段五次螺旋线的总长度
  double ParamLength() const override;
//返回曲线的名称?
  std::string ToString() const override { return "PiecewiseQuinticSpiralPath"; }

 private:
 //根据输入的纵向位置s定位其所属哪一段五次螺旋路径,以便确定起点终点theta,曲率及曲率变化率以及总长度等信息,也就能确定这一段螺旋线的表达式
  size_t LocatePiece(const double param) const;

  std::vector<QuinticSpiralPath> pieces_;

  std::vector<double> accumulated_s_;

  double last_theta_ = 0.0;

  double last_kappa_ = 0.0;

  double last_dkappa_ = 0.0;
};

}  // namespace planning
}  // namespace apollo

piecewise_quintic_spiral_path.cc

#include "modules/planning/math/curve1d/piecewise_quintic_spiral_path.h"

namespace apollo {
namespace planning {
//分段五次螺旋路径类构造函数,输入参数航向角theta,曲率kappa,和曲率变化率dkappa
PiecewiseQuinticSpiralPath::PiecewiseQuinticSpiralPath(const double theta,
                                                       const double kappa,
                                                       const double dkappa)
    : last_theta_(theta), last_kappa_(kappa), last_dkappa_(dkappa) { //输入参数用来初始化类成员,分段五次螺旋路径类起点的航向曲率变化率等
  accumulated_s_.push_back(0.0);//在路径累计长度里塞入0起点从s=0开始,这段五次螺旋路径的起点对应的航向角theta,起点对应的曲率kappa,起点对应的率变化率dkappa
}

//增加一段5次螺旋路径,这一段路径长delta_s,终点曲率kappa,终点曲率变化率dkappa,终点处航向角theta,
void PiecewiseQuinticSpiralPath::Append(const double theta, const double kappa,
                                        const double dkappa,
                                        const double delta_s) {
  //累计弧长在之前的基础上加上这一段的长度delta_s 
  double s = delta_s + accumulated_s_.back();
  //塞入的是这一段终点对应的纵坐标s
  accumulated_s_.push_back(s);
//在分段pieces_里塞入起点终点的曲率等信息
  pieces_.emplace_back(last_theta_, last_kappa_, last_dkappa_, theta, kappa,
                       dkappa, delta_s);
//这一段螺旋曲线塞完后,这一段的终点又变成了下一段的起点
  last_theta_ = theta;
  last_kappa_ = kappa;
  last_dkappa_ = dkappa;
}

//插值函数返回螺旋线在s处对应的曲率/曲率变化率/...,取决于输入参数的order是什么
double PiecewiseQuinticSpiralPath::Evaluate(const std::uint32_t order,
                                            const double s) const {
  auto index = LocatePiece(s);
  return pieces_[index].Evaluate(order, s - accumulated_s_[index]);
}

//对曲率进行插值?
double PiecewiseQuinticSpiralPath::DeriveKappaS(const double s) const {
  auto index = LocatePiece(s);
  const auto& piece = pieces_[index];
  double ratio = (s - accumulated_s_[index]) / piece.ParamLength();
  return piece.DeriveKappaDerivative(QuinticSpiralPath::DELTA_S, ratio);
}

//获取整个分段五次螺旋线的总长度
double PiecewiseQuinticSpiralPath::ParamLength() const {
  return accumulated_s_.back();
}

//根据输入的纵向位置s定位其所属哪一段五次螺旋路径,以便确定起点终点theta,曲率及曲率变化率以及总长度等信息
size_t PiecewiseQuinticSpiralPath::LocatePiece(const double s) const {
  ACHECK(s >= accumulated_s_.front() && s <= accumulated_s_.back());

  auto it_lower =
      std::lower_bound(accumulated_s_.begin(), accumulated_s_.end(), s);

  if (it_lower == accumulated_s_.begin()) {
    return 0;
  } else {
    return std::distance(accumulated_s_.begin(), it_lower) - 1;
  }
}

}  // namespace planning
}  // namespace apollo

你可以将打印出来的坐标以及对应的值写入到一个文本文件中,方法和上面似。以下是修改后的代码示例: ```python import gdal class SpiralIterator: def __init__(self, array, x=0, y=0): self.array = array self.x_origin = x self.y_origin = y self.pixel_width = 1 self.pixel_height = 1 self.iteSize = 0 self.i = 0 self.j = 0 self.di = 0 self.dj = 1 self.width = array.shape[1] self.height = array.shape[0] def hasNext(self): return self.iteSize < self.width * self.height def get(self): val = self.array[self.i, self.j] x = self.x_origin + (self.j + 0.5) * self.pixel_width y = self.y_origin + (self.i + 0.5) * self.pixel_height self.iteSize += 1 self.i, self.j, self.di, self.dj = self.getNextIndex() return x, y, val def getNextIndex(self): if (self.i + self.di < 0 or self.i + self.di == self.height or self.j + self.dj < 0 or self.j + self.dj == self.width or self.array[self.i + self.di, self.j + self.dj] is None): self.di, self.dj = self.dj, -self.di return self.i + self.di, self.j + self.dj, self.di, self.dj dsm_path = r'C:\sanwei\jianmo\Productions\Production_2\Production_2_DSM_part_2_2.tif' dsm_data = gdal.Open(dsm_path) dsm_array = dsm_data.ReadAsArray() spiral_iterator = SpiralIterator(dsm_array, x=810, y=500) # 打开文件 with open('coordinates.txt', 'w') as f: while spiral_iterator.hasNext(): x, y, z = spiral_iterator.get() print(f'Value at ({x},{y}): {z}') # 将坐标和对应的值写入文件 f.write(f'({x},{y}): {z}\n') print('Done!') ``` 在这个例子中,我们使用了Python的with语句来打开文件,它可以自动管理文件的打开和关闭,避免了手动关闭文件时可能出现的错误。在while循环中,我们将打印的坐标和对应的值写入到了文件中。文件的名字可以根据你的需要自行修改。运行结束后,你可以在相应的目录下找到保存好的coordinates.txt文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

wujiangzhu_xjtu

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

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

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

打赏作者

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

抵扣说明:

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

余额充值