Minimum Snap轨迹规划详解(3)闭式求解
如果QP问题只有等式约束没有不等式约束,那么是可以闭式求解(close form)的。闭式求解效率要快很多,而且只需要用到矩阵运算,不需要QPsolver。
这里介绍Nicholas Roy文章中闭式求解的方法。
1. QP等式约束构建
闭式法中的Q
矩阵计算和之前一样(参照文章一),但约束的形式与之前略为不同,在之前的方法中,等式约束只要构造成[...]p=b的形式就可以了,而闭式法中,每段poly都构造成
其中d0,dT为第i段poly的起点和终点的各阶导数组成的向量,比如只考虑PVA:,当然也可以把jerk,snap等加入到向量。注意:这里是不管每段端点的PVA是否已知,都写进来。
块合并各段轨迹的约束方程得到
k为轨迹段数,n为轨迹的阶数,设只考虑pva,Atotal的size为。这里为了简化,没有把每段poly的timestamp都改成从0开始,一般,为了避免timestamp太大引起数值问题,每段poly的timestamp都成0开始。
由上式可以看到,Atotal是已知的(怎么构造可参见文章一中的等式约束构造方法),而d中只有少部分(起点、终点的pva等)是已知的,其他大部分是未知的。如果能够求出d,那么轨迹参数可以通过p=A-1d很容易求得。
2. 如何求d?
闭式法的思路是:将向量中的变量分成两部分:”d中所有已知量组成的Fix部分dF”和”所有未知量组成的Free部分dP”。然后通过推导,根据dF求得dP,从而得到d,最后求得p。
下面介绍整个推导过程,
2.1. 消除重复变量(连续性约束)
可以会发现,上面构造等式约束时,并没有加入连续性约束,连续性约束并不是直接加到等式约束中。考虑到连续性(这里假设PVA连续),d
向量中很多变量其实重复了,即
因此需要一个映射矩阵将一个变量映射到两个重复的变量上,怎么映射?
- 如
[aa]=[11]a
,将变量a映射到左边向量中的两个变量。
所以构造映射矩阵
即d=Md'd=Md′。
2.2 向量元素置换
消除掉重复变量之后,需要调整d'中的变量,把fix部分和free部分分开排列,可以左乘一个置换矩阵C,使得
C矩阵怎么构造?
- 举个例子,设
,其中a,b,c是已知(dF),b未知(dp),构造一个4×4的单位阵,取dF所在的(1,3,4)列放到左边,再取dp所在的(2)列放到右边,就构造出置换矩阵C:
abcd⎤⎦⎥⎥⎥=⎡⎣⎢⎢⎢1000001000010100⎤⎦⎥⎥⎥C⎡⎣⎢⎢⎢acdb⎤⎦⎥⎥⎥
2.3 转成无约束优化问题
由上面两步可得
代入优化函数
3. 闭式法步骤
总结一下整个闭式法的步骤:
1.先确定轨迹阶数(比如5阶),再确定向量中的约束量(pva),进而根据各段的时间分配求得AtotalAtotal。
2.根据连续性约束构造映射矩阵M,并确定d向量中哪些量是Fix(比如起点终点pva,中间点的p等),哪些量是Free,进而构造置换矩阵C,并求得K=A-1MCKM=A−1MC
3.计算QP目标函数中的Q(min Jerk/Snap)并计算R=KTQK,根据fix变量的长度将R拆分成RFF,RFP,RPF,RPP四块。
4.填入已知变量得到dF,并根据计算得到d_p
5.根据公式计算得到参数p计算得到轨迹参数p。
计算得到轨迹参数p。=数p。
闭式法主要计算量就在A矩阵的求逆,其他计算基本上是矩阵构造,所以效率比较高,但由于没有不等式约束,所以在中间点只能加强约束,corridor不能直接加到QP问题中,只能是通过压点来实现corridor。
在对计算效率要求比较高或者不想用QPsolver时,可以使用闭式法求解。
参考链接:https://blog.csdn.net/q597967420/article/details/79031791
Minimum Snap轨迹规划详解(3)闭式求解的更多相关文章
- Minimum Snap轨迹规划详解(1)轨迹规划
一. 轨迹规划是什么? 在机器人导航过程中,如何控制机器人从A点移动到B点,通常称之为运动规划.运动规划一般又分为两步: 1.路径规划:在地图(栅格地图.四\八叉树.RRT地图等)中搜索一条从A点到B ...
- Minimum Snap轨迹规划详解(2)corridor与时间分配
在上一篇文章中,我们得到的轨迹并不是很好,与路径差别有点大,我们期望规划出的轨迹跟路径大致重合,而且不希望有打结的现象,而且希望轨迹中的速度和加速度不超过最大限幅值.为了解决这些问题有两种思路: 思路 ...
- 企业sudo权限规划详解 (实测一个堆命令搞定)
简述问题: 随着公司的服务器越来越多,人员流动性也开始与日俱增,以往管理服务器的陈旧思想应当摒弃,公司需要有 更好更完善的权限体系,经过多轮沟通和协商,公司一致决定重新整理规划权限体系 ...
- lattice planner 规划详解
大家好,我是来自百度智能驾驶事业群的许珂诚.今天很高兴能给大家分享Apollo 3.0新发布的Lattice规划算法. Lattice算法隶属于规划模块.规划模块以预测模块.routing模块.高精地 ...
- [转]Activity详解 Intent显式跳转和隐式跳转
Activity 生命周期 显式 Intent 调用 1 //创建一个显式的 Intent 对象(方法一:在构造函数中指定) 2 Inte ...
- pc端的企业网站(IT修真院test9)详解一个响应式完成的pc端项目
一:引入bootstrap框架 昨天一直被bootstrap栅格系统折磨. why? 我本来想一边码字,一边学习栅格布局的.but不成功.这时我头脑已经昏了. 下午,我查看了bootstrap的官网, ...
- python列表推导式详解 列表推导式详解 字典推导式 详解 集合推导式详解 嵌套列表推导式详解
推导式是Python中很强大的.很受欢迎的特性,具有语言简洁,简化代码,速度快等优点.推导式包括:1.列表推导式2.字典推导式3.集合推导式4.嵌套列表推导式注意: 字典和集合推导是最近才加入到Pyt ...
- Hadoop IO基于文件的数据结构详解【列式和行式数据结构的存储策略】
Charles所有关于hadoop的文章参考自hadoop权威指南第四版预览版 大家可以去safari免费阅读其英文预览版.本人也上传了PDF版本在我的资源中可以免费下载,不需要C币,点击这里下载. ...
- 详解Vue响应式原理
摘要: 搞懂Vue响应式原理! 作者:浪里行舟 原文:深入浅出Vue响应式原理 Fundebug经授权转载,版权归原作者所有. 前言 Vue 最独特的特性之一,是其非侵入性的响应式系统.数据模型仅仅是 ...
随机推荐
- SpringBoot使用Swagger2搭建强大的RESTful API 文档功能
swagger用于定义API文档. Swagger2的使用 Maven Plugin添加Swagger2相关jar包 <!--swagger2 start--> <dependenc ...
- 微信小程序常用API组件开发
关于小程序 张小龙定义小程序: 1.不需要下载安装即可使用: 2.用完即走,不用关心是否安装太多应用: 3.应用无处不在,随时可用. 特点: 1.适合业务逻辑简单的应用: 2,.适合低频应用: 3.适 ...
- Python基础教程(002)--编译型语音和解释器
前言 理解解释器和编译型语言,及跨平台 解释器(科普) 计算机不能直接理解任何出机器语言以外的机器语言,必须要把程序员写的程序语言进行翻译,就是编辑. 将其他语音翻译成机器语言,被称为编译器. 编译器 ...
- 概念介绍:IaaS、PaaS、SaaS
云计算分几层的,分别是Infrastructure(基础设施)-as-a-Service,Platform(平台)-as-a-Service,Sofware(软件)-as -a -Service.基础 ...
- c#网络通信框架networkcomms内核解析之一 消息传送
networkcomms.net 来自英国的网络通信框架 官方网址 www.networkcomms.net 中文网址www.networkcomms.cn 在网络通信程序中,本地的类或者对象,要传输 ...
- javaScript的事件冒泡事件捕获
(1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...
- css3水平垂直居中(不知道宽高同样适用)
css水平垂直居中 第一种方法: 在父div里加: display: table-cell; vertical-align: middle; text-align: center; 内部div设置: ...
- mysql 内连接和外连接查询
一.内连接查询 (笛卡儿积) 内联接查询inner join,mysql可以简写为join 二.外连接查询 左外联接查询left outer join,mysql可以简写为left join右外联接查 ...
- scp指定端口 从远程机器复制目录到本机器目录
scp -P 22622 -r root@192.168.70.63:/root/iNmon ./ -P port 注意是大写的P, port是指定数据传输用到的端口 root@192.168.70 ...
- 使用Pandas读取大型Excel文件
import os import pandas as pd HERE = os.path.abspath(os.path.dirname(__file__)) DATA_DIR = os.path.a ...