【路径规划】VFH

2023-05-16

简介

在没有全局地图或者是应对动态障碍物的情况下,往往是运用局部规划来进行绕障,在局部规划的经典算法中,比较常用的是 DWA 与 VFH,VFH 全名向量场直方图算法,不同于 DWA 的绕障思路。两者的绕障思路为:

DWA:对障碍物的位置进行测算,在满足运动约束的情况下,计算每一种速度矢量的运行轨迹,然后从运行轨迹中挑选出代价最小的轨迹(速度与当前速度最接近,距离障碍物不近,距离目标点方向的角度差较小等等代价),之后选择此轨迹代表的速度矢量作为本周期的速度矢量目标,进行绕障

VFH:对障碍物的角度与距离进行测量,建立极性坐标系,环绕飞机一周的360度分为若干个区间,挑选出没有障碍物的区间,对区间进行二次处理,剔除掉不满足运动约束的区间,之后从剩余区间中计算出代价最小的区间,此区间的中间角度(或其他的代表角度)作为速度方向进行输出,对速度的大小并不修改,只输出目标速度方向

两种局部规划的方式各有优势,需要根据实际的应用场景来综合应用。

VFH的关键步骤

VFH的关键步骤为如下几步:

1)以飞机为中心建立极坐标系,更新障碍物数据,得到原始障碍物地图

2)对障碍物数据进行膨胀处理得到膨胀地图

3)将膨胀地图进行区间分割,分割为若干个角度区间

4)将距离数据转换为障碍物可信度数据,得到可信度区间地图

5)使用双阈值方式将可信度区间地图转换为二值化区间地图(二值化地图中为0表示无障碍物,1表示有障碍物)

6)二值化区间地图中为0的为可选区间,从可选区间中加入运动约束,去除无法到达的区间,得到有效区间

7)对每个有效区间进行代价计算,得到最终的最优角度作为速度矢量的方向

上述步骤中,关键在于地图的构建,地图构建的流程看下图会更加直观:

地图建立

原始障碍物极坐标地图

对于激光雷达来说,极坐标地图是可以直接建立的,激光雷达的数据拿到的就直接是角度与距离数据,vfh的仿真实验也是基于激光雷达的数据,不过对于使用视觉来识别障碍物的话,道理也是相通的。

障碍物膨胀地图

获取到原始的障碍物地图之后,还需要对障碍物进行膨胀,这样就可以将无人机看作一个质点,将无人机的外形进行简化,膨胀半径可以设置得较大,但最小也应该是无人机的尺寸数据,例如无人机的桨叶到中心的距离是0.5m,那么膨胀半径就至少需要0.5m,这样只要飞机能够跟上规划的轨迹与速度,就可以避免桨叶碰到障碍物边缘。

膨胀角度的计算

假设有一个障碍物,设定了膨胀半径r,找到障碍物的边缘,就可以计算出需要膨胀的角度α,示意图如下:

计算出了对于障碍物边缘,需要膨胀的角度,接下来就是用什么距离去填充,因为在局部规划中,是不知道全局地图的,因此在实际仿真中,我是先将见到的障碍物距离进行膨胀前移,例如检测到的距离是2m,膨胀半径是 0.5m,那么先对检测到的距离进行缩进膨胀,距离改为1.5m,之后假设此时刚好时障碍物边缘,对计算出的膨胀角度,都以1.5m进行填充。

角度补偿

由于飞机飞行的时候有一定的倾角,因此激光雷达测量出的距离,本身是有一定的角度影响的,导致测量到的距离是较大的,而实际障碍物要近,如下所示:

在仿真中使用的飞机模型的最大倾角是35度,按照正常的逻辑,每个激光雷达的距离都需要融合姿态进行角度补偿。

可信度地图

得到障碍物膨胀地图之后,需要将膨胀地图进行可信度的计算,可信度的计算可以理解为反向归一化,障碍物越近,说明此处有障碍物的可信度越高,距离越远,说明障碍物可信度越低。

在进行可信度计算时,将地图进行一定的简化,将地图分做若干个区间,例如分为12个区间,每个区间就是 360/12 = 30 度 的角度,将一个区间 30 度之内的障碍物距离取平均值作为此区间的障碍物距离,之后进行可信度的计算。

