ilqr 算法说明

1 Introduction

希望能用比较简单的方式将ilqr算法进行整理和总结。

2 HJB方程

假定我们现在需要完成一个从A点到B点的任务,执行这段任务的时候,每一步都需要消耗能量,可以用下面这个图表示。

在这里插入图片描述
我们在执行这个A点到B点的任务的时候,需要建立一个评价评价系统,有了明显的评价指标,我们才能对各种决策进行对比。现在问题来了,应该选择什么样的数据作为评价指标。我们在构建我们的最优决策的时候,借用动态规划的思想,通过分解的方法去反向求解我们这个最优决策序列。显然我们会使用能量损耗作为评价指标(值函数),我们希望用当前步开始,到终点所用的总能量最小。

V k − 1 ( x ) = V k ( x ) + l o s s ( b e l l m a n 方程) V_{k-1}(x)=V_k(x)+loss (bellman方程) Vk1(x)=Vk(x)+lossbellman方程)

这是一个离散的表达形式,在一个连续的系统上,上面这个公式可以看成是,从时间维度上能量消耗的速度 * 时间=单位距离能量消耗 * 距离,根据上面动态规划的策略,随着距离终点越远,我们的值函数是越大的,所以
∂ V ∂ s Δ s + l o s s = 0 ∂ V ∂ s v ∗ Δ t + l o s s 速度 ∗ Δ t = 0 ∂ V ∂ s v + l o s s 速度 = 0 \begin{aligned} \frac{\partial V}{\partial s}\Delta_s + loss=0 \\ \frac{\partial V}{\partial s} v*\Delta_t + loss速度*\Delta_t=0 \\ \frac{\partial V}{\partial s} v + loss速度=0 \end{aligned} sVΔs+loss=0sVvΔt+loss速度Δt=0sVv+loss速度=0
但是我们知道,这是我们在动态规划的贪婪策略下,才能取得的结果,并不是所有的u都能得到这样好的结果,所以有
min ⁡ u 0 { ∂ V ∂ s v + l o s s 速度 } = 0 \min_{u_0} \{ \frac{\partial V}{\partial s} v + loss速度 \}=0 u0min{sVv+loss速度}=0

现在说了很多了,看起来和hamilton毫无关系。实际上ilqr推导过程中,使用了hamilonian变量就是
H = ∂ V ∂ s v + l o s s 速度 ( h a m i l o n 公式 ) H = \frac{\partial V}{\partial s} v + loss速度 (hamilon 公式) H=sVv+loss速度(hamilon公式)
那么实际上HJB方程就是
min ⁡ u H = 0 \min_{u} H =0 uminH=0
如果hamilonian变量可导,这个公式可以拆成两个公式:
H = 0 ∂ H ∂ u = 0 ( 导数等于 0 ,才能取到极值 ) \begin{aligned} H & =0 \\ \frac{\partial H}{\partial u} &= 0 (导数等于0,才能取到极值) \end{aligned} HuH=0=0(导数等于0,才能取到极值)

3 LQR

在我们开始我们的推导之前,我们先把一些知识复习和梳理一下。
1)首先值函数V,可以看成是从当前状态到终点的损失累计J
2)LQR问题中,假定终点是无穷大时间,那么
J = ∫ ( x r e f − x ) T Q ( x r e f − x ) + u T R u J = \int (x_{ref}-x)^TQ(x_{ref}-x)+u^TRu J=(xrefx)TQ(xrefx)+uTRu
3) 我们现在的瞬时loss(loss速度)是
g ( x , u ) = ( x r e f − x ) T Q ( x r e f − x ) + u T R u g(x,u)=(x_{ref}-x)^TQ(x_{ref}-x)+u^TRu g(x,u)=(xrefx)TQ(xrefx)+uTRu
4) Hamilonian变量中的速度,一般由动力学系统(微分系统)给出。
x ˙ = f ( x , u ) = A ( x r e f − x ) + B u \dot{x}=f(x,u)=A(x_{ref}-x)+Bu x˙=f(x,u)=A(xrefx)+Bu

