RL vs 最优控制:用于轨迹跟踪的 LQR(使用 Python 代码)

news2024/9/29 23:34:07

一、说明

        在本博客系列中,我们将了解最优控制的经典方法,这些方法在某种程度上为强化学习等更熟悉的主题奠定了坚实的基础。这两个领域之间存在着不可避免的共同边界,本系列旨在提出这些最优控制的形式化方法,作为强化学习方法的有效替代方案。最优控制或RL旨在在某些约束和不断变化的系统动态下找到顺序行动/控制的最佳方法。

二、关于最佳控制

图1:要遵循的航点

        在我们进入主题之前,让我们举一个简单的动机示例,它有助于在最佳控制方法中形式化不同的术语。
轨迹优化:您的汽车被赋予一项任务,以遵循定义的航点或轨迹的方式控制自己。

If 𝓾ᵢ is the control of car at time step i

𝓾ᵢ= { throttle, Steering }ᵢ

        所以汽车需要应用一系列控制步骤U:u₀,u₁,u₂... un 并到达所有航点,如图 1 所示。问题的这种顺序性质使这个问题与其他问题非常不同,这些问题可以使用最优控制轻松解决

        我们需要更正式的定义来为该方法和我们的直觉提供结构。

三、正规化Formalism

任务是找到一个允许的控制轨迹U,使用动态系统f生成相应的状态轨迹X,使得成本函数J(U)最小化。

        不要被突然涌入的行话吓倒,如果打破定义并使用我们的动机示例理解每个术语,它们非常直观。
        1.控制轨迹(U):控制UI是时间步骤i的输入,系列是这些控制步骤(油门,转向)将帮助汽车达到通过所有航点的目标。
        2.S tate 轨迹 (X):状态 xi 是对当前场景的描述。例如:我们汽车的“状态”包括机器人在世界上的当前位置(例如X,Y坐标)和方向(偏航γ)。此状态显然受到控制输入更改的影响。

        3. 动态系统(f):这只是一个数学模型,它讲述了世界是如何运作的。简单来说,这个数学模型 f 预测从状态 xi 执行操作 UI 时的下一个状态 xi+₁。

        在动力车的例子中,我们可以使用简单的运动学方程在数学上确定系统动力学f

        4. 成本函数(J):最优控制是关于成本函数的。它帮助我们在数学上描述顺序问题陈述的目标/任务。最优控制方法通过优化成本函数 J(U) 来计算最优轨迹 U

        在开始时定义的轨迹问题中,目标是到达定义的航点。我们可以将成本函数定义为汽车位置和下一个航点之间的余弦距离,因此,当我们最小化余弦距离成本时,我们更接近下一个航点。

四、线性二次稳压器 (LQR)

        最优控制问题的一个特例,其中动态方程f是线性的,目标函数是x和u的二次函数。 这个子问题在最优控制中是非常基本的,因为存在使用微分李嘉蒂方程的LQR问题的解析解

        让我们快速定义 LQR 的系统动力学函数 (f)、成本函数 J(U),我们将通过用 python 编码 LQR 解决方案来解决汽车轨迹优化问题。

        所以这个想法很简单,动力学方程是线性的,我们使用矩阵A和B来描述线性。成本函数 J(U) 不太明显:它是 x 和 u 的二次函数,

        Q(t) 称为状态成本矩阵。Q 帮助我们权衡状态向量中每个状态的相对重要性。Q 惩罚不良性能。Q 使我们能够通过使相应的 Q 值变大来定位我们想要低误差的状态。 R(t) 是输入成本矩阵。此矩阵会惩罚控制。

五、解:代数里卡蒂方程

        我们将简要讨论 LQR 问题的解析解。这是一种简化,可以得出有效的解决方案:控制律可以表示为线性状态反馈

        R 是输入成本矩阵,B 是输入矩阵。现在 S(t) 是微分李嘉蒂方程的解:

        这个问题的解决方案可以使用向后归纳法找到,我们将直接跳到最终的解决方案:

