Minimum Snap轨迹规划详解(1)轨迹规划
一. 轨迹规划是什么?
在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划。运动规划一般又分为两步:
1、路径规划:在地图(栅格地图、四\八叉树、RRT地图等)中搜索一条从A点到B点的路径,由一系列离散的空间点(waypoint)组成。
2、轨迹规划:由于路径点可能比较稀疏、而且不平滑,为了能更好的控制机器人运动,需要将稀疏的路径点变成平滑的曲线或稠密的轨迹点,也就是轨迹。
2. 轨迹是什么?注意低次项在前
轨迹一般用n阶多项式(polynomial)来表示,即

其中p0,p1,...,pn为轨迹参数(n+1个),设参数向量p=[p0,p1,...,pn]T,则轨迹可以写成向量形式。

对于任意时刻t,可以根据参数计算出轨迹的位置P(osition),速度V(elocity),加速度A(cceleration),jerk,snap等。

一个多项式曲线过于简单,一段复杂的轨迹很难用一个多项式表示,所以将轨迹按时间分成多段,每段各用一条多项式曲线表示,形如:

k为轨迹的段数,
为第i段轨迹的参数向量。
此外,实际问题中的轨迹往往是二维、三维甚至更高维,通常每个维度单独求解轨迹。
3. Minimum Snap轨迹规划
轨迹规划的目的:求轨迹的多项式参数p1,...,pk。
我们可能希望轨迹满足一系列的约束条件,比如:希望设定起点和终点的位置、速度或加速度,希望相邻轨迹连接处平滑(位置连续、速度连续等),希望轨迹经过某些路径点,设定最大速度、最大加速度等,甚至是希望轨迹在规定空间内(Obstruction check)等等。
通常满足约束条件的轨迹有无数条,而实际问题中,往往需要一条特定的轨迹,所以又需要构建一个最优的函数,在可行的轨迹中找出“最优”的那条特定的轨迹。 所以,我们将问题建模(fomulate)成一个约束优化问题,形如:

这样,就可以通过最优化的方法求解出目标轨迹参数p。注意:这里的轨迹参数p是多端polynomial组成的大参数向量
我们要做的就是:将优化问题中的f(p)函数和Aeq,beq,Aieq,bieq参数给列出来,然后丢到优化器中求解轨迹参数p。
Minimum Snap顾名思义,Minimum Snap中的最小化目标函数是Snap(加速度的二阶导),当然你也可以最小化Acceleration(加速度)或者Jerk(加速度的导数),至于它们之间有什么区别,quora上有讨论。一般不会最小化速度。

4. 一个简单的例子
给定包含起点终点在内的k+1个二维路径点pt0,pt1,...,ptk,pti=(xi,yi),给定起始速度和加速度为v0,a0,末端加速度为ve,ae,给定时间T,规划出经过所有路径点的平滑轨迹。
a. 初始轨迹分段与时间分配
根据路径点,将轨迹分为k段,计算每段的距离,按距离平分时间T(匀速时间分配),得到时间序列t0,t1,...,tk。对x,y维度单独规划轨迹。后面只讨论一个维度。
时间分配的方法:匀速分配或梯形分配,假设每段polynomial内速度满足匀速或梯形速度变化,根据每段的距离将总时间T分配到每段。

这里的轨迹分段和时间分配都是初始分配,在迭代算法中,如果 Obstruction check和 feasibility check不满足条件,会插点或增大某一段的时间。
b. 构建优化函数
Minimum Snap的优化函数为:


其中,

注意:r,c为矩阵的行索引和列索引,索引从0开始,即第一行 r=0。
可以看到,问题建模成了一个数学上的二次规划(Quadratic Programming,QP)问题。
c. 构建等式约束方程
- 设定某一个点的位置、速度、加速度或者更高为一个特定的值,可以构成一个等式约束。

例如:

由于要过中间点,对中间点的位置也构建等式约束,方法同上。
2. 相邻段之间的位置、速度、加速度连续可以构成一个等式约束

例如第i、i+1段的位置连续构成的等式约束为

合并所有等式约束,得到

等式约束个数=3(起始PVA)+k-1(中间点的p)+3(终点pva)+3(k-1)(中间点PVA连续)=4k+2。
d. 构建不等式约束
不等式约束与等式约束类似,也是设置某个点的P、V、A小于某一特定值,从而构建Aieqp=bieq
,不等式约束一般是在corridor中用的比较多,这里暂时先不使用不等式约束。
e. 求解
利用QP求解器进行求解,在MATLAB中可以使用quadprog() 函数,C++的QP求解器如OOQP,也可以自己去网上找。

