自动驾驶算法(十):多项式轨迹与Minimun Snap闭式求解原理及代码讲解

目录

1 多项式轨迹与Minimun Snap闭式求解原理

2 代码解析


1 多项式轨迹与Minimun Snap闭式求解原理

        我们上次说的Minimun Snap,其实我们就在求一个二次函数的最优解:

        也就是优化函数p^TQp在约束Ap=b下的最小值。

        但这是一个渐进最优解而不是解析最优解,是否有一个解析最优解呢?

        我们用Ap = d的形式表达:(d表示每一段路程中的起点和终点的位置、速度、加速度),比如p_{1}(t_0),v_{1}(t_0),a_{1}(t_0),p_{1}(t_1),v_{1}(t_1),a_{1}(t_1)表示第一段起点的位置、速度、加速度、第一段终点的位置、速度、加速度。段数是k段,每段有起点和终点、起点终点有位置、速度加速度三个变量、因此维度为2*3k = 6k。      

        因此我们可以求出一个确定的p,带入 p^TQp后就计算出来了我们的最小值。

        A矩阵的维度就是一共有K段每段是n+1阶的参数,各个段的位置为6,因此维度为k(n+1) * 6K

                                                 A_{total} \begin{bmatrix} p_1\\p_2 \\... \\... \\p_k \end{bmatrix} = \begin{bmatrix} d_1\\d_2 \\... \\... \\d_k \end{bmatrix}

        更进一步的说:

        p = A^{-1}d就是我们要求解的方程。

        我们不妨先看一段,即第一段和第二段:p_i表示第i段。我画了个图:

        那么t^{(i)}这个时间点就是1段的末尾和2段的初始点。

        我们消除重复变量:

        我们一共是k+1个航路点,每个航路点有p、v、a。因此矩阵大小为3(k+1)。

        我们得到 d = Md'

        d' = C[dF dP]T,这里dF表示已知量,包括起点、终点的位移、速度、加速度,也包括中点间的已知量(我们要经过这些点)。dP表示未知量。我们可以看一个简单的例子:

        我们把它写到一起:

        我们就是dP未知,因此我们对dP求导,因此可以求出来dP的解析解。

        我们可以手动增加航路点避免碰撞:

        我们来总结一下闭式求解的步骤:

2 代码解析

        我们只讲解和上篇博客不一样的地方:

        我们先看一下运行结果:

        我们来进行代码复现:

function polys = minimum_snap_single_axis_close_form(wayp,ts,n_order,v0,a0,v1,a1)
% 参数个数 = 阶数+1
n_coef = n_order+1;
% 多项式的段数:航路点-1
n_poly = length(wayp)-1;
% 计算Q 和原来的一样
Q_all = [];
for i=1:n_poly
    Q_all = blkdiag(Q_all,computeQ(n_order,3,ts(i),ts(i+1)));
end

        这里依旧用n_coef表示参数个数(数量为拟合曲线的最大阶数+1),用n_poly表示多项式的段数,大小为航路点数量-1,Q的构造方式和上篇博客一致,不再赘述。

        我们来看闭式求解的步骤,我们先来计算A矩阵:

% compute A (n_continuous*2*n_poly) * (n_coef*n_poly)
n_continuous = 3;  % 1:p  2:pv  3:pva  4:pvaj  5:pvajs
% A的维度是 3*2*K(航路点个数) 阶数(N+1) * K
A = zeros(n_continuous*2*n_poly,n_coef*n_poly);
% 遍历每一段航路点
for i = 1:n_poly
    % 位置、速度、加速度
    for j = 1:n_continuous
        % 计算具体参数 j--参数个数(阶数+1)
        for k = j:n_coef
            if k==j
                t1 = 1;
                t2 = 1;
            else %k>j
                t1 = tk(i,k-j+1);
                t2 = tk(i+1,k-j+1);
            end
            % 每一段填充首和尾
            A(n_continuous*2*(i-1)+j,n_coef*(i-1)+k) = prod(k-j+1:k-1)*t1;
            A(n_continuous*2*(i-1)+n_continuous+j,n_coef*(i-1)+k) = prod(k-j+1:k-1)*t2;
        end
    end
