差速机器人模型LQR 控制仿真——路径模拟

news/2024/5/18 13:26:02

LQR路径跟踪要求路径中带角度,即坐标(x,y,yaw),而一般我们的规划出来的路径不带角度。这里通过总结相关方法,并提供一个案例。

将点路径拟合成一条完整的线路径算法

将点路径拟合成一条完整的线路径是一个常见的问题,在计算机图形学、机器人导航、地图制作等领域都有广泛的应用。以下是一些常见的用于路径拟合的算法:

  1. 多项式拟合:使用多项式函数来逼近给定的数据点。常见的方法包括最小二乘法拟合线性、二次或更高次的多项式。多项式拟合简单直观,但对于复杂的路径可能不够灵活。
  2. 样条插值:样条插值通过在相邻数据点之间拟合局部小段来逼近数据。常见的样条插值包括三次样条插值,它保证在每个数据点处平滑连接,并具有良好的数学性质。
  3. 贝塞尔曲线:贝塞尔曲线是一种通过控制点来定义路径的方法。通过调整控制点的位置和权重,可以创建平滑的曲线。贝塞尔曲线在计算机图形学中被广泛应用。
  4. B样条曲线:B样条曲线是一种基于控制点和节点向量定义的曲线。它具有局部控制和局部性质,能够创建复杂的曲线并且有良好的数学性质。
  5. 最小二乘法拟合直线或曲线:最小二乘法可以用于拟合直线或曲线到数据点,通过最小化拟合曲线与数据点之间的误差来找到最佳拟合。可以使用直线、圆弧等简单几何形状来拟合路径。
  6. 分段线性拟合:将路径分成若干小段,分别用直线来拟合每一小段,从而逼近整体路径。这种方法简单直观,适用于一些较为简单的路径。
  7. 最优控制理论:最优控制理论可以用来解决路径规划问题,将路径拟合问题转化为优化问题,并通过最小化代价函数来找到最优路径。这种方法在自动驾驶、机器人导航等领域有广泛应用。

以上算法各有特点,选择合适的方法取决于具体的应用场景、路径形状和性能要求。在实际应用中,通常会结合多种算法来完成路径拟合任务。

二次多项式拟合例程


#include <iostream>
#include <Eigen/Dense>
#include <opencv2/opencv.hpp>using namespace cv;// 多项式拟合函数
Eigen::VectorXd polynomialFit(const Eigen::VectorXd& x, const Eigen::VectorXd& y, int degree) {int n = x.size();Eigen::MatrixXd A(n, degree + 1);// 构建系数矩阵 Afor (int i = 0; i < n; ++i) {for (int j = 0; j <= degree; ++j) {A(i, j) = pow(x(i), j);}}// 使用最小二乘法求解系数return A.householderQr().solve(y);
}int main() {// 构造示例数据Eigen::VectorXd x(5);Eigen::VectorXd y(5);x << 0, 1, 2, 3, 4;y << 0, 1, 4, 9, 16;// 进行二次多项式拟合int degree = 2;Eigen::VectorXd coeffs = polynomialFit(x, y, degree);// 打印拟合的多项式系数std::cout << "拟合的多项式系数:" << coeffs.transpose() << std::endl;// 绘制拟合的曲线和原始数据Mat img(300, 300, CV_8UC3, Scalar(255, 255, 255));for (int i = 0; i < img.cols/5; ++i) {double y_fit = 0;for (int j = 0; j <= degree; ++j) {y_fit += coeffs(j) * pow(i, j);}Point pt(i*5, y_fit*5);circle(img, pt, 1, Scalar(0, 0, 255), FILLED); // 绘制拟合的曲线,使用红色}for (int i = 0; i < x.size(); ++i) {Point pt(x(i)*5, y(i)*5); // 缩放原始数据,以便在图像中显示circle(img, pt, 3, Scalar(0, 255, 0), FILLED); // 绘制原始数据,使用绿色}// 显示结果imshow("Polynomial Fit with Original Data", img);waitKey(0);return 0;
}

在这里插入图片描述
上面的方法如果是在仿真中太麻烦,可以用一个特殊函数代替路径如sin(t)函数直接生成轨迹,并可以通过求导的方法计算yaw值。

sin(t)

