B-spline的理解与路径规划中的应用及C++代码的实现

2023-05-16

研究项目,无人机的路径规划,需要用到B样条,所以在此写下B-spline的结合C++代码的理解以及在项目中的应用

一、阶数p_

阶数 = 所有权重中t的最高次幂=控制点数量-1;

二、节点表u_

节点表数量m_ = n_ + p_ + 1(控制点数量+阶数+1),节点表用于生成基函数,节点表的生成一般有两种方法,顺序方法和Clamped方法,下面的代码选其一种。举例如下

假设曲线有6个控制点,阶数是3阶,那么节点表大小=6+3+1=10。

如果是顺序列表,只需要按顺序设置

如果是Clamped列表,由于是3阶,前面3+1个参数均设置为0,后面3+1个参数均设置为1,然后剩余参数均匀递增

void NonUniformBspline::setUniformBspline(const Eigen::MatrixXd& points, const int& order,const double& interval) {//设置节点表
  control_points_ = points;
  p_              = order;// B-spline阶数
  interval_       = interval;//interval = ts = pp_.ctrl_pt_dist / pp_.max_vel_

  n_ = points.rows() - 1;// 控制点Q: Q0, Q1, ... , Qn
  m_ = n_ + p_ + 1;// 节点u: U0, U1, ... , Un+p+1

  u_ = Eigen::VectorXd::Zero(m_ + 1);
  for (int i = 0; i <= m_; ++i) {//Clamped列表,由于是3阶,前面3+1个参数均设置为0,后面3+1个参数均设置为1,然后剩余参数均匀递增
    if (i <= p_) {
      u_(i) = double(-p_ + i) * interval_;// 前p+1个节点, 好像没什么用? 只要保证up = 0即可
    } else if (i > p_ && i <= m_ - p_) {
      u_(i) = u_(i - 1) + interval_;// 中间n-p个节点, up+1 = ts , up+2 = 2 * ts
    } else if (i > m_ - p_) {
      u_(i) = u_(i - 1) + interval_;// 后p+1个节点
    }
  }

三、基本函数表d_ = N

有上面的阶数和节点表,则可以开始计算基本函数表了,优化的路径 = \sum控制点*基本函数

基本函数表公式:

其中,N_{i,k}是第i个k次B样条的基函数,也可以理解为各个控制点的权重。

图中为基函数的运算关系,从左往右,从上到下计算。

基本函数N_{i,k},表示基函数的次数(degree)为k,这是第i个k次B样条基函数,i=0,1,...

基本函数表的C++代码实现如下:

Eigen::VectorXd NonUniformBspline::evaluateDeBoor(const double& u) {//返回基本函数表

  double ub = min(max(u_(p_), u), u_(m_ - p_)); //p degree, n+1 control points, m = n+p+1

  // determine which [ui,ui+1] lay in
  int k = p_;
  while (true) {
    if (u_(k + 1) >= ub) break;
    ++k;
  }

  /* deBoor's alg */
  vector<Eigen::VectorXd> d;
  for (int i = 0; i <= p_; ++i) {// [Ui, Ui+1]的轨迹由p+1的控制点(Qi-p, ... ,Qi)共同决定
    d.push_back(control_points_.row(k - p_ + i));
    // cout << d[i].transpose() << endl;
  }
// https://blog.csdn.net/Hachi_Lin/article/details/89812126
  for (int r = 1; r <= p_; ++r) {// 三角递归的横向         r = 1 -> i = 3, 2, 1    //                    r = 2 -> i = 3, 2
    for (int i = p_; i >= r; --i) {// 三角递归的纵向      r = 3 -> i = 3
      double alpha = (ub - u_[i + k - p_]) / (u_[i + 1 + k - r] - u_[i + k - p_]);
      // cout << "alpha: " << alpha << endl;
      d[i] = (1 - alpha) * d[i - 1] + alpha * d[i];
    }
  }

  return d[p_];
}

四、计算B-spline的曲线

根据基本函数表和控制点,我们可以求得B-spline

C\left ( t \right ) =\sum_{i=0}^{n-1}N_{i,k}(t)Q_{i}

其中Q为控制点,N_{i,k}是第i个k次B样条的基函数

五、根据运动规划的速度和加速度调整时间

因为生成的路径有可能会不符合动力学约束,所以接下来进行时间的调整,来满足动力学约束~~~未完待续~~~

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

B-spline的理解与路径规划中的应用及C++代码的实现 的相关文章

随机推荐

  • NodeJS开发web应用程序之http,express,socket.io介绍

    文章目录 NodeJS开发web应用程序之http xff0c express xff0c socket io介绍1 http2 express3 socket io NodeJS开发web应用程序之http xff0c express x
  • [编译问题解决]error: ‘atomic_int32_t’ in namespace ‘std’ does not name a type

    编译问题解决 error atomic int32 t in namespace std does not name a type https en cppreference com w cpp atomic atomic c 43 43
  • ffmpge转码常用指令介绍(不断更新...)

    帧率 分辨率 码率 文件大小转换 ffmpeg i input mp4 r 30 b a 100k b v 200k s 1920x1080 fs 4000K output mp4 i 输入视频文件 r 输出帧率 b a 输出音频码率 b
  • 解决linux系统下java调用带breakpad异常捕获的c++ sdk必现crash问题

    问题背景 java通过jni去集成c 43 43 sdk时线上发现会有偶现崩溃 xff0c 为了方便定位native c 43 43 的崩溃 xff0c sdk采用了google breakpad崩溃转储方案 xff08 Google跨平台
  • 基于netlink的Linux Network Monitor实现

    一 背景 来源于产品开发需求 xff0c 需要在linux系统下实现网络状类型查询及网络类型变更通知 xff0c 比如从Ethernet变为Wifi xff0c 从Wifi变为Ethernet等 二 设计方案 Linux系统提供了Netli
  • Altium Designer绘制一个stm32最小系统的电路原理图

    文章目录 一 Altium Designer二 新建工程文件三 绘制原理图库1 绘制元器件2 导入元器件库3 绘制模块 一 Altium Designer Altium Designer 是原Protel软件开发商Altium公司推出的一体
  • C++11面向切面编程(AOP)入门指南

    何为AOP 面向切面编程 xff08 AOP xff0c Aspect Oriented Programming xff09 是一种编程范式 xff0c 允许开发者在不修改原有代码的情况下 xff0c 为程序添加额外的功能 什么是面向切面编
  • 车道线识别/Opencv/传统方法

    车道检测 Advanced Lane Finding Project 实现步骤 使用提供的一组棋盘格图片计算相机校正矩阵 camera calibration matrix 和失真系数 distortion coefficients 校正图
  • 2019新买电脑必备软件

    都2019了 xff0c 怎么还要安装这些垃圾软件 xff01 群丫头买了个新电脑 xff0c 为了避免她踩到笔者曾今踩到的坑 xff0c 更舒心的使用电脑 xff0c 为此特写此文 作为一个电脑平凡使用者 xff0c 用过无数的软件 xf
  • Docker与anaconda+jupyter

    Arch docker的安装 pacman 安装docker sudo pacman S docker docker启动 sudo systemctl start docker 设置开机启动docker sudo systemctl ena
  • Opencv目标追踪

    参考 xff1a https www pyimagesearch com 2018 07 30 opencv object tracking 引言 Opencv作为图像处理开源库包含了Object Tracking目标追踪的一些API xf
  • 使用cmake编译,组织C++项目

    文章目录 前言例一例二例三 前言 这篇博客是我对cmake用法的一些经验总结 还很浅显 如果有错误或者更好的方案 欢迎指正 使用方法统一为在build目录中执行 cmake make 我觉得养成外部编译是一个好习惯 例一 目录结构为 lzj
  • Spring Security Oauth2.0认证授权

    基本概念 认证 用户认证就是判断一个用户的身份是否合法的过程 xff0c 用户去访问系统资源时系统要求验证用户的身份信息 xff0c 身份合法方可继续访问 xff0c 不合法则拒绝访问 常见的用户身份认证方式有 用户名密码登录 xff0c
  • C语言实现HTTP的GET和POST请求

    HTTP请求和IP TCP 所谓的HTTP协议是基于IP TCP协议的 xff0c 所以要获取远端的html数据只要创建socket对象就足够了 xff1b HTTP是基于IP TCP加上了网络请求的固定格式 get 请求 include
  • 英伟达GPU安装教程

    英伟达GPU安装教程
  • 四种插头类型:XH、VH、SM、HY

    PH1 25mm HY2 0mm XH2 5 2 54mm xff08 这两个其实是一样的 xff09 VH3 96mm 插头分成三种类型 xff1a XH xff1b VH xff1b SM xff1b HY XH 4Y 是插头 xff1
  • STM32F1C8T6Flash读取音频和DAC播放

    文章目录 一 Flash简介1 Flash原理2 STM32F1中的Flash 二 Flash地址空间的数据读取1 题目要求2 CUbeMX工程建立3 Keil工程修改4 STlink调试说明5 调试运行 三 基于片内Flash的提示音播放
  • C语言中的头文件为什么不能定义变量

    1 前提 在实际项目中 xff0c 会遇到这样的情况 xff0c 在链接阶段 xff0c 会提示定义在头文件中的变量 xff0c 重定义 xff0c 然后将将头文件中的变量定义成static类型 xff0c 然后 xff0c 不报错误了 例
  • Ubuntu16.04安裝ROS

    此文章在前人的基礎上 xff0c 並把安裝遇到的問題寫出來 Ubuntu16 04安装ROS Kinetic详细过程 https blog csdn net weixin 43159148 article details 83375218
  • B-spline的理解与路径规划中的应用及C++代码的实现

    研究项目 xff0c 无人机的路径规划 xff0c 需要用到B样条 xff0c 所以在此写下B spline的结合C 43 43 代码的理解以及在项目中的应用 一 阶数p 阶数 61 所有权重中t的最高次幂 61 控制点数量 1 xff1b