按照正常的逻辑,当然可信度越高,表示有障碍物的概率越大,因此与膨胀地图的距离是成反比的,利用最大测量距离进行反向归一化即可:

可信度 = (最大测量距离 - 障碍物距离) / 最大测量距离

可信度二值化地图

在得到可信度地图之后,可信度都为 [0,1] 区间的数,那么需要对可信度地图进行二值化,0代表没有障碍物,1代表有障碍物,在进行二值化时,不能简单的设置一个阈值,高于此阈值就认为是有障碍,低于阈值就是无障碍,这样的做法会带来一个问题,也是局部规划的通病:局部规划是不知道全局地图的,因此很有可能当前计算处理的最优角度与上次计算出来的最优角度相差很大,之后就会陷入方向跳变过大的陷阱。

例如最开始飞机比较远的时候,路线是往一边飞:

因为此时障碍物的间隙占用的角度比较小,但当飞机飞了一段实际之后,这个障碍物间隙越来越大了,就可以飞行了,就会跳转飞行角度:

当然,以上只是一个示意,就是说,局部规划中,会出现方向频繁跳转的问题,一方面可以调节代价系数,另一方面,在 vfh 中使用了双阈值对其进行优化。

vfh的双阈值

vfh 设置了双阈值 Tmax 与 Tmin,可信度高于 Tmax 的置1,低于 Tmin 的置0,中间的,维持上一次的状态,它的含义就是:高于一定的值,是必然有障碍物的,低于一定的值,是必然没有障碍物的,处于中间的值,作为一个过渡区,相当于待定状态,维持上一次的值,有可能是一闪而过的障碍物,也有可能是一闪而过的空隙。

这样做相当于是设置了一个缓冲区,对障碍物进行考核待定,这样子对于保持飞机方向不反复横跳有一定的作用。

可选区间

一般,二值化地图中,为0的,视作可选区间,也就是待定区。

有效区间

得到了可选区间之后,并不是每个可选区间都是可以用于实际飞行的,需要考虑飞机当前能不能飞到区间,因此需要增加一些运动约束,将不能飞到的区间去除掉,剩余的区间就是有效区间。

刹车距离

运动约束可以通过刹车距离来进行约束,根据当前速度来计算如果刹车到 0 的距离,可以参考 px4 中的根据当前距离来计算当前最大速度的方法,只是反过来计算距离而已。

假设当前速度正在以最大加速度 amax 加速,此时是最恶劣的情况,刹车距离为:

计算出当前合速度的刹车距离之后,开始计算可选区间是否是有效的,假如可选区间是 5,当前的飞机速度是在 3 区间,那么如果 5 是有效区间的话,就需要经过 4 区间,读取 4 区间的障碍物距离。根据当前区间的中间角度与当前速度方向的夹角,再对当前的刹车距离进行角度的分解,得到当前区间的分解刹车距离,判断 4 区间的障碍物距离是否大于刹车距离,如果大于,则说明飞机可以正常经过,如果小于,则说明飞机可能会发生碰撞,那么 5 区间就不是有效区间。

代价函数

得到有效区间之后,需要从有效区间中,挑选出最优的角度,作为接下来的飞行方向,此时需要代价函数来挑选,每个区间选择中间角度作为候选角度,按照三个方面的条件来计算代价,一般的考虑思路为:

1)候选方向与目标点方向的偏差

2)候选方向与当前速度方向的偏差

3)候选方向与上次速度方向的偏差

将三个条件各增加一个系数,构成代价函数:

g = k1 * (theta - goal_theta) + k2 * (theta - vel_theta) + k3 * (theta - vel_theta_last)

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