#include <iostream>
#include <cmath>double curvature(double t) {// 计算 sin(t) 关于 t 的一阶导数double dx_dt = cos(t);// 计算 sin(t) 关于 t 的二阶导数double d2x_dt2 = -sin(t);// 计算曲率double curvature = std::abs(d2x_dt2) / pow(1 + pow(dx_dt, 2), 1.5);return curvature;
}double slopeAngle(double t) {// 计算 sin(t) 关于 t 的一阶导数double dx_dt = cos(t);// 计算斜率的角度(以弧度为单位)double angle = atan2(dx_dt);return angle;
}int main() {// 设定时刻 t0double t0 = 0.5; // 例如,这里设定 t0 为 0.5// 计算曲率double curv = curvature(t0);// 计算斜率角度double angle = slopeAngle(t0);// 输出结果std::cout << "sin(" << t0 << ") 函数在时刻 t=" << t0 << " 的曲率为: " << curv << std::endl;std::cout << "sin(" << t0 << ") 函数在时刻 t=" << t0 << " 的斜率角度为: " << angle << " 弧度" << std::endl;return 0;
}

http://www.mrgr.cn/p/17584034

相关文章

【Web】2022DASCTF X SU 三月春季挑战赛 题解(全)

目录 ezpop calc upgdstore ezpop 瞪眼看链子 fin#__destruct -> what#__toString -> fin.run() -> crow#__invoke -> fin#__call -> mix.get_flag() exp <?php class crow {public $v1;public $v2;}class fin {public $f1; }class what {public $a; }…

嵌入式day03

按键控制LED步骤: 复制工程,新建Hardware文件夹 打开工程管理,新建Hardware文件夹 打开配置按钮,添加文件夹路径 右键Hardware文件夹添加新文件LED.c与LED.h文件,并选择存放路径 在LED.c文件里添加#include "stm32f10x.h" 编写LED初始化函数(时钟和端口初始化 …

插入一个元素x于递增顺序表并使其有序排列

