本节和前一节 【现代机器人学】学习笔记八:轨迹生成 不同,侧重于避障的内容。

有一些我认为的重要的基本的概念:

1.路径规划是一个纯几何问题,寻找一条无碰撞路径,不涉及动力学和时间相关内容。因此路径规划是运动规划的子问题,运动规划是要涉及到动力学、时间、运动约束等内容的。
2.控制输入的总数小于自由度数目,机器人无法跟踪多条路径。
3.如果解存在,运动规划能在有限时间找到解,并且在没有解的情况下报告错误,认为该运动规划算法是完整的。
4. 对问题进行离散化表示,能在分辨率层级上找到解,称算法在分辨率层级上是完整的。
5.在时间趋近于无穷大的时候,找到解的概率趋近于1,称算法在概率上是完整的。

位形空间障碍

位形空间C可以被划分为两部分,自由空间和障碍空间。关节限位可以被当作位形空间中的障碍物处理。

其他内容可以看书中的图,内容挺简单的。

到障碍物的距离与碰撞检测

可以用不同分辨率的球体来模拟机器人和障碍物,所以机器人和障碍物之间的距离为:机器人和障碍物上最近的球体的球心的距离减去两个球体的半径。

A*算法

A*算法主要是启发式函数h和代价函数g相加得到的f值来判断节点的分数,并优先扩展f分数低的节点周围的点,并同时更新代价函数g。
实现:
python版:利用Python实现A*算法路径规划 - 静水流深的文章 - 知乎
这个内容写的非常的好,内容直观,并且有对应的可视化代码。
C++版本:
推荐一个博主的实现,曾经在工程中用过,感觉非常好。
https://github.com/zhangpanyi/a-star-algorithm 具体来说,做了几点优化: 1.建立一个和地图一样大的二维数组,通过查询的方法快速确定节点是否在openlist和closelist中。 2.构建二叉堆,通过上滤的方式实现sort操作,快速查找f值最小的节点。 3.将1进一步优化,将二维数组更新成一维数组。 4.新增节点的时候会调用C++的new函数频繁分配内存,在这里作者摘选了box2d(一个模拟2D刚体物体的 C++物理引擎)的小对象分配器来代替C++的new函数,又将速度提升了3倍。 最终效果:1000*1000的地图中以几毫秒的速度实现路径的搜索,十分高效和快速,建议大家去学习一下。

关于A*算法的内容,有几个需要掌握:

  1. 启发式函数如果估计为0,则算法退化为迪杰斯特拉算法。而如果每条边成本都相同,则迪杰斯特拉算法退化为广度优先搜索算法。

  1. 启发函数的估计值如果小于到终点的真实值,则一定能找到最优解。

  1. 对启发式函数乘以大于1的常数因子,对启发函数进行过高估计,A*算法则慢慢偏向于贪心算法,找到解可能更快。但是这种方法不能保证找到最优解。

  1. 允许斜着走,则使用欧几里德距离。不允许斜着走,则使用曼哈顿距离。东南西北邻居成本为1,对角邻居成本是根号二。工程上可以使用近似成本5和7来用整数计算代替。

  1. A*算法路径规划器是分辨率完备的。

波前规划器(wavefront)

一言以蔽之:目标位形分数为0,用广度优先,从0开始向外扩散,扩散完地图后,从当前位置出发,按数字下坡即可。

有运动约束时的网格方法

轮式移动机器人

这个书中讲的很复杂,但其实就是考虑到了机器人的动力学约束,然后使用一个控制时间Δt,对离散的控制集合(线速度角速度)在Δt内进行积分,并且根据结果判断是否碰撞,并对应的扩展网格。

要求:

  1. Δt要小,让运动步长变小

  1. 网格尽可能大,节省计算

  1. 确保离散控制集合中的任何控制在Δt时间内,能从一个网格移动到另一个网格。

机械臂网格规划

简单总结:

