当前位置: 首页 > news >正文

车辆运动模型中LQR代码实现

一、前言

最近看到关于架构和算法两者关系的一个描述,我觉得非常认同,分享给大家。

1、好架构起到两个作用:合理的分解功能、合理的适配算法;
2、好的架构是好的功能的必要条件,不是充分条件,一味追求架构的完美是不可取的,并且不存在完美的架构,只存在合适的架构;
3、好的架构可以一定层度上提升算法的能力,但功能开发不能将重心全放在框架上,应该追求框架+算法的适配,从而实现 1+1 > 2 。

**我的理解是这样的:**架构的设计一定要结合功能、硬件、人力、成本、时间等多种因素,在此基础上尽量去满足算法的低耦合、高内聚。

二、LQR跟踪效果视频

说明:LQR跟踪比较依赖路径的平滑度(路径曲率的变化)

LQR路径跟踪

三、车辆运动学模型的详细推导

上一篇文章中(LQR原理及其在路径跟踪的应用,http://t.csdnimg.cn/4YDos),有人私信问关于车辆运动学模型的推导过程,这里我进行更详细的推导
在这里插入图片描述
在这里插入图片描述
到这里就应该没什么问题了吧?再通过向前欧拉法离散化,套公式即可求解;

四、差速模型的详细推导

其一:为了举一反三,所有对差速模型也进行了推导;
其二:即使控制对象是车辆模型,也可以先使用差速模型先进行计算得到v,w,然后根据车辆的模型二次解算得到速度和转向角。
在这里插入图片描述

五、具体代码实现

注意事项:
1、使用lqr跟踪一段轨迹,轨迹中的v,w不知道的情况下可以给0,但那么lqr中的调节矩阵R就应该尽量的小;
2、轨迹中的yaw尽量保证突变较小(没有前置轨迹平滑的基础可以简单用均值滤波),否则lqr无法收敛,跟踪效果很差;
3、以差速模型计算得到v,w ,可以再车辆的模型二次解算得到速度和转向角。

/*** lqr_controler.hpp* @brief  lqr控制器 构建的是一个差速机器人模型* @author MCE* @date 2024-5-9*/
#ifndef LQR_CONTROLER
#define LQR_CONTROLER
#include <math.h>
#include <Eigen/Dense>
#include <iostream>
#include "utils.hpp"
namespace lqr_control {
using namespace std;
using namespace Eigen;
using namespace lqr_control;class LQRControler {
public:LQRControler(){};/*** @brief lqr 初始化* @return void*/void init();/*** @brief lqr 控制器 输出 v, w* @param robot_state 机器人状态* @param front_point 预瞄点* @param v 以引用的方式输出v* @param w 以引用的方式输出w* @return void*/void lqrControl(const state& robot_state, const state& front_point, float& v, float& w);private:MatrixXf A;MatrixXf B;MatrixXf Q;MatrixXf R;// P矩阵最多迭代次数int n;// 离散化控制周期float dt;// P容许误差float eps;/*** @brief 黎卡迪计算方程* @return MatrixXf P矩阵*/MatrixXf calRicatti();/*** @brief 计算AB 矩阵* @return void*/void calAB(const state& front_point);
};
} // namespace lqr_control
#endif
/*** lqr_controler.cpp* @brief  lqr控制器* @author MCE* @date 2024-5-9*/
#include "../include/lqr_controler.hpp"namespace lqr_control {void LQRControler::init() {A.resize(3, 3);A.setZero();B.resize(3, 2);B.setZero();Q.resize(3, 3);Q << 1.0, 0.0, 0.0,0.0, 1.0, 0.0, 0.0, 0.0, 1.0; R.resize(2, 2);R << 0.001, 0.0, 0.0, 0.001; n = 100;dt = 0.02;eps = 1.0e-4;
}void LQRControler::calAB(const state& front_point) {A << 1.0, 0.0, -front_point.linear_vel * dt * sin(front_point.yaw), 0.0, 1.0, front_point.linear_vel * dt * cos(front_point.yaw), 0.0, 0.0, 1.0;B << dt * cos(front_point.yaw), 0.0, dt * sin(front_point.yaw), 0.0, 0.0, dt;
}// 离散时间Riccati方程求解函数
MatrixXf LQRControler::calRicatti() {MatrixXf P = Q;for (int i = 0; i < n; ++i) {MatrixXf P_next = A.transpose() * P * A - A.transpose() * P * B * (R + B.transpose() * P * B).inverse() * B.transpose() * P * A + Q;if ((P_next - P).norm() < eps) {P = P_next;break;}P = P_next;}return P;
}void LQRControler::lqrControl(const state& robot_state, const state& front_point, float& v, float& w) {MatrixXf X(3, 1);X << robot_state.x - front_point.x, robot_state.y - front_point.y, angleNormalize(robot_state.yaw - front_point.yaw);calAB(front_point);MatrixXf P = calRicatti();MatrixXf K = -(R + B.transpose() * P * B).inverse() * B.transpose() * P * A;MatrixXf U = K * X;v = U(0, 0);w = U(1, 0);
}
} // namespace lqr_control