end

        我们知道,如果我们的航路点是K段,我们要拟合多项式的次数为N。因此我们的A矩阵大小为航路点为K段,每段的话有起终点、每个起终点有X、V、A三个元素,因此我们的矩阵大小为 K*2*3 * (N+1)*K。

        先给它初始化为0。我们遍历每一段航路点,先计算这段航路点的位移、速度、加速度。

        然后我们计算M矩阵:

M = zeros(n_poly*2*n_continuous,n_continuous*(n_poly+1));
for i = 1:n_poly*2
    j = floor(i/2)+1;
    rbeg = n_continuous*(i-1)+1;
    cbeg = n_continuous*(j-1)+1;
    M(rbeg:rbeg+n_continuous-1,cbeg:cbeg+n_continuous-1) = eye(n_continuous);
end
M

        计算C矩阵和K矩阵:

% compute C
num_d = n_continuous*(n_poly+1);
C = eye(num_d);
df = [wayp,v0,a0,v1,a1]';% fix all pos(n_poly+1) + start va(2) + end va(2) 
fix_idx = [1:3:num_d,2,3,num_d-1,num_d];
free_idx = setdiff(1:num_d,fix_idx);
C = [C(:,fix_idx) C(:,free_idx)];

% K
AiMC = inv(A)*M*C;
R = AiMC'*Q_all*AiMC;

n_fix = length(fix_idx);
Rff = R(1:n_fix,1:n_fix);
Rpp = R(n_fix+1:end,n_fix+1:end);
Rfp = R(1:n_fix,n_fix+1:end);
Rpf = R(n_fix+1:end,1:n_fix);

        计算p恢复轨迹、位置、加速度:

dp = -inv(Rpp)*Rfp'*df;

p = AiMC*[df;dp];

polys = reshape(p,n_coef,n_poly);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/131440.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

云栖大会丨桑文锋:打造云原生数字化客户经营引擎

近日,2023 云栖大会在杭州举办。今年云栖大会回归了 2015 的主题:「计算,为了无法计算的价值」。神策数据创始人 & CEO 桑文锋受邀出席「生态产品与伙伴赋能」技术主题,并以「打造云原生数字化客户经营引擎」为主题进行演讲。…

【Java】I/O流—转换流、序列化流的初学者指南及RandomAccessFile类

🌺个人主页:Dawn黎明开始 🎀系列专栏:Java ⭐每日一句:我不在意你曾堕落,我只在意你是否会崛起 📢欢迎大家:关注🔍点赞👍评论📝收藏⭐️ 文章目录…

OpenCV-Python小应用(八):判断是否有深色线条

OpenCV-Python小应用(八):判断是否有深色线条 前言前提条件相关介绍实验环境判断是否有深色线条思路一:通过图像梯度直方图判断思路二:通过图像灰度值变化判断 参考 前言 由于本人水平有限,难免出现错漏&am…

LoRAShear:微软在LLM修剪和知识恢复方面的最新研究

LoRAShear是微软为优化语言模型模型(llm)和保存知识而开发的一种新方法。它可以进行结构性修剪,减少计算需求并提高效率。 LHSPG技术( Lora Half-Space Projected Gradient)支持渐进式结构化剪枝和动态知识恢复。可以通过依赖图分析和稀疏度…

rabbitmq延迟队列发送与取消

安装延迟插件 根据rabbitmq的版本下载插件版本 # 延迟队列插件下载地址 https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases# 将本地下载好的插件复制到docker里 # docker cp rabbitmq_delayed_message_exchange-3.9.0.ez 容器名:/plugins docker cp r…

3.0 熟悉IDAPro静态反汇编器

IDA Pro 是一种功能强大且灵活的反汇编工具,可以在许多领域中发挥作用,例如漏洞研究、逆向工程、安全审计和软件开发等,被许多安全专家和软件开发者用于逆向工程和分析二进制代码。它支持大量的二进制文件格式和CPU架构,并提供了强…

spring命名空间注入和XML自动装配、引入外部配置文件

Spring p命名空间注入util命名空间注入基于XML的自动装配根据名称自动装配 Spring引入外部属性配置文件 p命名空间注入 作用:简化配置。 使用p命名空间注入的前提条件包括两个: ● 第一:在XML头部信息中添加p命名空间的配置信息&#xff1a…

error C2143的原因及解决办法

error C2143的原因及解决办法 在C编程中,经常会遇到各种错误。其中之一就是error C2143。本文将讨论error C2143的原因,并给出相应的解决办法。 error C2143通常是由于语法错误引起的。具体而言,C2143错误表示编译器无法识别代码中的某个符…