【路径规划】VFH 的相关文章

  • 使用docker-compose连接mysql以及8.0版本遇到的身份验证问题解决方案

    docker compose 使用Docker部署环境非常方便 xff0c Compose项目是 Docker 官方的开源项目 xff0c 负责实现对 Docker 容器集群的快速编排 它允许用户通过一个单独的docker compose
  • EKF—SLAM推导

    转自 http blog csdn net qq 30159351 article details 53408740 这是SLAM最传统的基础 xff0c 是SLAM最原始的方法 xff0c 虽然现在使用较少 xff0c 但是还是有必要了解
  • PX4原生固件源码分析(挖坑)--1、代码结构

    写在开头 最近开始学习PX4源码 xff0c 并进行二次开发 xff0c 苦于网上缺少有关PX4源码的分析 xff0c 于是在这开个坑 xff0c 记录自己学习PX4的过程 xff0c 以此自勉 xff0c 笔者第一次写博客 xff0c 若
  • PX4原生固件源码分析(开填)--2、uORB消息

    写在开头 众所周知 xff0c PX4是通过Mavlink协议进行通信 xff0c 但是Mavlink只是用于外部的通信 xff0c 也就是和QGC地面站进行通信 xff0c 那么PX4中各任务模块相对独立 xff0c 它们之间是怎么通信的
  • 【超详细】基于大疆RoboMaster开发板C型的BMI088数据读取

    超详细 基于大疆RoboMaster开发板C型的BMI088数据读取 这里以博世传感器公司产出的BMI088型号的IMU为例 xff0c 其里面有3轴高精度加速度计和3轴高精度陀螺仪 xff0c 其他的特性不再介绍 同时这里的IMU是安装在
  • IMU综述

    IMU xff08 Inertial measurement unit xff09 xff0c 惯性测量单元 其作用是测量本身的加速度以及角速度 xff0c 有时还通过磁力计来测量朝向 xff0c 当包含磁力计时 xff0c IMU一般被称
  • 【超详细】磁力计数据读取--以IST8310为例

    这里以iSentek公司产出的IST8310型号的磁力计为例 xff0c 尺寸为 3 0 3 0 1 0mm xff0c 支持快速 I2C 通信 xff0c 可达 400kHz xff0c 14 位磁场数据 xff0c 测量范围可达1600
  • 【ADRC】扩张状态观测器(ESO)

    扩张状态观测器是自抗扰控制中非常重要的一个环节 xff0c 在我学习这部分内容后 xff0c 在写本篇文章时 xff0c 大致可以按照三个步骤来做实验 xff0c 推导 xff0c 由这三个步骤来由浅入深地去理解扩张状态观测器 ESO xf
  • 冰冻三尺非一日之寒-自学篇 浅谈个人学习方法

    昨晚还在看比赛 xff08 war3 xff09 xff0c 小源跑过来问我明天1024 xff0c 不写篇文章么 xff0c 想想也是 xff0c 1024这也算个热点 xff0c 赶紧来蹭蹭 xff0c 哈 xff0c 开个玩笑 上次谈
  • 栈中存储什么?

    一条线程对应一个栈 xff0c 一个方法对应一个栈帧 栈中 xff0c 存储的是一个一个的栈帧 xff0c 栈帧存储的是什么呢 xff1f 局部变量表 xff1a 存储的局部变量 xff0c 0位置代表this 操作数栈 xff1a 作用是
  • pdf导入pcb

    分为下面几步 xff1a 1 Illustrator 打开pdf 文件 导出为dxf 2 autocad 打开 xff0c 看看比例对不对 xff0c 缩放比例正确以后 xff0c 保存 旋转命令为rotate 测量为di 放大为sc 3
  • 如何在raspiberry pi上运行x86程序

    如何在raspiberry pi上运行x86程序 第一步 xff1a 下载ExaGear 步骤 xff1a 首选项 gt Add Remove Software gt 搜索ExaGear gt 下载搜索出来的四个包 第二步 xff1a 下载
  • 基于TINY4412的Andorid开发-------简单的LED灯控制【转】

    基于TINY4412的Andorid开发 简单的LED灯控制 阅读目录 Content 一 编写驱动程序二 编写代码测试驱动程序三 编写HAL代码四 编写Framework代码五 编写JNI代码六 编写App 参考资料 xff1a Andr
  • 计算机视觉——opencv-python

    opencv xff1a question1 10 main contentoriginal materialtrouble shootingq1 通道交换q2 灰度化q3 二值化q3 大津二值化算法 xff08 Otsu 39 s Met
  • 数字一阶低通滤波器simulink仿真

    数字一阶低通滤波器simulink仿真 原理程序所用公式滤波系数计算方法 仿真根据公式搭建使用simulink自带模型 原理 程序所用公式 y n 61 q x n 43 1 q y n 1 其中 xff0c y n 表示当前的输出 xff
  • SDFormat

    http sdformat org
  • putty远程连接不上虚拟机里的linux

    昨天跟着阿铭的视频在虚拟机中搭建了centos6 xff0c 然后用putty远程连接成功 今天中午鼓弄putty 的时候 xff0c 连接就报错了 xff1a network error xff1a connection refuse 网
  • 【ADRC】根据ADRC的思想改进PID

    根据前面两篇关于ADRC的文章以及PID原理的文章 xff0c 我们可以利用ADRC的思想来对PID算法做一些改进来看看效果 xff0c 可以将改进的PID称之为非线性PID 主要可以利用跟踪微分器 xff0c 针对PID的两个缺陷来进行改
  • STM32F1 TCA9548A 驱动多个IIC器件

    TCA9548A的用途就是IIC扩展 xff0c 每个TCA9548A可以扩展出8路IIC TCA9548A芯片带有地址选择引脚A0 A1 A2 xff0c 根据高低电平不同 xff0c 从MCU的一路IIC最多可以接入8个TCA9548A
  • 无限 for 循环的实现【Python】

    for 循环怎么才能无限循环下去呢 xff1f 1 最 low 的方法 xff1a 一个无限的列表 理解 for 在干什么 xff0c 在遍历 xff0c 那我们给他一个无限长的东西 xff0c 不就无限循环了 list span clas