数据结构 顺序表 笔试题:知一个顺序表L,其中的元素递增有序排列,设计一个算法,插入一个元素x(x为int型)后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。/*************************************************************************************** file name: …

RK3568 学习笔记 : u-boot 通过 tftp 网络更新 u-boot自身

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 使用 rockchip Linux 内核的设备树 【替换】 u-boot 下的 rk3568 开发板设备树文件&#xff0c;解决 u-boot 下千兆网卡设备能识别但是无法 Pi…

润石科技(RUNIC)汽车电子应用方案和物料选型

一、润石科技&#xff08;RUNIC&#xff09;简介 江苏润石科技有限公司是一家专注于高性能、高品质模拟/混合信号集成电路研发和销售的高科技半导体设计公司。公司主要产品线分为两类&#xff1a;信号链和电源管理&#xff0c;其中信号链包含运算放大器、比较器、模拟开关、数…

C++初阶学习第二弹——C++入门(下)

C入门&#xff08;上&#xff09;&#xff1a;C初阶学习第一弹——C入门&#xff08;上&#xff09;-CSDN博客 目录 一、引用 1.1 引用的实质 1.2 引用的用法 二、函数重载 三、内敛函数 四、auto关键字 五、总结 前言&#xff1a; 在上面一章我们已经讲解了C的一些基本…

AI预测福彩3D第9套算法实战化测试第1弹2024年4月22日第1次测试

经过前面多套算法的测试&#xff0c;总结了一些规律&#xff0c;对模型优化了一些参数&#xff0c;比如第8套算法的测试&#xff0c;7码的命中率由最开始的20%提高到了50%。虽然命中率有了很大的提高&#xff0c;但是由于咱们之前的算法只是为了测试和记录&#xff0c;提供的方…

findImg找图工具

findImg 安装 npm install findImg -g 启动 findImg run 介绍 找出当前目录下的所有图片&#xff08;包括svg的symbol格式&#xff09;在浏览器中显示出来 源码 https://github.com/HuXin957/find-img 场景 例如前端项目中的img目录&#xff0c;大家都在往里面放图片&#xff…

安全屋和主菜单

目的创建一个安全屋的地图 创建一个互传的传送门 创建主菜单 创建暂停菜单1.创建一个安全屋的地图2.创建传送门 创建传送门蓝图 在玩家角色蓝图中创建一个接口用来作为玩家交互的调用(注意这里调用传送门接口是传送逻辑的接口)在传送门蓝图中调用交互接口(进入范围则可交互,…

【C语言】strstr函数刨析-----字符串查找

目录 一、strstr 函数介绍 ✨函数头文件&#xff1a; ✨函数原型&#xff1a; ✨函数解读 ✨功能演示 二、函数的原理以及模拟实现 ✨函数原理 ✨函数的模拟实现 三、strstr函数的注意事项 四、共勉 一、strstr 函数介绍 strstr函数是在一个字符串中查找另一个字符…

C语言项目实践——贪吃蛇

引言&#xff1a;本篇博客中&#xff0c;我将会使用结构体&#xff0c;链表&#xff0c;WIN32 API等一系列知识完成C语言项目——贪吃蛇的实现。在观看此篇博客之前&#xff0c;请将这些知识所熟悉&#xff0c;不然可能会造成理解困难。 更多有关C语言的知识详解可前往个人主页…

文件上传技术总结

文件上传技术总结 XMindChEPTpEere4pPp3.8h2试用要式Sa44十年.听元汽狂节产方生左车析上传ItaorFSs改文件解行方式方利!xP打统学/麻x绿部成I足让tAD.coENLRCoiD中国汽的折时语言特性系统特性中间件化析漏逅CVE-2015-444.ter1.jpo1寄户端文件上传漏洞绕过MIME过3083省rd0文大小…

程序员缓解工作压力的小窍门

目录 1.概述 2.工作与休息的平衡 3.心理健康与自我关怀 4.社交与网络建设 1.概述 作为程序员&#xff0c;缓解工作压力是非常重要的。压力太大有可能会写很多bug。我们可以采取以下方法来保持高效和创新&#xff0c;同时维护个人健康和工作热情。 定时休息&#xff1a;保持…

删除单链表中的最小值结点

数据结构 链表 笔试题1:设计一个算法删除单链表L(有头结点)中的一个最小值结点。/*************************************************************************** file name: 2.c* author : lu.ciana.598393@gmail.com* date : 2024/04/21* function : 设计一个…

hexo配置教程、主题使用及涉及的技术学习

一、背景 最近,一直想做一个属于自己的网站.可以从零开始搭建一个网站,顺便可以把日常中学到的技术用于实战,还可以顺便记录自己的所思所感,记录成长的过程. 方案 一开始的方案是从零开始,模仿常见个人博客的设计,基于vueSpringbootMySQL的去实现网站. 新建项目之后,发现vu…

使用GitHub Actions和GitHub pages实现前端项目的自动打包部署

简要记录使用GitHub Actions和GitHub Pages实现Vue项目的自动构建与发布1. 引言 As we all know,前端部署项目是比较简单的,通常情况下只需要将打包的产物(index.html、.js文件、.css文件等)放在Web服务器下就🆗,这种叫静态资源托管,成本是比较低的 那有没有免费的静态…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天&#xff0c;软件产品已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件功能的日益复杂和用户需求的不断增长&#xff0c;软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下&#xff0c;软件压力测试作为软件质量保障的重要手段之一&a…

OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;OpenCV如何读取仪表中的指针刻度 最近遇到一个问题&#xff0c;如何读取仪表中的指针指向的刻度。 解决方法有多种&#xff0c;比如&#xff…

算法练习第20天|回溯算法 77.组合问题 257. 二叉树的所有路径

1.什么是回溯算法&#xff1f; 回溯法也可以叫做回溯搜索法&#xff0c;它是一种搜索的方式。其本质是穷举&#xff0c;穷举所有可能&#xff0c;然后选出我们想要的答案。 2.为什么要有回溯算法? 那么既然回溯法并不高效为什么还要用它呢&#xff1f; 因为有的问题能暴力…

【鸿蒙开发】饿了么页面练习

0. 整体结构 整体划分3部分。店铺部分&#xff0c;购物车部分&#xff0c;金额统计部分。使用 Stack 把3部分堆叠 0.1 整体页面 Index.ets 修改 Index.ets &#xff0c;使用堆叠布局&#xff0c;并居底部对齐 import { ElShop } from ../components/ElShop import { ElShopp…