六、轨迹跟踪问题:LQR

        现在我们将使用 LQR 和 python 实现汽车轨迹跟踪问题。为了在最优控制范式中定义问题,我们需要定义状态、控制、系统动力学和成本函数。

        我们在引入问题本身时定义了状态向量。

        接下来,我们需要定义线性的系统动力学方程。

        控制 UI 包括速度和转向输入。现在我们可以使用一个简单的无摩擦运动学方程来近似世界上的汽车运动。

接下来是使用矩阵操作来查找 A 和 B 矩阵

        Q 惩罚您希望汽车的位置与现在的位置之间的巨大差异。Q 使我们能够通过使相应的 Q 值变大来定位我们想要低误差的状态。Q 沿对角线具有正值,其他地方为零。

        代码在此存储库中可用:打开ipython以提供不同的航点并自己测试分析解决方案。

七、结果和演示

        这是一个简单的问题,其中时间步长保持较大,这意味着代理可以覆盖更大的距离是单个时间步长。航点彼此垂直,因此汽车从一个航点到另一个航点采取半圆形轨迹。

        我们提供了更平滑的轨迹,航点保持非常接近。LQR 非常有效地工作。

        让我们给出更复杂的轨迹并观察不同的控制参数

        我们可以在这里观察到轨迹非常接近。

感谢您抽出宝贵时间!

Kowshik chilamkurthy

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

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

相关文章

[内网渗透]SUID提权

文章目录 [内网渗透]SUID提权0x01.什么是SUID?0x02.如何设置SUID?0x03.查找属主为root的SUID文件0x04.进行SUID提权1.find提权2.vim/vi/vim.tiny 以root权限修改文件3.bash提权4.less/more执行系统命令5.nano以root权限修改文件6.awk执行系统命令7.cp以r…

CHD6.2.1集群 Hive开启Iceberg

下载jar包 https://repo1.maven.org/maven2/org/apache/iceberg/iceberg-hive-runtime/1.0.0/iceberg-hive-runtime-1.0.0.jar 存放在/opt/cloudera/parcels/CDH/lib/hive/auxlib/ CDH集群修改hive配置 选择xml格式 粘贴即可 <property><name>iceberg.engine.hi…

QT: 完成服务器的实现

1> 思维导图 2> 手动完成服务器的实现&#xff0c;并具体程序要注释清楚 Widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QTcpServer> //服务器类 #include <QTcpSocket> //客户端类 #include <QMessageBox> //…

小狐狸ChatGPT付费创作系统V2.1.4独立版 +WEB端+ H5端 + 小程序端(新增关注自动回复)系统搭建安装教程

PCu央小狐狸ChatGPT付费创作系统V2.1.4提供最新的对应版本小程序端&#xff0c;播播资源测试相比上几版本增加了关注公众号自动回复、扫码登陆自动回复功能&#xff0c;优化了部分细节。本版小程序端对应最新的2.1.4小程序前端。绘画功能建议采用其他绘画接口-意间AI&#xff0…

Python入门【变量的作用域(全局变量和局部变量)、参数的传递、浅拷贝和深拷贝、参数的几种类型 】(十一)

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱敲代码的小王&#xff0c;CSDN博客博主,Python小白 &#x1f4d5;系列专栏&#xff1a;python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发 &#x1f4e7;如果文章知识点有错误…

nbcio-boot项目把springboot从2.3.5.RELEASE升级到2.7.10和mybatis-plus升级到最新的3.5.3.1的问题解决记录

考虑到原先版本比较老&#xff0c;今天把springboot从2.3.5.RELEASE升级到2.6.6和mybatis-plus升级到最新的3.5.3.1。 编译出现下面的问题 用参数 -e -X clean package后打印出更多的出错日志信息 at org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering.filter…

大数据未来的前景怎么样?_光点科技

随着科技的迅猛发展和互联网的普及&#xff0c;大数据已成为当今社会中不可或缺的重要资源。大数据是指庞大而复杂的数据集合&#xff0c;这些数据通过高级计算技术进行处理和分析&#xff0c;可以揭示出有价值的信息和趋势。在过去几年中&#xff0c;大数据已经在各行各业产生…

迁移学习、微调、计算机视觉理论(第十一次组会ppt)

@TOC 数据增广 迁移学习 微调 目标检测和边界框 区域卷积神经网络R—CNN