欢迎大家讨论、交流!

相关文章:

车辆运动模型中LQR代码实现

一、前言 最近看到关于架构和算法两者关系的一个描述&#xff0c;我觉得非常认同&#xff0c;分享给大家。 1、好架构起到两个作用&#xff1a;合理的分解功能、合理的适配算法&#xff1b; 2、好的架构是好的功能的必要条件&#xff0c;不是充分条件&#xff0c;一味追求架构…...

Springboot集成feign远程调用

需求&#xff1a;在leadnews-wemedia微服务里需要调用leadnews-article微服务的接口。新建一个支持feign调用的名为heima-leadnews-feign-api的模块 heima-leadnews-feign-api的pom文件里导入openfeign依赖 <dependency><groupId>org.springframework.cloud</g…...

构建NFS远程共享存储

nfs-server:10.1.59.237 nfs-web:10..159.218 centos7,服务端和客户端都关闭防火墙和selinux内核防火墙&#xff0c;如果公司要求开启防火墙&#xff0c;那需要放行几个端口 firewall-cmd --add-port2049/tcp --permanent firewall-cmd --add-port111/tcp --permanent firew…...

X9C103SIZT1 数字电位计 IC 10K SOIC-8 参数 应用案例

X9C103SIZT1 是一款数字电位器&#xff0c;属于 X9C103 系列。它是一款100抽头的非易失性数字电位器&#xff0c;阻值为 10 kOhm&#xff0c;封装形式为 SOIC-8。这款器件常用于需要调整电子设备阻值的应用中&#xff0c;如音频设备、电源管理以及传感器校准等。 X9C103SIZT1 的…...

redis深入理解之数据存储

1、redis为什么快 1&#xff09;Redis是单线程执行&#xff0c;在执行时顺序执行 redis单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取(socket 读)、解析、执行、内容返回 (socket 写)等都由一个顺序串行的主线…...

用20行python写一个最简单的网站

先安装flask框架&#xff0c;cmd命令行 pip install flask&#xff0c;或pycharm -> setting -> project -> python interpreter 搜索安装 # 引入Flask框架 from flask import Flask# 实例化Flask应用 app Flask(__name__)# 定义一个路由&#xff0c;当用户访问网站…...

零基础入门篇①③ Python可变序列类型--列表

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏限时一个月(5.8~6.8)重…...

微服务项目 - SpringBoot 2.x 升级到 SpringBoot 3.2.5,保姆级避坑

目录 一、前言 二、取经之路 2.1、依赖版本情况 2.2、MyBatis-Plus 依赖改变...

【2024亚马逊云科技峰会】Amazon Bedrock + Llama3 生成式AI实践

在 4 月 18 日&#xff0c;Meta在官网上公布了旗下最新大模型Llama 3。目前&#xff0c;Llama 3已经开放了80亿&#xff08;8B&#xff09;和700亿&#xff08;70B&#xff09;两个小参数版本&#xff0c;上下文窗口为8k&#xff0c;据称&#xff0c;通过使用更高质量的训练数据…...

