参考文献:

  • 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

转自:https://zhuanlan.zhihu.com/p/403822524

State Lattice Planner(状态栅格规划)的更多相关文章

  1. 关于Lattice Planner规划算法的若干问答

    Apollo问答 | 关于Lattice Planner规划算法的若干问答   上周,我们在Apollo开发者交流群内做了关于Lattice Planner的分享.这里,我们将社群分享里开发者提出的问 ...

  2. lattice planner 规划详解

    大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...

  3. State management(状态管理)

    State management https://en.wikipedia.org/wiki/State_management UI控件的状态管理, 例如按钮的灰化.只读.显示隐藏等. 特殊地一个控件 ...

  4. State模式(状态设计模式)

    State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...

  5. State Design Pattern 状态设计模式

    设置好内部状态,然后依据不同的函数作为行为模式,进行状态转换. 有点像Finite Automata算法,两者的思想是一样的. 会Finite Automata,那么这个设计模式就非常easy了. # ...

  6. 夺命雷公狗-----React---7--组建的状态props和state

    props:组建初始要渲染的数据,他是不可以改变的 state:组建状态发生改变,调用render重新渲染数据 我们来写一个例子: <!DOCTYPE html> <html lan ...

  7. State状态设计模式

    1.状态模式:改变对象的行为 一个用来改变类的(状态的)对象. 2:问题:当你自己实现 State 模式的时候就会碰到很多细节的问题,你必须根据自己的需要选择合适的实现方法, 比如用到的状态(Stat ...

  8. c++ 状态模式(state)

    /************************************************************************/ /* 状态模式 */ /************* ...

  9. 泛函编程(16)-泛函状态-Functional State

    初接触泛函状态觉着很不习惯.主要是在使用State数据类型时很难理解其中的原理,特别是泛函状态变迁机制(state transition mechanism):怎么状态就起了变化,实在难以跟踪.我想这 ...

随机推荐

  1. Nhibernate Batch update returned unexpected row count from update; actual row count: 0 解决方案

    以前在session.Update(object).没发现啥问题,最近update的时候,老是报错:Nhibernate Batch update returned unexpected row co ...

  2. idea教程--Maven 骨架介绍

    简单的说,Archetype是Maven工程的模板工具包.一个Archetype定义了要做的相同类型事情的初始样式或模型.这个名称给我们提供来了一个一致的生成Maven工程的方式.Archetype会 ...

  3. Python:Scipy.interpolate

    注意 以下插值函数中,待插值点的坐标,最好按次序排列(参与插值的基准点的坐标可以打乱次序).如果打乱顺序,可能会导致插值结果异常(插值异常而不是错误,不会报错,但是结果有明显异常). griddata ...

  4. Qt:QNetworkAccessManager

    0.说明 QNetworkAccessManager允许应用发送Request并接受回应. 网络访问API是围绕一个QNetworkAccessManager对象构建的,该对象保留了所有它发送的请求的 ...

  5. docker入门-docker应用场景和优势

    一.什么是docker Docker是一个使用 Go 语言开发的,并且开源的应用容器引擎,基于LXC(Linux Container)内核虚拟化技术实现,提供一系列更强的功能,比如镜像.Dockerf ...

  6. 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-1

    基于Kubernetes/K8S构建Jenkins持续集成平台(上)-1 Jenkins的Master-Slave分布式构建 什么是Master-Slave分布式构建 Jenkins的Master-S ...

  7. DFT/FFT/NTT

    在Seal库和HElib库中都用到了NTT技术,用于加快多项式计算,而NTT又是FFT的优化,FFT又来自于DFT,现在具体学习一下这三个技术! 基础概念 名词区分 1.DFT:离散傅立叶变换 2.F ...

  8. PHP动态修改配置文件

    文件结构: index.php 主页 config 配置文件 doUpdate.php 修改功能页 index.php <html> <head> <title>修 ...

  9. CodeReview规范

    目标和原则 提高代码质量,及早发现潜在缺陷,降低修改/弥补缺陷的成本 促进团队内部知识共享,提高团队整体水平 评审过程对于评审人员来说,也是一种思路重构的过程,帮助更多的人理解系统 是一个传递知识的手 ...

  10. CSRF、DDos避免方式

    XSS(Cross-Site Scripting,跨站脚本攻击)是一种代码注入攻击.攻击者在目标网站上注入恶意代码,当被攻击者登陆网站时就会执行这些恶意代码,这些脚本可以读取 cookie,sessi ...