那么HJB方程有
∂ J ∂ x T ( A ( x r e f − x ) + B u ) + ( x r e f − x ) T Q ( x r e f − x ) + u T R u = 0 B ∂ J ∂ x + 2 R u = 0 \begin{aligned} \frac{\partial J}{\partial x}^T(A (x_{ref}-x)+Bu)+(x_{ref}-x)^TQ(x_{ref}-x)+u^TRu & =0 \\ B\frac{\partial J}{\partial x}+2Ru & = 0 \end{aligned} xJT(A(xrefx)+Bu)+(xrefx)TQ(xrefx)+uTRuBxJ+2Ru=0=0
这个公式中 ∂ J ∂ x \frac{\partial J}{\partial x} xJ没法直接求,但是根据 J = ∫ ( x r e f − x ) T Q ( x r e f − x ) + u T R u J = \int (x_{ref}-x)^TQ(x_{ref}-x)+u^TRu J=(xrefx)TQ(xrefx)+uTRu,可以猜测

∂ J ∂ x = 2 S ( x r e f − x ) ( 有个 2 为了计算方便 ) \frac{\partial J}{\partial x}=2S(x_{ref}-x)(有个2为了计算方便) xJ=2S(xrefx)(有个2为了计算方便)
并且我们采用最简单的线性控制策略
u = K ( x r e f − x ) u=K(x_{ref}-x) u=K(xrefx)
我们把这两个假设代入到刚才那个方程中,虽然我们有两个未知量,但是我们有两个方程,大概率能求解。
2 ( x r e f − x ) T S T ( A ( x r e f − x ) + B K ( x r e f − x ) ) + ( x r e f − x ) T Q ( x r e f − x ) + ( x r e f − x ) T K T R K ( x r e f − x ) = 0 2 B S ( x r e f − x ) + 2 R K ( x r e f − x ) = 0 \begin{aligned} 2(x_{ref}-x)^TS^T(A (x_{ref}-x)+BK(x_{ref}-x))+(x_{ref}-x)^TQ(x_{ref}-x)+(x_{ref}-x)^TK^TRK(x_{ref}-x) & =0 \\ 2BS(x_{ref}-x)+2RK(x_{ref}-x) & =0 \end{aligned} 2(xrefx)TST(A(xrefx)+BK(xrefx))+(xrefx)TQ(xrefx)+(xrefx)TKTRK(xrefx)2BS(xrefx)+2RK(xrefx)=0=0
进行简化,得到
2 S A + 2 S B K + Q + K T R K = 0 K = − R − 1 B S 2 S A − 2 S B R − 1 B S + Q + S B T R − 1 B S = 0 2 S A − S B R − 1 B S + Q = 0 \begin{aligned} 2SA+2SBK+Q+K^TRK &=0 \\ K &=-R^{-1}BS \\ 2SA-2SBR^{-1}BS+Q+SB^TR^{-1}BS &=0 \\ 2SA-SBR^{-1}BS+Q&=0 \\ \end{aligned} 2SA+2SBK+Q+KTRKK2SA2SBR1BS+Q+SBTR1BS2SASBR1BS+Q=0=R1BS=0=0
这就是Ricaati方程,先把riccati方程借出来,得到S,然后再用$K =-R^{-1}BS $, 就能得到我们控制器所用的参数了。
注意,我这里推到和传统lqr推导不一样,我使用了 x r e f − x x_{ref}-x xrefx

最后我们总结一下,原来lqr,就是对HJB方程进行展开而已。

3 ilqr

ilqr 和lqr不同之处,在于需要在有限长度的情况下,做出决策。
对于当前状态的值函数,满足
J = ∑ 0 k − 1 { ( x i r e f − x i ) T Q ( x i r e f − x i ) + u i T R u i } + ( x k r e f − x k ) T Q ( x k r e f − x k ) + u k T R u k J = \sum_0^{k-1} \{(x_{iref}-x_i)^TQ(x_{iref}-x_i)+u_i^TRu_i \}+(x_{kref}-x_k)^TQ(x_{kref}-x_k)+u_k^TRu_k J=0k1{(xirefxi)TQ(xirefxi)+uiTRui}+(xkrefxk)TQ(xkrefxk)+ukTRuk