ApacheCordova 12 +Vs 2022 项目搭建教程_开发环境搭建教程

一、安装 cordova cli 并使用命令创建项目 npm install –g cordova 详细参考: Apache Cordova开发环境搭建(二)VS Code_天马3798-CSDN博客_cordova vscode 二、 Vs 2022 Android 开发搭建+调试 .Net MAUI 搭建Android 开发环境-CSDN博客 三、配置 JDK 环境变量、配置…...

地磁暴红色预警来袭,普通人该如何应对?绝绝子的防护指南来了

近日&#xff0c;国家空间天气监测预警中心发布了一则令人瞩目的消息——地磁暴红色预警。这一预警不仅提醒我们地磁暴即将影响我国的电离层和低轨卫星&#xff0c;更让我们深刻认识到地球空间环境的脆弱性和复杂性。对于普通公众而言&#xff0c;地磁暴的概念可能相对陌生&…...

从零自制docker-12-【overlayfs】

文章目录 overlayfsexec.Command("tar", "-xvf", busyboxTarURL, "-C", busyboxURL).CombinedOutput()exec.Command格式差异 挂载mount卸载unmount代码地址结果演示 overlayfs 就是联合文件系统&#xff0c;将多个文件联合在一起成为一个统一的…...

凸优化理论学习一|最优化及凸集的基本概念

文章目录 一、优化问题&#xff08;一&#xff09;数学优化&#xff08;二&#xff09;凸优化 二、凸集&#xff08;一&#xff09;一些标准凸集&#xff08;二&#xff09;保留凸性的运算&#xff08;三&#xff09;正常锥和广义不等式&#xff08;四&#xff09;分离和支撑超…...

【R语言从0到精通】-4-回归建模

通过之前的文章&#xff0c;我们已经基本掌握了R语言的基本使用方法&#xff0c;那从本次教程开始&#xff0c;我们开始聚焦如何使用R语言进行回归建模。 4.1 回归简介 回归分析是一种统计学方法&#xff0c;用于研究两个或多个变量之间的相互关系和依赖程度。它可以帮助我们了…...

论文 学习 Transformer : Attention Is All You Need

目录 概述&#xff1a; 对摘要的理解&#xff1a; 框架解析 按比例缩放的点积注意力 多头注意力机制 前馈神经网络与位置编码 概述&#xff1a; transformer 是一个encoder ——decoder 结构的用于处理序列到序列转换任务的框架&#xff0c;是第一个完全依赖自注意力机制…...

工厂模式+策略模式

输入实体 基类 import lombok.Data;Data public class PersonInputDto {private Integer id;private String name; }子类 Data AllArgsConstructor NoArgsConstructor public class ManPerson extends PersonInputDto {private String sex; }Data AllArgsConstructor NoArgs…...

TMS320F28335学习笔记-时钟系统

第一次使用38225使用了普中的clocksystem例程进行编译&#xff0c;总是编译失败。 问题一&#xff1a;提示找不到文件 因为工程的头文件路径没有包含&#xff0c;下图的路径需要添加自己电脑的路径。 问题二 找不到库文件 例程种的header文件夹和common文件夹不知道从何而来…...

【Apache POI】Apache POI-操作Excel表格-简易版

Catalog Apache POI-操作Excel表格1. 需求2. 优点3. 缺点4. 应用场景5. 使用方法6. SpringBoot工程中处理Excel表格7. Demo示例 Apache POI-操作Excel表格 1. 需求 大多数项目的在运营过程中&#xff0c;会产生运营数据&#xff0c;如外卖系统中需要统计每日的订单完成数、每…...

MySQL系列之索引

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 往期热门专栏回顾 专栏…...

【问题分析】锁屏界面调起google语音助手后壁纸不可见【Android 14】

1 问题描述 为系统和锁屏分别设置两张不同的壁纸&#xff0c;然后在锁屏界面长按Power调起google语音助手后&#xff0c;有时候会出现壁纸不可见的情况&#xff0c;如以下截图所示&#xff1a; 有的时候又是正常的&#xff0c;但显示的也是系统壁纸&#xff0c;并非是锁屏壁纸…...

