【深蓝学院】移动机器人运动规划--第5章 最优轨迹生成--作业

0. 题目

在这里插入图片描述

1. 解答

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

Listing1:

void minimumJerkTrajGen(
    // Inputs:
    const int pieceNum,
    const Eigen::Vector3d &initialPos,
    const Eigen::Vector3d &initialVel,
    const Eigen::Vector3d &initialAcc,
    const Eigen::Vector3d &terminalPos,
    const Eigen::Vector3d &terminalVel,
    const Eigen::Vector3d &terminalAcc,
    const Eigen::Matrix3Xd &intermediatePositions,
    const Eigen::VectorXd &timeAllocationVector,
    // Outputs:
    Eigen::MatrixX3d &coefficientMatrix)
{
    // coefficientMatrix is a matrix with 6*piece num rows and 3 columes
    // As for a polynomial c0+c1*t+c2*t^2+c3*t^3+c4*t^4+c5*t^5,
    // each 6*3 sub-block of coefficientMatrix is
    // --              --
    // | c0_x c0_y c0_z |
    // | c1_x c1_y c1_z |
    // | c2_x c2_y c2_z |
    // | c3_x c3_y c3_z |
    // | c4_x c4_y c4_z |
    // | c5_x c5_y c5_z |
    // --              --
    // Please computed coefficientMatrix of the minimum-jerk trajectory
    // in this function

    // ------------------------ Put your solution below ------------------------
    //coefficientMatrix维度维度为(6*pieceNum, 3),之前已经给出,不用操作
    //起始和末状态的PVA约束分别是3行,加起来总共6行约束(s*2s)=(3*6),中间状态有(pieceNum-1)组约束(2s*2s)=(6*6),所以总约束仍为(2sM*2sM)=(6M*6M)
    Eigen::MatrixXd M = Eigen::MatrixXd::Zero(6*pieceNum, 6*pieceNum);
    Eigen::MatrixXd b = Eigen::MatrixXd::Zero(6*pieceNum, 3);

    //初始条件PVA约束
    Eigen::MatrixXd F_0(3, 6);
    F_0.setZero();
    F_0(0,0) = 1;
    F_0(1,1) = 1;
    F_0(2,2) = 2;
    M.block(0,0,3,6) = F_0;
    b.row(0) = initialPos.transpose();
    b.row(1) = initialVel.transpose();
    b.row(2) = initialAcc.transpose();

    //终止条件条件PVA约束
    Eigen::MatrixXd E_M(3, 6);
    double T_M = timeAllocationVector(pieceNum-1);
    double T_M_2 = T_M * T_M;
    double T_M_3 = T_M_2 * T_M;
    double T_M_4 = T_M_3 * T_M;
    double T_M_5 = T_M_4 * T_M;
    E_M <<  1,  T_M,    T_M_2,  T_M_3,      T_M_4,      T_M_5,
            0,  1,      2*T_M,  3*T_M_2,    4*T_M_3,    5*T_M_4,
            0,  0,      2,      6*T_M,      12*T_M_2,   20*T_M_3;
    M.block(6*pieceNum-3,6*(pieceNum-1),3,6) = E_M;
    b.row(6*pieceNum-3) = terminalPos.transpose();
    b.row(6*pieceNum-2) = terminalVel.transpose();
    b.row(6*pieceNum-1) = terminalAcc.transpose();


    //M共pieceNum-1组中间状态约束,前面F_0的3*6 PVA约束,后面E_M的3*6 PVA约束,
    //中间是pieceNum-1组中间状态约束,由waypoint,P,V,A,Jerk,Snap连续可导组成的E_i(6*6),F_i(6*6)约束
    for(int i = 1; i < pieceNum; ++i) {//这里使用的时间是左闭右开,中间点约束在左边点上,所以是从第[1]个而非第[0]个开始
        double T = timeAllocationVector(i-1);
        double T_2 = T * T;
        double T_3 = T_2 * T;
        double T_4 = T_3 * T;
        double T_5 = T_4 * T;
        Eigen::MatrixXd E_i(6, 6);
        Eigen::MatrixXd F_i(6, 6);
        E_i <<  1,  T,  T_2,    T_3,    T_4,    T_5,
                1,  T,  T_2,    T_3,    T_4,    T_5,
                0,  1,  2*T,    3*T_2,  4*T_3,  5*T_4,
                0,  0,  2,      6*T,    12*T_2, 20*T_3,
                0,  0,  0,      6,      24*T,   60*T_2,
                0,  0,  0,      0,      24,     120*T;
        M.block(6*i-3, 6*(i-1), 6, 6) = E_i;

        F_i.setZero();
        F_i(1,0) = -1;
        F_i(2,1) = -1;
        F_i(3,2) = -2;
        F_i(4,3) = -6;
        F_i(5,4) = -24;
        M.block(6*i-3, 6*i, 6, 6) = F_i;

        Eigen::Vector3d D_i_transpose = intermediatePositions.block(0,i-1,3,1);
        b.block(6*i-3, 0, 1, 3) << D_i_transpose(0), D_i_transpose(1), D_i_transpose(2);

    }

    clock_t time_stt = clock();
    // 使用PartialPivLU进行分解
//    Eigen::PartialPivLU<Eigen::MatrixXd> lu(M);
    // Mc = b 解为c
    std::cout << "use lu" <<std::endl;
    coefficientMatrix = M.lu().solve(b);

/*    // Solve Mc = b, using QR solver
    for (int i = 0; i < 3; i++)
    {
        coefficientMatrix.col(i) = M.colPivHouseholderQr().solve(b.col(i));
//         coefficientMatrix.col(i) = M.lu().solve(b.col(i));
    }
    coefficientMatrix = M.inverse() * b;*/

    // std::cout << "C is " << coefficientMatrix << std::endl;
    std::cout << "Time cost = " << 1000 * (clock() - time_stt) / (double)CLOCKS_PER_SEC << "ms" << std::endl;

    // ------------------------ Put your solution above ------------------------

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

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

相关文章

UML---活动图

活动图概述 活动图&#xff08;Activity Diagram&#xff09;是UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;中的一种行为建模工具&#xff0c;主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…

算法项目(5)—— 时序模型TFT数据趋势预测

本文包含什么? TFT+机器学习融合完整的在线运行的代码环境(免配置环境)代码介绍运行有问题? csdn上后台随时售后.项目说明 本文主要实现用谷歌的论文Temporal Fusion Transformers for Interpretable Multi-horizon Time Series Forecasting(TFT)来做时间序列的预测. 模型整…

C++类和对象——多态详解

目录 1.多态的基本语法 2.多态的原理剖析 示例&#xff1a;计算机类 3.纯虚函数和抽象类 示例&#xff1a;制作饮品 4.虚析构和纯虚析构 示例&#xff1a;电脑组装 1.多态的基本语法 代码示例&#xff1a; #include<bits/stdc.h> using namespace std;class mus…

1903_CoreMark白皮书阅读笔记

1903_CoreMark白皮书阅读笔记 全部学习汇总&#xff1a; g_embedded: 嵌入式通用技术学习笔记 (gitee.com) 再看ARM的内核架构介绍的时候看到了不同的内核都测试了一个CoreMark/Mhz的参数。从名称看&#xff0c;可以理解为是MCU的算力跑分。至于这部分究竟是测试了哪些功能&…

CV论文--2024.2.22

SOURCE&#xff1a;CV论文--2024.2.22 1、CounterCurate: Enhancing Physical and Semantic Visio-Linguistic Compositional Reasoning via Counterfactual Examples 中文标题&#xff1a;CounterCurate&#xff1a;通过反事实示例增强物理和语义视觉语言组合推理 简介&…

“替代云”知多少?Akamai Linode 重新定义公有云服务!

自2006年云计算概念提出以来&#xff0c;云产业已经成为数字化时代所必备的底层基础&#xff0c;但随着多元化的业务需求的增多&#xff0c;多云战略、本地部署所形成混合环境&#xff0c;都使得云复杂性&#xff0c;日渐成为了迫在眉睫的挑战。 451 Research 云价格指数 (CPI…

HarmonyOS Stage模型基本概念讲解

本文 我们来说harmonyos中的一种应用模型 Stage模型 官方提供了两种模型 一种是早期的 FA模型 另一种就是就是 harmonyos 3.1才开始的新增的一种模型 Stage模型 目前来讲 Stage 会成为现在乃至将来 长期推进的一种模型 也就是 无论是 现在的harmonyos 4.0 乃至 之后要发布的 …

pytest基本应用

文章目录 1.pytest安装2.用例运行规则3.常用参数断言运行参数用例控制setup和teardownini配置文件 4.常用插件5.pytest高阶用法用例跳过参数化 6.pytest之Fixture使用fixture使用装饰器usefixtures 7.pytest之conftest.py8.conftestfixtureyieldyield介绍前后置使用 1.pytest安…

2012及其以上系统修改服务器密码指南

修改服务器密码指南,目前介绍两种不同的方案 方法一 指令式 winR键 弹出运行框里输入 cmd 点击确认或者右下角开始程序里面的点开运行 2.在弹出框里手动输入以下一组文字&#xff1a;net user administrator 123456 框内无法粘贴 需要手动输入 其中administrator 是用…

4核8G服务器腾讯云和阿里云租用价格对比,2024更新

4核8G云服务器多少钱一年&#xff1f;阿里云ECS服务器u1价格955.58元一年&#xff0c;腾讯云轻量4核8G12M带宽价格是646元15个月&#xff0c;阿腾云atengyun.com整理4核8G云服务器价格表&#xff0c;包括一年费用和1个月收费明细&#xff1a; 云服务器4核8G配置收费价格 阿里…

Sora刷爆了,先来了解下基本情况

2月15日&#xff0c;OpenAI发布的Sora模型确实在文生视频领域取得了显著的进步&#xff0c;其特点和创新性表现在以下几个方面&#xff1a; 视频生成长度&#xff1a;Sora模型能够生成长达1分钟的视频&#xff0c;这相比之前的文生视频模型有了显著的提升。这一长度的视频已经…

后端程序员入门react笔记——react的diff算法(三)

diffing算法 虚拟dom 我们知道&#xff0c;react里面操作的都是虚拟dom&#xff0c;最后经过render渲染为真正的dom&#xff0c;那么为什么要提出虚拟dom这个概念呢&#xff1f;其实就是将逻辑和视图区分开&#xff0c;react的虚拟dom&#xff0c;就相当于mvc的c&#xff0c;…

网络安全实验(三)补充

1.假设内网用户需要通过外网的web服务器和pop3邮件服务器下载文件和邮件&#xff0c;内网的FTP服务器也需要接受外网用户上传的文件。针对该场景进行防病毒的防护。 2.我们需要针对办公区用户进行上网行为管理&#xff0c;要求进行URL过滤&#xff0c;要求在上班时间仅能访问教…

UE蓝图 入口(FunctionEntry)节点和源码

系列文章目录 UE蓝图 Get节点和源码 UE蓝图 Set节点和源码 UE蓝图 Cast节点和源码 UE蓝图 分支(Branch)节点和源码 UE蓝图 入口(FunctionEntry)节点和源码 文章目录 系列文章目录一、FunctionEntry节点功能二、入口节点用法1. 创建函数2. 命名函数3. 定义参数4. 编写函数逻辑5…

http协议工具:apache详解

目录 一、常见的http服务程序 1、 Apache HTTP Server 介绍 1.1 apache 概念 1.2 apache 功能 1.3 apache 特性 2、MPM&#xff08;multi-processing module&#xff09;工作模式 2.1 prefork 2.2 worker 2.3 event 二、Apache HTTP Server安装和相关文件 1、安装方…

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比,包含6种评价指标,9个测试函数(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测

多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测 目录 多维时序 | Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现基于VMD-DBO-GRU、VMD-GRU、GRU的多变量时间序列预测…

AWS安全组是什么?有什么用?

最近看到小伙伴在问&#xff0c;AWS安全组是什么&#xff1f;有什么用&#xff1f;今天我们大家就来简单聊聊&#xff0c;仅供参考哦&#xff01; AWS安全组是什么&#xff1f;有什么用&#xff1f; 【回答】&#xff1a;AWS安全组是一种虚拟防火墙&#xff0c;用于控制进出…

Eclipse项目间的引用

我们在开发的时候&#xff0c;有时候需要把一个大的项目打散&#xff0c;尤其是现在微服务的架构很流行&#xff0c;一个大的项目往往被拆成很多小的项目&#xff0c;而有的项目作为公共工程被独立出来&#xff0c;比如有个工程专门提供各种Util工具类&#xff0c;有的工程专门…

【hoare优化版】快速排序算法(2)

目录 GitMidi三数取中 整体思想 图解分析 代码实现 Hoare优化 上篇我们介绍了hoare基础版&#xff0c;但是这种代码存在缺陷&#xff0c;所以我们提出了两种解决方案。主流的解决方案就是【三数取中选key】 GitMidi三数取中 在快排的过程中&#xff0c;每一次我们要取一…