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

news2024/11/24 19:40:25

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);

    // 构建系数矩阵 A
    for (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() {
    // 设定时刻 t0
    double 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.coloradmin.cn/o/1600650.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C#语法知识之变量

2.变量 一、知识点 1、折叠代码 //#region按Tab键#region MyRegion(描述)#endregion //本质是编译器提供给我们的预处理指令&#xff0c;发布代码是会被自动删除2、声明变量和变量类型 ​ 变量就是可以变化的容器&#xff0c;用来存储各种不同类型数值的一个容器&#xff1b…

jenkins从节点配置说明

目的 打包构建时使用从节点&#xff0c;从节点所在服务器配置4C8G5000G&#xff08;服务器2&#xff09; 前提 首先在服务器1上部署jenkins服务&#xff0c;即主节点&#xff0c;默认节点名称为master 步骤 1&#xff09;登录进入jenkins平台&#xff0c;在系统设置中&…

KT-105小动物人工呼吸机

咳咳&#xff0c;请各位小伙伴们注意啦&#xff01;我们要聊的主题可是相当高大上——小动物呼吸机&#xff01; 我们得先了解一下什么是小动物呼吸机。这可不是一般的机器哦&#xff0c;它是一种实验设备&#xff0c;主要用于各种各样的科学研究实验中。比如&#xff0c;在基…

ICV:《中美量子产业融资比较分析》

近日&#xff0c;全球前沿科技咨询公司ICV发布了A Comparative Analysis of Quantum Industry Financing in the U.S and China&#xff08;美国和中国量子产业融资比较分析&#xff09;报告。该报告旨在对中美两国在量子技术领域的投融资情况进行比较分析&#xff0c;探讨其差…

python解释器安装路径查询以及版本查询

查询安装路径 1、利用脚本&#xff1a; 路径: import sys import osprint(当前 Python 解释器路径&#xff1a;) print(sys.executable)运行结果&#xff1a; 目录: print(当前 Python 解释器目录&#xff1a;) print(os.path.dirname(sys.executable))运行结果&#xff1a…

十大排序——11.十大排序的比较汇总及Java中自带的排序算法

这篇文章对排序算法进行一个汇总比较&#xff01; 目录 0.十大排序汇总 0.1概述 0.2比较和非比较的区别 0.3基本术语 0.4排序算法的复杂度及稳定性 1.冒泡排序 算法简介 动图演示 代码演示 应用场景 算法分析 2.快速排序 算法简介 动图演示 代码演示 应用场景…

AGI的智力有可能在两年内超过人类水平

特斯拉CEO埃隆马斯克近日与挪威银行投资管理基金CEO坦根的访谈中表示&#xff0c;AGI的智力将在两年内可能超过人类智力&#xff0c;在未来五年内&#xff0c;AI的能力很可能超过所有人类。 马斯克透漏&#xff0c;去年人工智能发展过程中的主要制约因素是缺少高性能芯片&#…

信息集成:打通数据、深化业务协同与生产调度,降本增效第一步 | 创新场景...

ITValue 痛点 对于三一集团这样生产线复杂的大型组织&#xff0c;一辆重卡的生产由底盘、动力、车身、座舱、智驾网联等多个不同区域组成&#xff0c;各自使用工具与业务系统&#xff0c;彼此之间的数据各自孤立。如何打通业务部门的信息传递&#xff0c;深化业务协同与生产调度…

第11章 数据仓库和数据智能知识点梳理

第11章 数据仓库和数据智能知识点梳理&#xff08;附带页码&#xff09; ◼ 数据仓库&#xff08;Data Warehouse&#xff0c;DW&#xff09;&#xff1a;始于 20 世纪 80 年代&#xff0c;发展于 20 世纪 90 年代&#xff0c;后与商务智能&#xff08;Business Inteligence,BI…

【前后端的那些事】SpringBoot 基于内存的ip访问频率限制切面(RateLimiter)

文章目录 1. 什么是限流2. 常见的限流策略2.1 漏斗算法2.2 令牌桶算法2.3 次数统计 3. 令牌桶代码编写4. 接口测试5. 测试结果 1. 什么是限流 限流就是在用户访问次数庞大时&#xff0c;对系统资源的一种保护手段。高峰期&#xff0c;用户可能对某个接口的访问频率急剧升高&am…

mac 最小化全部程序回到桌面(基于alfred workflow)

前言 换到 mac 系统之后&#xff0c;很多快捷键根本就不好用&#xff0c;组合太多了&#xff0c;除了 cmd Q/W/A/S/X/R/Z/C/V &#xff0c;个人认为其它的真的一坨屎。像我的需求就是&#xff0c;开的窗口太多了&#xff0c;我需要全部最小化&#xff0c;再重新打开我需要那个…

Samtec应用分享 | 汽车应用中的视觉系统

【前言】 视觉系统在未来的汽车设计中扮演着关键的角色。 在过去&#xff0c;一直是由驾驶员掌握和应对道路上的危险&#xff0c;但现代车辆在保障驾驶安全方面发挥着前所未有的作用。 视觉系统&#xff0c;无论是可见光摄像头还是先进的探测系统&#xff0c;如激光雷达&…

nmap、john、tcpdump

Kali是基于Debian的Linux发行版&#xff0c;Kali Linux包含上百个安全相关工具&#xff0c;如渗透测试、安全检测、密码安全、反向工程等。 扫描&#xff1a;获取一些公开、非公开信息为目的&#xff1b;检查潜在的风险、查找可攻击的目标、收集设备/主机/系统/软件信息、发现可…

Elasticsearch:下载、启动和账号密码登录

因为我的电脑是 window&#xff0c;以下都是以 window 环境举例。 一、下载 Elasticsearch 是使用 java 开发的&#xff0c;且 7.8 版本的 ES 需要 JDK 版本 1.8 以上&#xff0c;安装前注意java环境的准备。 官网地址&#xff1a;https://www.elastic.co/cn/ 下载地址&#xf…

ros2的hello工程

第一步&#xff1a;在任意一个目录下创建功能包 ros2 pkg create --build-type ament_cmake ros2_demo --dependencies rclcpp std_msgsros2 pkg create --build-type ament_python learning_pkg_python # Python ros2命令中&#xff1a; pkg&#xff1a;表示功能包相关的功能…

【HCIP学习】OSPF协议基础

一、OSPF基础 1、技术背景&#xff08;RIP中存在的问题&#xff09; RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网 周期性发送全部路由信息&#xff0c;占用大量的带宽资源 路由收敛速度慢 以跳数作为度量值 存在路由环路可能性 每隔30秒更新 2、OSPF协议…

使用python采集VIP会电商平台商品数据②单页数据采集

获取标头&#xff1a; 响应&#xff1a;服务器返回的数据 预览&#xff1a;查看响应得数据 载荷&#xff1a;查询参数/请求参数 标头&#xff1a;查看请求的网址/请求的标头/请求方法 数据包地址&#xff1a;https://mapi.vip.com/vips-mobile/rest/shopping/pc/product/mo…

2024五一杯数学建模A题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 组织机构4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间&#xff1a;2024…

如何在TestNG中生成报告

在这篇文章中&#xff0c;我们将学习如何在TestNG中生成测试报告。我们将使用ReportNG生成报告&#xff0c;因为它生成的报告比默认的TestNG报告更好。 我们将遵循一些简单的步骤来生成报告。 添加ReportNG依赖项 <!-- https://mvnrepository.com/artifact/org.uncommons…

GPT 浅析

GPT 浅析 文章目录 GPT 浅析GPT 1无监督预训练有监督微调任务相关的输入变换 GPT2GPT3 GPT 1 在模型架构上&#xff0c;GPT-1基于Transformer构造&#xff0c;这是因为与其他卷积神经网 络或者循环神经网络相比&#xff0c;Transformer提供了效率更高的方法来处理文本 中的长期…