根据有限关节力矩情况下可行的加速度集合,确定离散的动作集合。

根据动作集合中的动作,用Δt进行积分,确定机械臂关节位置。并通过位置判断是否发生碰撞。广度优先搜索完,确定各个时刻的加速度动作。

为分辨率提升倍数,为时间节省的倍数,为关节数:
完成搜索的计算时间会扩充倍。

RRT算法(快速探索随机树)

步骤可以简单概括:地图上随机采样点,然后找树中最近的点,然后从最近的点到随机点的方向延伸一段距离,未碰撞则加入树中。直到到达终点附近。

(当然也有算法随机采样点,是有0.5的概率随机采样,有0.5的概率直接选取终点)

1.RDT(快速探索密集树,Rapidly-exploring Dense Tree),不是采用随机采样的方法,而是采用确定性采样的方案, 在多分辨率的网格上逐渐密集采样。这个变种方法叫RDT。
2.RRT在“确定最近点“上可能没有那么简单,因为以汽车为例,侧方的看似离得近,因为它不能横着走,所以其实反而是不近的。
3.双向RRT:从起点和终点倒着走,交替生长,并且尝试连接两个树。(速度更快,但是缺点是可能找不到连接两个树的点)
4.RRT*:不断对节点进行重新连接,(判断各个点是否能以较低的代价到达新扩展的点)。RRT和RRT*在概率上是完备的,但RRT*找到的解更接近于最优解。

PRM算法(概率路线图Probabilistic RoadMap)

先采样N个点,然后找到每个点的k个最近的邻居,确定无碰撞的连接关系并进行连线。

在障碍物附近更密集的采样,可以提高通过狭窄通道的可能性。

虚拟势场法

  • 目标提供吸引力,障碍物提供斥力。并且限制最大力,避免在障碍物附近产生无限大的力。

  • 缺点是机器人可能会被卡在势场的局部最小值。

  • 在得到合力以后,如何控制机器人?1.应用算出的力加阻尼,减少振荡。2.把力算作速度指令,消除振荡。

  • 使用导航函数(navigation function)替换虚拟势函数。(即需要满足几点:1.在位置上两次可微,2.障碍物边界有最大值,3.目标点有最小值,4.在所有满足导航函数对位置求导为0的地方,二阶导数的海塞Hessian矩阵满秩),如果这样可以使得没有局部最小值。

  • 对于受约束的机器人,可以把得到的合力,根据动力学那节的内容【现代机器人学】学习笔记七:开链动力学(前向动力学Forward dynamics 与逆动力学Inverse dynamics),用P矩阵,把用于约束的力滤掉,剩下的力用于控制。

非线性优化

和slam中的许多问题一样,非线性优化也是一个很好的方法。

在得到一个初值的情况下启动流程,并且参数化轨迹、或参数化控制,或二者都参数化(并且提供轨迹和控制之间的约束),进行非线性优化,通过优化的方式,得到最终的结果参数。

平滑

  1. 对于非线性优化问题,添加一个成本代价函数,惩罚迅速变化的控制,从而使得控制平滑。这个思路还是蛮常见的,在我之前涉及到的强化学习控制机器人上也是一个经典的思路,其实并不限于优化问题。

  1. 尝试连接较远的无碰撞点,这样近的波折点就可以被替换为一个长长的直线,避免之字形折返。