OpenClaw技能扩展指南:为GLM-4.7-Flash添加自定义功能

OpenClaw技能扩展指南&#xff1a;为GLM-4.7-Flash添加自定义功能 1. 为什么需要自定义技能 去年冬天&#xff0c;当我第一次尝试用OpenClaw自动整理电脑上的照片时&#xff0c;发现现有的技能库无法满足我的特殊需求——按照拍摄地点和人物自动分类。这让我意识到&#xff0…...

计算机毕业设计:基于Django与LSTM的大众点评评价预测系统 Django框架 LSTM Hadoop Spark Hive 可视化 大数据 食品 食物(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W&#xff0c;前互联网大厂软件研发、集结硕博英豪成立软件开发工作室&#xff0c;专注于计算机相关专业项目实战6年之久&#xff0c;累计开发项目作品上万套。凭借丰富的经验与专业实力&#xff0c;已帮助成千上万的学生顺利毕业&#xff0c;…...

TinyMCE 5插件开发实战:手把手教你定制首行缩进功能(Vue版)

TinyMCE 5插件开发实战&#xff1a;手把手教你定制首行缩进功能&#xff08;Vue版&#xff09; 在内容创作领域&#xff0c;富文本编辑器的灵活性和扩展性往往决定了最终的用户体验。TinyMCE作为一款广受欢迎的富文本编辑器&#xff0c;其插件系统为开发者提供了无限可能。本文…...

语义分割实战:如何用Python快速计算mIoU和mAcc(附完整代码)

语义分割实战&#xff1a;Python高效计算mIoU与mAcc的工程化实现 在计算机视觉领域&#xff0c;语义分割模型的性能评估离不开mIoU&#xff08;平均交并比&#xff09;和mAcc&#xff08;平均准确率&#xff09;这两个核心指标。许多教程停留在理论公式层面&#xff0c;而实际项…...

Arco design vue 表格排序踩坑

父组件&#xff1a;<template><div class"p-10"><!-- 商户管理 --><div class"invate-box placeholder:"><div class"flex items-center"><SvgIcon :name"user"></SvgIcon><div class&q…...

ColorMemLCD电子纸驱动库:面向LPM013M126A的嵌入式低功耗显示方案

1. ColorMemLCD 库概述ColorMemLCD 是一款专为 JDI&#xff08;Japan Display Inc.&#xff09;LPM013M126A 型彩色内存式 LCD 显示模块设计的嵌入式图形驱动库。该库并非从零构建&#xff0c;而是继承自 ARM mbed OS 生态中广泛使用的GraphicDisplay抽象基类&#xff0c;延续了…...

比亚迪多款新车激光雷达性能超越华为:千线级感知开启智驾新纪元

2026年,中国智能驾驶行业正式进入“千线级激光雷达”时代。继华为发布896线双光路激光雷达后,比亚迪携速腾聚创EM4数字化激光雷达强势反击,以1080线物理扫描、600米最远探测的硬核参数,在核心感知硬件上实现对华为的全面超越。这一突破不仅标志着比亚迪补齐了智能化短板,更…...

iPhone 抓包失败 4 种具体情况逐个解决方法

抓不到包这个描述太模糊了&#xff0c;在实际调试中&#xff0c;这句话至少对应四种完全不同的情况&#xff1a; 完全没有请求只有浏览器能抓到能抓到但 HTTPS 解不开能抓到但数据不完整 如果不先分清楚是哪一种&#xff0c;就会一直重复安装证书或改代理配置。一、先做一个验证…...

3个高效能的核心功能:League-Toolkit开源工具效率提升指南

3个高效能的核心功能&#xff1a;League-Toolkit开源工具效率提升指南 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Too…...

计算机毕业设计springboot基于的游戏后台管理系统 基于SpringBoot的网游运营管理平台的设计与实现 基于SpringBoot架构的电子竞技服务支撑系统的设计与实现

计算机毕业设计springboot基于的游戏后台管理系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着互联网技术的飞速发展和智能终端设备的全面普及&#xff0c;游戏产业已迅速…...