State Lattice Planner(状态栅格规划)
参考文献:
- Efficient constrained path planning via search in state lattices
- Differentially Constrained Mobile Robot Motion Planning in State Lattices
- Spatiotemporal state lattices for fast trajectory planning in dynamic on-road driving scenarios
1. 整体思想
状态栅格,顾名思义就在在普通的栅格化地图的基础上,加多了机器人运动学模型的约束,确保机器人能沿着相邻两点之间生成的路径运动,并且能够具有状态连续性(速度连续等)。
2. 普通栅格(grid)与状态栅格的异同点
相同之处:它们都是将连续空间离散化,简化路径规划。
不同之处:状态点阵中,每个顶点的连线都是根据机器人的运动学模型生成的,都是切实可行的路径,而普通栅格(grid)的方法并没有结合模型,所以两点之间的路径,机器人并不一定能通过,举个例子:
如果现在机器人是一辆四轮小车,图1是栅格地图,图二是根据四轮小车的运动学模型建立的规则点阵(红色点,没画全,意思一下)。假设小车初始角度水平向右,对于小车而言,图1的蓝色路径,它是没办法走的,因为B点处得转角是90度,而小车转弯是有一定弧度的,对于图2而言,假设小车将的转弯角度离散化成三个方向,每个节点之间的路径都可通行。
3. 状态栅格生成
对于普通栅格点,直接给定栅格距离等,直接生成就好,而状态点阵需要结合机器人的运动空间去生成。
有两种生成方法,分别为对控制空间的采样和对状态空间的采样。
3.1 控制空间的采样(前向采样)
已知机器人的运动学模型,则输入我们输入控制量u和积分时间T,向前积分预测后面时刻机器人的状态,代码里这里的操作是暴力遍历,从而得到一系列状态的集合,成为控制空间的采样。例如下图:a图是四轮小车,b图是小车当前可运动的六种可能性,c是部分采样,d是完全采样。
所以控制空间采样并没有预先固定点阵的位置,而是通过控制空间的采样,形成一定规则的,可行的状态点阵。
3.2 状态空间的采样(逆向采样)
逆向,也就是指定了相邻点,结合机器人的模型,逆向算出当前点到相邻点的可能路径,放张图就很好理解前向和逆向采样的区别。
逆向采样的计算较为复杂,还涉及到了求解边界值(BVP)的问题,经典的两点边界值问题是多项式方程求解系数的过程,这个如何求,具体这里不做介绍。具体见最下面参考博客链接和论文链接。
可以留意到,状态空间采样是考虑了目标点的反向规划,同时考虑了障碍物环境信息和机器人的运动学模型,所以相比于控制空间,状态空间采样更加常用。
4 借助状态栅格进行运动规划
新建的状态点阵图是有向图,因此在建立了状态图的基础上,可以使用任何图搜索算法进行路径规划,比如A*、D*等等,具体的如何设置代价函数等等,不在此讨论。
思考:state lattice算法适用于什么对象,有什么局限性或显著有点
1)运动能力有一定约束的对象,比如四轮机器人(不包括麦克纳姆轮),不能原地转弯,并且转角也有一定限制,因为这类机器人更适合通过离散化运动空间来做规划,当然比如人形机器人等等,这种运动能力强,能原地转弯,360度都可行的机器人,用类似采样的方法,个人觉得就有点失去了机器人本身运动能力的意义了;
2)因为本质上还是采样的运动空间,所以在这个状态点阵图上规划路径,不是严格最优的路径,做不要严格的时间最优或者距离最优,只能是相对的在采样图上的距离或者时间最优;
3)State lattice最友好的地方在于可以比较简单地对路径进行多维约束,比如一个小车,考虑的规划维数为平面X和Y坐标,以及车头朝向和路径曲率(x, y, theta,curvature),这些约束可以很好应用于生成候选状态点阵,需要结合模型规划就显得简单了;
4)理论上这个状态栅格地图可以离线建立,然后在线规划,可以实现实时规划
疑惑:有一个点还不是很明白,状态栅格点图建立的是局部地图呢,还是全局地图呢?Efficient constrained path planning via search in state lattices 一文中,在第4.2节生成Path primitives时,对于采样代码是结束条件这样描述的:This process terminates at a certain radial distance from the origin when all paths at that distance can be composed. 从这句话可以理解到,状态栅格算法生成的地图,是基于一定范围内的地图,按我的理解,也就是运行过程中需要根据机器人信息,多次建立状态栅格地图,与离线地图又相悖了,欢迎讨论指教!
相关代码:
https://github.com/Alanaab/MotionPlanning
https://github.com/amslabtech/state_lattice_planner
参考文献:
- Efficient constrained path planning via search in state lattices
- Differentially Constrained Mobile Robot Motion Planning in State Lattices
- Spatiotemporal state lattices for fast trajectory planning in dynamic on-road driving scenarios
参考博客:
https://blog.csdn.net/space_dandy/article/details/114396542
https://zhuanlan.zhihu.com/p/14
State Lattice Planner(状态栅格规划)的更多相关文章
- 关于Lattice Planner规划算法的若干问答
Apollo问答 | 关于Lattice Planner规划算法的若干问答 上周,我们在Apollo开发者交流群内做了关于Lattice Planner的分享.这里,我们将社群分享里开发者提出的问 ...
- lattice planner 规划详解
大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...
- State management(状态管理)
State management https://en.wikipedia.org/wiki/State_management UI控件的状态管理, 例如按钮的灰化.只读.显示隐藏等. 特殊地一个控件 ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- State Design Pattern 状态设计模式
设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就非常easy了. # ...
- 夺命雷公狗-----React---7--组建的状态props和state
props:组建初始要渲染的数据,他是不可以改变的 state:组建状态发生改变,调用render重新渲染数据 我们来写一个例子: <!DOCTYPE html> <html lan ...
- State状态设计模式
1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...
- c++ 状态模式(state)
/************************************************************************/ /* 状态模式 */ /************* ...
- 泛函编程(16)-泛函状态-Functional State
初接触泛函状态觉着很不习惯.主要是在使用State数据类型时很难理解其中的原理,特别是泛函状态变迁机制(state transition mechanism):怎么状态就起了变化,实在难以跟踪.我想这 ...
随机推荐
- Python:序列化 pickle JSON
序列化 在程序运行的过程中,所有的变量都储存在内存中,例如定义一个dict d=dict(name='Bob',age=20,score=88) 可以随时修改变量,比如把name修改为'Bill',但 ...
- Objective-C 基础教程第六章,源文件组织
目录 Object-C 基础教程第六章,源文件组织 0x00:前言 0x01:Xcode创建OC类 0x02:Xcode群组 0x03 Xcode跨文件依赖关系 @class关键字 导入和继承 小结 ...
- Azure DevOps 介绍
伴随着敏捷的遍地开花,如今各个开发团队越来越希望可以实现敏捷在自己团队内的落地,但是往往单纯的依赖人力难以实现敏捷的各个环节的管理, 大家开始渐渐的意识到,为了按时交付软件产品和服务,开发和运营工作必 ...
- 微服务入门二:SpringCloud(版本Hoxton SR6)
一.什么是SpringCloud 1.官方定义 1)官方定义:springcloud为开发人员提供了在分布式系统中快速构建一些通用模式的工具(例如配置管理.服务发现.断路器.智能路由.微代理.控制总线 ...
- SpringMVC入门二:SSM整合(spring+springmvc+mybatis)
一.编程步骤 1.引入依赖 spring.springmvc.mybatis.mybatis-spring.mysql.druid.log4j.servlet-api.jstl.fastjson 2. ...
- VirtualBox 共享文件夹设置
1. 安装VirtualBox的增强功能 2. 设置共享文件夹 参考:VirtualBox主机与虚拟机文件夹共享
- Bugku CTF_web3
1.打开网页,得到信息如下 2.在hackbar里构造url如下 3.得到flag 4.本题的考点在于读的懂PHP代码,并且学会构造get参数.
- 【spring】事务底层的实现流程
事务简单介绍 本文源码基于spring-framework-5.3.10. 事务是基于AOP的机制进行实现的! Spring事务基本执行原理 一个Bean在执行Bean的创建生命周期时,会经过Infr ...
- 二级py--day3
二级PY--day3 1.结构化程序设计方法主要原则:自顶向下.逐步求精.模块化.限制使用goto语句 2.三种控制结构:顺序.选择和重复(循环) 3.结构化程序强调:程序的可复用性 4.结构化程序设 ...
- laravel8 登录功能的实现
1.选择合适的框架,渲染出如上图所示的登录视图,视图有样式即可,可使用BootStrap或layUI去布局实现(10分) 2.正确显示出验证码(10分) 3.验证码要求无杂点.无干扰线,4位纯数字(1 ...