随机推荐

  • VirtualBox 安装增强功能时无工具栏

    最近在学Ros xff0c 老师虚拟机用的是VirtualBox xff0c 在安装增强功能时 xff0c 找不到窗口顶部的工具栏 xff0c 如图 1 1所示 查了不少解决方案 xff0c 总结如下 图 1 1 Virtu alBox虚拟
  • Eigen库中的Identity()函数作用

    今天学习Eigen库 xff0c 看到示例代码中有这样一行 xff1a Matrix3d rotation matrix 61 Matrix3d Identity Matrix3d xff1a Eigen库中typedef的数据类型 xff
  • SLAM十四讲-ch3-vistalizegeometry编译问题

    最近在学高翔博士的 SLAM十四讲 xff0c 在ch3中运行vistalizegeometry这个demo的时候 xff0c 出现如下报错信息 xff08 图片版报错看不清的话 xff0c 文末 附文字版的报错信息 xff09 xff1a
  • C++库fmt缺失导致编译失败的解决方案【SLAM十四讲/ch4】

    最近学习高翔博士的SLAM十四讲 xff0c 学到ch4的时候 xff0c 实际运行demo报错 查看CMakeLists txt xff0c 发现Ubuntu20 04需要额外安装fmt库才可以编译通过 解决方法 xff1a 直接去fmt
  • SLAM十四讲编译全过程记录与错误与解决方案汇总

    章节目录 ch2 ch3 ch4 ch5 ch7 ch8 ch9 ch10 ch11 ch2 编译正常 xff0c log如下 xff1a slambook2 master ch2 mkdir build amp amp cd build
  • ROS安装:一键解决人生烦恼

    首先 xff0c 这个方法不是我发明的 xff0c 详情请见文末链接 不管你是unbuntu 16 18 20 xff0c 不管你是新安装的系统 xff0c 还是ROS装了一部分进行不下去的烂摊子都适用 xff01 直接输入下面这一行代码
  • 【Eigen库使用】角轴、旋转矩阵、欧拉角、四元数转换

    零 前言 在slam中经常用到的四种描述机器人orientation的变量 xff0c 他们之间可以相互转化 xff0c 使用Eigen库可以很容易的做到这一点 xff0c 需要特别关注的是 xff1a 欧拉角与其余量之间的转换关系 xff
  • 【Gazebo/ROS】阿克曼小车仿真环境设置中的心得体会

    最近科研需要在gazebo中做一个阿克曼小车的仿真 xff0c 要求小车运动能够通过话题来控制 xff0c 小车上要安装激光雷达 imu 相机等传感器用于SLAM定位建图 由于是第一次接触gazebo仿真 xff0c 所以分享一下学习心得
  • 【ADRC】自抗扰控制

    在根据前面四篇文章的自抗扰控制各个功能部分的分解介绍以及对于PID算法原理的分析之后 xff0c 具体可以查看我的主页 之后我们可以画出自抗扰控制的框图 xff0c 并作出自抗扰的仿真了 自抗扰的组成部分 ADRC说得更直白一些 xff0c
  • 【磕盐随记】对两种机器人ROS代码结构的思考与总结

    本帖看似短小 xff0c 但是凝结了我这一个月的全部心得体会 xff0c 日后打算专门出一期视频专门说说ros机器人的代码结构和类设计 xff0c 今天先在这里简单记录一下 到目前我接触过两种架构 xff0c 根据多节点式和单节点式 自己发
  • 【磕盐随记】IMU数据的运用——姿态R对时间t求导

    一 前言 IMU能够测量到三轴加速度和角速度 xff0c 那么如何在slam中使用imu测量得到的数据呢 xff1f Fast lio的论文中有很好的演示 xff1a 上述公式中 xff0c 最让我不能理解的就是这个 d R d
  • 【磕盐随记】Nodelet类的简明使用

    前言 一直不太懂ROS的Nodelet xff0c 今天佳爷给我拿他的 Elastic Tracker 作为例子给我讲了一下 xff0c 在此简单记录 xff0c 方便后续使用 一 Nodelet的工作原理 nodelet是用来方便ros的
  • 有功功率、无功功率、视在功率、功率因素

    有功功率 xff08 平均功率 xff09 P 61 UI cos 单位为W xff08 瓦 xff09 U单位V xff08 伏 xff09 xff0c I单位A xff08 安 xff09 无功功率 Q 61 UI sin 单位为Var
  • KEIL 生成bin文件 MDK 51 ram bin 文件

    使用keil做项目开发 xff0c 并且需要做IAP功能时 xff0c 就需生成bin文件 xff0c bin文件相比于hex文件更小 xff0c 一般用 bin文件作为升级文件 keil无法像iar一样通过工程设置直接输出bin文件 xf
  • ADC 采样数据抖动

    MSP430或STM32 xff0c 在使用内部ADC出现的采样数据异常抖动问题 采样设计 xff1a 用于检测供电线路电流及电压 产品运行在两种模式下 xff0c 1 低功耗静态模式 xff08 仓储态 xff09 xff0c 2 全功能
  • CC1310 基于CCS工程建立+Sensor Controller ADC

    基于TIRTOS xff0c PacketTx 43 Sensor Controller ADC 43 CCS工程建立 需要的工具 xff1a 1 simplelink cc13x0 sdk 3 20 00 23 CC1310的SDK xf
  • linux w5500 驱动及使用

    1 驱动 驱动来源 a 内核驱动 xff1b b xff1a 官方驱动 a 内核 xff1a linux内核w5500驱动 xff0c 包含两个源文件w5100 c和w5100 spi c kernel drivers net ethern
  • 扩展 IO pca95555 linux驱动 及使用

    驱动 xff1a 内核驱动 xff1a kernel drivers gpio gpio pca953x c make menuconfig配置编译 或拷贝出来手动编译成模块加载 设备树 xff1a 使用2个芯片 xff0c 在同一i2c总
  • Linux内核崩溃 dump调试

    内核 crash 崩溃 xff0c oops消息 xff0c dump oops xff08 也称 panic xff09 xff0c 称程序运行崩溃 xff0c 程序崩溃后会产生oops消息 应用程序或内核线程的崩溃都会产生oops消息
  • 【路径规划】VFH

    简介 在没有全局地图或者是应对动态障碍物的情况下 xff0c 往往是运用局部规划来进行绕障 xff0c 在局部规划的经典算法中 xff0c 比较常用的是 DWA 与 VFH xff0c VFH 全名向量场直方图算法 xff0c 不同于 DW