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.

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

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

相关文章

【记录】重装系统后的软件安装

考完研重装了系统,安装软件乱七八糟,用到什么装什么。在这里记录一套标准操作,备用。一个个装还是很麻烦,我为什么不直接写个脚本直接下载安装包呢?奥,原来是我太菜了还不会写脚本啊!先记着吧&a…

Vulnhub-tr0ll-1

一、信息收集 端口收集 PORT STATE SERVICE VERSION 21/tcp open ftp vsftpd 3.0.2 | ftp-anon: Anonymous FTP login allowed (FTP code 230) |_-rwxrwxrwx 1 1000 0 8068 Aug 09 2014 lol.pcap [NSE: writeable] | ftp-syst: | STAT: | FTP …

B端产品经理学习-版本规划管理

首先我们回顾一下用户故事,用户故事有如下特点: PRD文档的特点则如下: B端产品中用户角色不同,需求侧重也不同 决策人——公司战略需求:转型升级、降本增效、品牌提升等 管理负责人——公司管理需求:提升…

Qt6入门教程 7:信号和槽机制(原理和优缺点)

目录 一.简介 二.信号和槽 1.信号和槽机制是类型安全的 2.信号和槽是松散耦合的 三.信号(signals) 四.槽(slots) 五.信号与槽的简单模拟 六.第三方信号槽实现 七.在Qt中使用第三方的Signals和Slots 八.总结一下优点和缺…

数据结构:顺序栈

栈是一种先进后出的数据结构,只允许在一端(栈顶)操作,代码中top表示栈顶。 stack.h /* * 文件名称:stack.h * 创 建 者:cxy * 创建日期:2024年01月17日 * 描 述: …

Spring MVC的原理

Spring MVC中的MVC即模型-视图-控制器,该框架围绕一个DispatcherServlet设计而成,DispatcherServlet会把请求分发给各个处理器,并支持可配置的处理器映射和视图渲染等功能。Spring MVC的具体工作流程如下: (1&#xff…

C——语言内存函数

目录 一、memcpy的使用和模拟实现 1.memcpy函数原型 2.memcpy函数的使用 3.memcpy函数的模拟实现 二、memmove的使用和模拟实现 1.memmove函数原型 2.memmove函数的使用 3.memmove函数的模拟实现 三、memset的使用 1.memset函数原型 2.memset函数的使用 四、memcmp…

bash shell基础命令(一)

1.shell启动 shell提供了对Linux系统的交互式访问,通常在用户登录终端时启动。系统启动的shell程序取决于用户账户的配置。 /etc/passwd/文件包含了所有用户的基本信息配置, $ cat /etc/passwd root:x:0:0:root:/root:/bin/bash ...例如上述root账户信…

Python新手常见问题——列表中删不掉的0

1.测试代码 运行代码 nums1 [1,2,3,0,0,0] print(type(nums1))for i in nums1:if i 0:nums1.remove(i) print(nums1)效果如下 2.疑问: 上面代码,为什么把nums1里面的0移除不干净 3.原因: 在 Python 中,不建议在循环中直接…

修改SSH默认端口,使SSH连接更安全

以CentOS7.9为例: 1、修改配置文件 vi /etc/ssh/sshd_config 2、远程电脑可连接,暂时将SELinux关闭 # 查询状态 getenforce # 关闭 setenforce 0 # 开启 setenforce 1 3、SELinux设置(如果启用),semanage管理工具安…

mac上部署单体hbase

1. 简介 HBase 是一个开源的、分布式的、版本化的典型非关系型数据库。它是 Google BigTable 的开源实现,并且是 Apache 基金会的 Hadoop 项目的一部分1。HBase 在 Hadoop Distributed File System (HDFS) 上运行,作为一个列式存储非关系数据库管理系统…

Angular系列教程之变更检测与性能优化

文章目录 前言变更检测的原理脏检查OnPush策略 示例代码总结 前言 Angular 除了默认的变化检测机制,也提供了ChangeDetectionStrategy.OnPush,用 OnPush 可以跳过某个组件或者某个父组件以及它下面所有子组件的变化检测。 在本文中,我们将探…