这个时候的Hamlitonian变量中的 ∂ J ∂ x \frac{\partial J}{\partial x} xJ,物理意义是单位距离内,能量的变化。[1]
在这里插入图片描述

在这里插入图片描述
因为
∂ P k ∂ u k = 0 \frac{\partial P^k}{\partial u_k}=0 ukPk=0
根据这个公式很容易推导得到8,
因为
V x k = ∂ P k ∂ x k V_x^k=\frac{\partial P^k}{\partial x_k} Vxk=xkPk
并且因为 δ u k \delta_{uk} δuk中有 δ x k \delta_{xk} δxk的分量。
同理
V x x k = ∂ 2 P k ∂ 2 x k V_{xx}^k=\frac{\partial^2 P^k}{\partial ^2x_k} Vxxk=2xk2Pk

Reference

[1] Chen, Jianyu, Wei Zhan, and Masayoshi Tomizuka. “Autonomous driving motion planning with constrained iterative LQR.” IEEE Transactions on Intelligent Vehicles 4.2 (2019): 244-254.
[2] You, Changxi. “Real Time Motion Planning Using Constrained Iterative Linear Quadratic Regulator for On-Road Self-Driving.” arXiv preprint arXiv:2202.08400 (2022).
[3] https://github.com/pparmesh/Constrained_ILQR
[4] Howell, Taylor A., Brian E. Jackson, and Zachary Manchester. “ALTRO: A fast solver for constrained trajectory optimization.” 2019 IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, 2019.

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

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

相关文章

什么是区块链?

区块链 区块链 (英语:blockchain)是借由 密码学 与 共识机制 等技术建立,存储数据的 保证不可篡改和不可伪造的 分布式技术。 什么是区块 区块 就是将一批数据打包在一起,并且给打包出来的区块编号。第一个区块的编…

vue3-事件处理

事件监听 DOM 事件监听指令 v-on 简写 v-on:click"handler" 或者 click"handler"事件处理器 (handler) 的值可以是: 内联事件处理器:比如 click 方法事件处理器:一个指向组件上定义的方法的属性名或是路径。 在内联…

【干货】网络安全之URL过滤

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 URL过滤是一种针对用户的URL请求进行上网控制的技术,通过允许或禁止用户访问某些网页资源,达到规范上网行为和降低安全…

matlab行操作快?还是列操作快?

在MATLAB中,通常情况下,对矩阵的列进行操作比对行进行操作更有效率。这是因为MATLAB中内存是按列存储的,因此按列访问数据会更加连续,从而提高访问速度。 一、实例代码 以下是一个简单的测试代码, % 测试矩阵大小 ma…

Python实战 -- PySide6 制作天气查询软件

一、环境准备 开发环境:Python 3.9.2 pycharm PySide6 申请天气情况 API :https://console.amap.com/dev/key/app designer 设计 ui 目录下 Weather.ui 转换为 Weather.py 结果显示 二、完整代码 import sysfrom PySide6 import QtWidgetsimport…

Mysql深度分页优化的一个实践

问题简述: 最近在工作中遇到了大数据量的查询场景, 日产100w左右明细, 会查询近90天内的数据, 总数据量约1亿, 业务要求支持分页查询与导出. 无论是分页或导出都涉及到深度分页查询, mysql通过limit/offset实现的深度分页查询会存在全表扫描的问题, 比如offset1000w, limit10…

7. UE5 RPG修改GAS的Attribute的值

前面几节文章介绍了如何在角色身上添加AbilitySystemComponent和AttributeSet。并且还实现了给AttributeSet添加自定义属性。接下来,实现一下如何去修改角色身上的Attribute的值。 实现拾取药瓶回血功能 首先创建一个继承于Actor的c类,actor是可以放置到…

WAF攻防相关知识点总结2-代码免杀绕过