pyspark笔记:读取 处理csv文件 (pyspark DataFrame)

pyspark cmd上的命令 1 读取文件 1.1 基本读取方式 注意读取出来的格式是Pyspark DataFrame&#xff0c;不是DataFrame&#xff0c;所以一些操作上是有区别的 1.1.1 format DataFrame spark.read.format("csv").option(name,value).load(path) format表示读取…

基于飞桨paddle的卷积神经网络构建手写数字识别模型测试代码

基于飞桨paddle的优化的卷积神经网络构建手写数字识别模型测试代码 原始测试图片为255X252的图片 采用的是多层卷积神经网络实现模型 本次预测的数字是: 0 预测结果正确 测试结果&#xff1a; PS E:\project\python> & D:/Python39/python.exe e:/project/python/MNIST…

如何用Python统计CSDN质量分

文章目录 CSDN质量分查询selenium爬取博客地址单篇测试批量查询分析 CSDN质量分查询 CSDN对博客有一套分数评价标准&#xff0c;其查询入口在这里&#xff1a;质量分查询&#xff0c;效果大致如下 如果质量分太低&#xff0c;就会在博文的标题下面出现黄底黄字&#xff1a; 这…

华为OD机试真题 Java 实现【数字涂色】【2022Q4 100分】,附详细解题思路

目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示 华为OD机试 2023B卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷&#xff09;》。 刷的越多&…

程序员,必须要知道的热门开源项目!

&#x1f3c6; 文章目标&#xff1a;了解热门开源项目 &#x1f340; 入门篇&#xff1a;程序员,必须要知道的热门开源项目! ✅ 创作者&#xff1a;熊猫Jay ✨ 个人公众号: 熊猫Jay字节之旅 (文末有链接) &#x1f341; 展望&#xff1a;若本篇讲解内容帮助到您&#xff0c;请帮…

使用easyexcel实现复杂excel表格导出

1、问题描述 最近在做一个自动化开发票的需求&#xff0c;就是把网页预览的发票导出成一个excel文件。其实这个很好实现&#xff0c;就是使用blob就可以实现把网页的html内容导出成一个.xls的文件就行了。 Blob把html导出为excel文件_blob导入导出excel_金斗潼关的博客-CSDN博…

【我们一起60天准备考研算法面试(大全)-第二十七天 27/60】【真分数】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

HTTP——一、了解Web及网络基础

HTTP 一、使用HTTP协议访问Web二、HTTP的诞生1、为知识共享而规划Web2、Web成长时代3、驻足不前的HTTP 三、网络基础TCP/IP1、TCP/IP协议族2、TCP/IP的分层管理3、TCP/IP 通信传输流 四、与HTTP关系密切的协议&#xff1a;IP、TCP和DNS1、负责传输的 IP 协议2、确保可靠性的TCP…

搭建简单的chatbot并部署到HuggingFace上

调用ChatGPT接口完成聊天任务 下面的代码调用ChatGPT的ChatCompletion接口实现聊天任务&#xff0c;生成的结果如下图打印的信息所示。而且&#xff0c;在封装Conversation class中&#xff0c;message一直使用append进行追加&#xff0c;即每次调用ChatCompletion接口时都传入…

【C++入门到精通】C++入门 —— 类和对象(构造函数、析构函数)

目录 一、类的6个默认成员函数 二、构造函数 ⭕构造函数概念 ⭕构造函数的特点 ⭕常见构造函数的几种类型 三、析构函数 ⭕析构函数概念 ⭕析构函数的特点 ⭕常见析构函数的几种类型 四、温馨提示 前言 这一篇文章是上一篇的续集&#xff08;这里有上篇链接&#xff09;…

qt服务器 网络聊天室

widget.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTcpServer(this); }Widget::~Widget() {delete ui; }//启动…

C++ malloc/free和new/delete

1.malloc和free malloc是开辟内存单元的库函数&#xff1b; malloc不会调用构造函数&#xff1b; free只是释放malloc所开辟的空间&#xff1b; free不会调用析构函数。 #include <iostream> using namespace std; class A { public:A(int i0) { cout << "A&…