鲲鹏920的架构分析

*本文信息主要来源于书籍《鲲鹏处理器架构与编程》以及论文《Kunpeng 920: The First 7-nm Chiplet-Based 64-Core ARM SoC for Cloud Services》 * 笔者已然写了一篇上述论文的分析博客,但尚觉论文内容对chiplet架构描述不够清晰,因此查阅《鲲鹏处理器…

ECharts修改tooltip样式

tooltip不支持rich&#xff0c;formatter返回的是html片段&#xff0c;可以在这个返回的片段里面增加类名。以达到更改tooltip文字格式的效果。所以&#xff0c;直接写html的样式就可以 静态数据 formatter: (params) > {console.log(params, params)return <h2 style&q…

C++多态特性

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

Redis之主从复制

文章目录 一、什么是Redis主从复制&#xff1f;1.作用2.配置主从复制的原因3.环境配置 二、一主二从三、复制原理四、链路总结 一、什么是Redis主从复制&#xff1f; 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(ma…

HTML点击链接强制触发下载

常见网页中会有很多点击链接即下载的内容&#xff0c;以下示范一下如何实现 <a href"文件地址" download"下载的文件名字&#xff08;不包括后缀&#xff09;">强制下载</a> 下面举个例子&#xff1a; <a href"./image/test.jpg"…

Azure 机器学习 - 如何使用模板创建安全工作区

目录 先决条件了解模板配置模板连接到工作区疑难解答错误&#xff1a;Windows 计算机名的长度不能超过 15 个字符&#xff0c;并且不能全为数字或包含以下字符 本教程介绍如何使用 [Microsoft Bicep]和 [Hashicorp Terraform]模板创建以下 Azure 资源&#xff1a; Azure 虚拟网…

王学岗visibility改变后调用onLayout()

自定义控件的时候发现了一个bug。 Button位移动画执行结束后我设置了一个不相关的TextView的可见性由gone变为visible.令人郁闷的是&#xff0c;只要我注释的地方放开。动画执行结束后button都会重新绘制在位移动画开始的位置。注释掉这段代码就正常。 经过分析后得知 View的Vi…

算法:FloodFill算法

文章目录 算法原理图像渲染岛屿数量岛屿的最大面积被围绕的区域太平洋大西洋水流问题扫雷游戏衣橱整理 算法原理 FLoodFill算法通俗来讲&#xff0c;就是洪水给地势带来的变化&#xff0c;而实际上题目要求的就是一个连通块问题&#xff0c;那本质还是暴搜和DFS/BFS相结合&…

dream_ready

&#x1f9f8;欢迎来到dream_ready的博客&#xff0c;&#x1f4dc;相信您对这篇博客也感兴趣o (ˉ▽ˉ&#xff1b;) Python 语法及入门 &#xff08;超全超详细&#xff09; 专为Python零基础 一篇博客让你完全掌握Python语法 路的尽头是什么&#xff1f;这是我年少时常伴在嘴…

【题解】2023-11-11 B层模拟赛T1

宣传一下 算法提高课整理 CSDN个人主页&#xff1a;更好的阅读体验 原题链接 CF461B 题目描述 一棵树有 n n n 个节点&#xff0c; n − 1 n − 1 n−1 条边。树上的节点有两种&#xff1a;黑&#xff0c;白节点。 Tyk 想断掉一些边把树分成很多部分。 他想要保证每个部…

【chat】4: ubuntu20.04:数据库创建:mysql8 导入5.7表

【chat】3: ubutnu 安装mysql-8 并支持远程访问 已经支持 8.0的SQLyog 远程访问:大神2021年的文章:sql是5.7的版本,我使用的ubuntu20.04,8.0版本:chat数据库设计 C++搭建集群聊天室(七):MySQL数据库配置 及项目工程目录配置 User表,以id 唯一标识 Friend 表,自己的id…

如何在 Windows 11 上恢复丢失的文件?(4种方法)

在 Windows 11 设备上丢失重要文件感觉就像一场噩梦。这是您希望时光倒流并撤消意外删除或避免那些意外的系统故障的时刻之一。这种情况带来的挫败感和焦虑感简直难以承受。但是&#xff0c;嘿&#xff0c;不要绝望&#xff01;我们随时为您提供帮助。 在这本真诚的指南中&…