WAF的检测除了有对于非正常的流量检测外还对于非正常的数据包特征进行检测 以宝塔为例 在宝塔的后台可以放置一句话木马的文件 宝塔不会对于这个文件进行拦截,但是一旦我们使用菜刀蚁剑等webshell工具去进行连接的时候,数据报中有流量特征就会被拦截 …

JRT和springboot比较测试

想要战胜他,必先理解他。这两天系统的学习Maven和跑springboot工程,从以前只是看着复杂,现在到亲手体验一下,亲自实践的才是更可靠的了解。 第一就是首先Maven侵入代码结构,代码一般要按约定搞src/main/java。如果是能…

C#判断输入的数字是否符合货币格式

目录 一、用正则表达式判断输入是否符合货币格式 二、用double.TryParse()判断输入是否符合货币格式 一、用正则表达式判断输入是否符合货币格式 // 判断输入是否货币合格 using System.Text.RegularExpressions; namespace IsCurrency_Format {partial class Program{stati…

虚幻UE 特效-Niagara特效实战-雨天

回顾Niagara特效基础知识:虚幻UE 特效-Niagara特效初识 其他两篇实战:虚幻UE 特效-Niagara特效实战-火焰、烛火、虚幻UE 特效-Niagara特效实战-烟雾、喷泉 本篇笔记我们再来实战雨天,雨天主要用到了特效中的事件。 文章目录 一、雨天1、创建雨…

九、K8S-label和label Selector

label和label selector 标签和标签选择器 1、label 标签: 一个label就是一个key/value对 label 特性: label可以被附加到各种资源对象上一个资源对象可以定义任意数量的label同一个label可以被添加到任意数量的资源上 2、label selector 标签选择器 L…

k8s的对外服务ingress

1、service的作用体现在两个方面 (1)集群内部:不断跟踪pod的变化,更新deployment中的pod对象,基于pod的ip地址不断变化的一种服务发现机制 (2)集群外部:类似于负载均衡器&#xff…

【计算机组成与体系结构Ⅱ】Tomasulo 算法模拟和分析(实验)

实验5:Tomasulo 算法模拟和分析 一、实验目的 1:加深对指令级并行性及开发的理解。 2:加深对 Tomasulo 算法的理解。 3:掌握 Tomasulo 算法在指令流出、执行、写结果各阶段对浮点操作指令以及 load 和 store 指令进行了什么处…

MATLAB R2023a安装教程

鼠标右击软件压缩包,选择“解压到MATLAB.R2023a”。 打开解压后的文件夹,鼠标右击“R2023a_Windows_iso”选择“装载”。 鼠标右击“setup.exe”选择“以管理员身份运行”。 点击“高级选项”选择“我有文件安装密钥”。 点击“是”,然后点击…

【MCAL】ADC模块详解

目录 前言 正文 1.ADC模块介绍 2.关键概念及依赖的模块 2.1 ADC依赖的模块 3.ADC功能示例 3.1 ADC Buffer Access Mode示例 3.1.1配置(Configuration) 3.1.2 初始化(Initialization) 3.1.3 Adc_GetStreamLastPointer的使…

IP双栈技术

双栈技术产生 在IPv4 Internet向IPv6 Internet过渡的初期,IPv4网络已被大量部署,而IPv6网络只是散布在世界各地的一些孤岛。故而需要一些技术实现IPv6孤岛之间的互联以及IPv4节点和IPv6节点之间的互通。 双栈协议概念 双栈协议是指所有设备必须支持IP…

使用Python的pygame库实现下雪的效果

使用Python的pygame库实现下雪的效果 关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 先给出效果图: 源码如下: import pygame import random# 初始化pygame pygame.init()# 设置屏幕尺寸 width…

【重学C语言】四、常量、变量和基本数据类型转换

【重学C语言】四、常量、变量和基本数据类型转换 1. 常量和变量1.1 常量1.1.1 直接常量1.1.1.1 整数常量1.1.1.2 浮点常量1.1.1.3 字符常量1.1.1.4字符串常量 1.1.2符号常量 1.2 标识符1.3 变量1.3.1 变量的定义1.3.2 左值(Lvalues)和右值(Rv…

一款自动化提权工具

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。…