参考文献:

  • 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. Neo4j入门日志(一)导入数据

    本文主要来源于: neo4j的官方文档 使用的是neo4j官方提供的导入方式,即使用import,在cmd中进行导入. 1.导入的基本方式 bin/neo4j-admin import --datab ...

  2. Bagging与随机森林

    Bagging Bagging是并行式集成学习算法最著名的代表,基于自助采样法(bootstrap sampling). 给定m个样本的数据集,选取m次,每次选1个样本,构成一个新的样本集,其中有的样 ...

  3. 量化研究之“大A打板敢死队”是如何做换手板与撬板的?

    更多精彩内容,欢迎关注公众号:数量技术宅,也可添加技术宅个人微信号:sljsz01,与我交流. 涨停跌停板分类 涨停.跌停是A股特有的现象,其他主要市场,例如美股.港股都不存在涨跌停的规则.涨停.跌停 ...

  4. Qt:QReadWriteLock

    0.说明 QReadWriteLock类提供了读写锁. 读写锁是一种保护那些可以读写的资源的同步工具,如果有多个线程同时要进行读操作,但是有一个线程想要写入,那么所有其他线程都会等待直到这个写线程完成 ...

  5. c语言刷lleetcode记录

    155. 最小栈 笔记: 在push(压栈)的时候思路: typedef struct MinStack{ int data; struct MinStack *next; } MinStack; / ...

  6. HarmonyOS方舟开发框架容器类API的介绍与使用

    作者:liuxin,华为高级工程师 容器类,顾名思义就是存储的类,用于存储各种数据类型的元素,并具备一系列处理数据元素的方法.在方舟开发框架中,容器类采用了类似静态的语言来实现,并通过NAPI框架对外 ...

  7. CentOS 8 网卡命令使用

    之前一直用CENTOS7中service来重启网卡,但是换成CENTOS8后centos8的网卡服务与centos7有所不同,无法通过systemctl或者service命令重启网卡.centos8网 ...

  8. java 中判断输入是否合法 if (变量名.hasNextInt())

    //案例: Scanner sc = new Scanner(System.in); System.out.println("你选择了新修改商品功能!"); System.out. ...

  9. Net6 Configuration & Options 源码分析 Part1

    Net6 Configuration & Options 源码分析 Part1 在Net6中配置系统一共由两个部分组成Options 模型与配置系统.它们是两个完全独立的系统. 第一部分主要记 ...

  10. 那些年,Android开发踩过的坑

    首先讲一讲环境配置吧,一般刚上手Android编程,推荐的两款软件开发工具有Eclipse和Andriod Studio,配置环境来讲呢,Android Studio配置环境要快得多,而且比起Ecli ...