【现代机器人学】学习笔记九:运动规划相关推荐

  1. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  2. python3.4学习笔记(九) Python GUI桌面应用开发工具选择

    python3.4学习笔记(九) Python GUI桌面应用开发工具选择 Python GUI开发工具选择 - WEB开发者 http://www.admin10000.com/document/9 ...

  3. 吴恩达《机器学习》学习笔记九——神经网络相关(1)

    吴恩达<机器学习>学习笔记九--神经网络相关(1) 一. 非线性假设的问题 二. 神经网络相关知识 1.神经网络的大致历史 2.神经网络的表示 3.前向传播:向量化表示 三. 例子与直觉理 ...

  4. ROS学习笔记九:用C++编写ROS发布与订阅

    ROS学习笔记九:用C++编写ROS发布与订阅 本节主要介绍如何用C++编写一个简单的ROS发布与订阅. 编写发布节点 在之前创建的例子beginner_tutorials软件包中,在其目录下的src ...

  5. at24c16如何划分出多个读写区_AVR学习笔记九、基于AT24C16的数据存储实验

    Ema{@AVR 学习笔记九.基于 AT24C16 的数据存储实验 ------- 基于 LT_Mini_M16 9.1 用 I/O 口模拟 I2C 总线实现 AT24C16 的读写 9.1.1 .实 ...

  6. JavaScript学习笔记(九)(验证框架,layer弹出层)

    JavaScript学习笔记(九) 一.jQuery Validate验证框架 1.引入相关插件路径 2. 修改一些规则 3. 自定义验证规则 4.异步验证 整体代码 二.layer弹出层 1.引入相 ...

  7. ArcGIS案例学习笔记4_2_城乡规划容积率计算和建筑景观三维动画

    ArcGIS案例学习笔记4_2_城乡规划容积率计算和建筑景观三维动画 概述 计划时间:第4天下午 目的:城市规划容积率计算和建筑三维景观动画 教程: pdf page578 数据:实验数据\Chp13 ...

  8. OpenCV学习笔记(九)——图像轮廓(下)

    <OpenCV轻松入门:面向Python>学习笔记(九) 1-3 查找并绘制轮廓.矩特性及Hu矩 4-5 轮廓拟合及凸包 6. 利用形状场景算法比较轮廓 6.1 计算形状场景距离 6.2 ...

  9. Polyworks脚本开发学习笔记(九)-公差控制及制作报告

    Polyworks脚本开发学习笔记(九)-公差控制及制作报告 定义公差 系统有默认的公差设置,可以在选项中进行系统的默认设置,但往往不是想要的.比如下图的XYZ三向都是-/+1,我想只控制Y向并且公差 ...

最新文章

  1. kafka备份机制——zk选举leader,leader在broker里负责备份
  2. 压缩机电流保护原因是什么?压缩机烧毁常见原因有哪些?
  3. mysql的从节点能否执行事务_MySQL执行事务的语法与流程详解
  4. CF467C George and Job
  5. MySQL SHELL 缓存历史命令
  6. ajax长链接--拉实现
  7. 【C语言笔记初级篇】第六章:指针入门
  8. 【Spring】Spring 深入理解注解及spring对注解的增强
  9. 【设计模式】重载和重写
  10. 思维模型 后天天赋(盖洛普天赋分析)
  11. CVE-2022-27778漏洞修复
  12. 如何使单片机复位可靠,单片机复位电路?
  13. 传奇设置云服务器的端口,传奇服务器端口设置详细攻略详细操作分享
  14. 0基础学习前端开发,高职web前端开发技能大赛
  15. linux及安全期中总结——20135227黄晓妍
  16. python:实现叠加图片(附完整源码)
  17. 直播 | 企业级应用Service Management Automation X(SMAX)的微服务之路
  18. [USACO 2017DEC] Greedy Gift Takers
  19. hadoop101: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
  20. 用python怎么赚钱-利用python能怎么挣钱

热门文章

  1. 牛客小白月赛17 A 小sun的假期
  2. 【考研线代】三. 向量
  3. 2017阿里巴巴技术论坛,本周起将席卷全球四大顶级名校!
  4. 服务器系统安全扫描,服务器安全第一步:防扫描 -电脑资料
  5. 专业分析室内装修墙面集成板好还是墙砖好
  6. JSP页面请求响应过程中的编码解码
  7. 一个农村小姑娘的麻辣作文
  8. python去除\n
  9. 怎样在Linux下修复U盘驱动器
  10. MyBatis 常用标签简单总结