参考资料:
1、深蓝学院
2、https://blog.csdn.net/q597967420/article/details/76099491
Minimum Snap轨迹规划详解(1)轨迹规划的更多相关文章
- Minimum Snap轨迹规划详解(3)闭式求解
如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的.闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver. 这里介绍Nicholas Roy文章中闭式 ...
- 企业sudo权限规划详解 (实测一个堆命令搞定)
简述问题: 随着公司的服务器越来越多,人员流动性也开始与日俱增,以往管理服务器的陈旧思想应当摒弃,公司需要有 更好更完善的权限体系,经过多轮沟通和协商,公司一致决定重新整理规划权限体系 ...
- lattice planner 规划详解
大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...
- Minimum Snap轨迹规划详解(2)corridor与时间分配
在上一篇文章中,我们得到的轨迹并不是很好,与路径差别有点大,我们期望规划出的轨迹跟路径大致重合,而且不希望有打结的现象,而且希望轨迹中的速度和加速度不超过最大限幅值.为了解决这些问题有两种思路: 思路 ...
- Kubernetes K8S之通过helm部署metrics-server与HPA详解
Kubernetes K8S之通过helm部署metrics-server与 Horizontal Pod Autoscaling (HPA)详解 主机配置规划 服务器名称(hostname) 系统版 ...
- Usage、Usage Minimum和Usage Maximum项目详解
(1)一个产生多个数据域(Report Count>1)的主项目之前有一个以上的[用途]时,每个[用途]与一个数据域依次对应,如果数据域个数(Report Count)超过[用途]的个数,则剩余 ...
- 超级强大的SVG SMIL animation动画详解
本文花费精力惊人,具有先驱前瞻性,转载规则以及申明见文末,当心予以追究.本文地址:http://www.zhangxinxu.com/wordpress/?p=4333 //zxx: 本文的SVG在有 ...
- [转]超级强大的SVG SMIL animation动画详解
超级强大的SVG SMIL animation动画详解 本文花费精力惊人,具有先驱前瞻性,转载规则以及申明见文末,当心予以追究.本文地址:http://www.zhangxinxu.com/wordp ...
- org.apache.log4j.Logger详解
org.apache.log4j.Logger 详解 1. 概述 1.1. 背景 在应用程序中添加日志记录总的来说基于三个目的 :监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析工 ...
随机推荐
- shell读取文件第一行和最后一行,小数的运算比较
1. 读取文件的第一行:head -n +1 file.txt 读取文件的最后一行: tail -n -1 file.txt echo 12:30:55 | cut -d: -f 1 结果为12,意思 ...
- 【InnoDB】缓冲池
索引目录 INNODB的体系结构 缓冲池 缓存中页的定位: checkpoint技术 INNODB的关键特性 插入缓冲 change buffer 两次写 以下的资料总结自:官方文档和<MySQ ...
- shell脚本编程运算
一算术运算 bash中的算术运算:help let+, -, *, /, %取模(取余), **(乘方)实现算术运算:(1) let var=算术表达式(2) var=$[算术表达式](3) var= ...
- 【Flutter学习】基本组件之TabBar顶部导航
一,概述 TabBar,是材料设计(Material design)中很常用的一种横向标签页.在Android原生开发中,我们常用ViewPage或者一些常用的标签页开源库,来实现并行界面的横向滑动展 ...
- paper 145:caffe-深度学习框架的搭建
参考来源于:http://www.cnblogs.com/goodluckcwl/p/5686094.html (部分内容做了修改) Caffe是一个深度学习框架,本文讲阐述如何在linux下安装G ...
- LayuiAdmin 滚动条设置问题解决
LayuiAdmin 滚动条设置问题解决 今天在使用LayuiAdmin(单页版),发现通过: $("html,body").animate({"scrollTop&qu ...
- struts2 值栈分析
目录 一.值栈分为两个逻辑部分 二.Struts2 利用 s:property 标签和 OGNL表达式来读取值栈中的属性值 1.值栈中的属性值: 2.读取对象栈中对象的属性: 3.默认情况下,Acti ...
- What is the difference between UserControl, WebControl, RenderedControl and CompositeControl?
What is the difference between UserControl, WebControl, RenderedControl and CompositeControl? UserCo ...
- scrapy入门实战-爬取代理网站
入门scrapy. 学习了有这几点 1.如何使用scrapy框架对网站进行爬虫: 2.如何对网页源代码使用xpath进行解析: 3.如何书写spider爬虫文件,对源代码进行解析: 4.学会使用scr ...
- error C4996: 'stricmp': The POSIX name for this item is deprecated
转自VC错误:http://www.vcerror.com/?p=164 问题描述: 最近使用了VS2012,在使用 stricmp和ltoa函数的时候,报出了以下错误信息 error C4996: ...