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.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目架构之Zabbix部署

1 项目架构 1.1 项目架构的组成 业务架构:客户端 → 防火墙 → 负载均衡(四层、七层) → web缓存/应用 → 业务逻辑(动态应用) → 数据缓存 → 数据持久层 运维架构:运维客户端 → 跳板机/堡垒机&#x…

2023年第十四届蓝桥杯软件赛省赛总评

报名明年4月蓝桥杯软件赛的同学们,如果你是大一零基础,目前懵懂中,不知该怎么办,可以看看本博客系列:备赛20周合集 20周的完整安排请点击:20周计划 每周发1个博客,共20周。 在QQ群上交流答疑&am…

VUE工程化--vue组件注册

组件注册的两种方式: 1. 局部注册:只能在注册的组件内使用 2. 全局注册:所有组件内都能使用 局部注册步骤: 1、导入 import MyHeader from "./components/myHeader.vue"; import MyMain from "./components/myMa…

TCP连接TIME_WAIT

TCP断开过程: TIME_WAIT的作用: TIME_WAIT状态存在的理由: 1)可靠地实现TCP全双工连接的终止 在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN&#xf…

LLM漫谈(三)| 使用Chainlit和LangChain构建文档问答的LLM应用程序

一、Chainlit介绍 Chainlit是一个开源Python包,旨在彻底改变构建和共享语言模型(LM)应用程序的方式。Chainlit可以创建用户界面(UI),类似于由OpenAI开发的ChatGPT用户界面,Chainlit可以开发类似…

虚拟机CentOS7.5编译安装Qt4.8.7

虚拟机CentOS7.5编译安装Qt4.8.7 一.下载Qt二.安装步骤 一.下载Qt 官网下载链接:Qt4.8.7 官网下载速度可能会非常慢,本人已上传至CSDN,点此下载,下载后需要先用7z软件解压成zip包。 二.安装步骤 环境安装 yum install libX11…

go语言(三)----函数

1、函数单变量返回 package mainimport "fmt"func fool(a string,b int) int {fmt.Println("a ",a)fmt.Println("b ",b)c : 100return c}func main() {c : fool("abc",555)fmt.Println("c ",c)}2、函数多变量返回 pack…

Nsis打包Unity Exe文件(通用)

Nsi 脚本 !include "MUI2.nsh"#使用现代UI Unicode true #使用Unicode !define EXENAME "exeName" #定义常量 exe名称 !define SHORTCUT "快捷方式名称" #定义桌面快捷方式的中文名称Name ${EXENAME} #安装程序的title OutFile "${EXENAME…

【C++】入门C++前想要了解的小知识

个人主页 : zxctsclrjjjcph 文章封面来自:艺术家–贤海林 如有转载请先通知 目录 1. 前言2. 什么是C3. C的发展史4. C的重要性4.1 语言的使用广泛度4.2 在工作领域中4.3 在校招领域中 5. 如何学习C5.1 看看别人怎么学习的5.2 自己怎么学 1. 前言 今天开…

FFmpeg之SwrRessample

文章目录 一、概述二、重采样流程三、重要结构体3.1、SwrContext3.2、ResamplerContext 四、重要函数4.1、swr_alloc4.2、swr_alloc_set_opts4.3、av_opt_set_*4.4、swr_init4.5、av_samples_alloc_array_and_samples4.6、av_samples_alloc4.7、swr_convert4.8、swr_get_delay4…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票帖子排行实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

【idea】idea插件编写教程,博主原创idea插件已上架idea插件市场 欢迎下载

前言:经常使用Objects.equals(a,b)方法的同学 应该或多或少都会因为粗心而传错参, 例如日常开发中 我们使用Objects.equals去比较 status(入参),statusEnum(枚举), 很容易忘记statusEnum.getCode() 或 statusEnum.getVaule() ,再比…

Java可视化物联网智慧工地综合云平台源码 私有化部署

智慧工地平台围绕建筑施工人、物、事的安全管理为核心,对应研发了劳务实名制、视频监控、扬尘监测、起重机械安全监测、安全帽监测等功能一体化管理的解决方案。 智慧工地是聚焦工程施工现场,紧紧围绕人、机、料、法、环等关键要素,综合运用…

docker安装运行CloudBeaver并设置默认语言为中文

1、CloudBeaver CloudBeaver 是一个开源的 Web 数据库管理工具,它提供了一个基于浏览器的用户界面,允许用户管理和操作各种类型的数据库。CloudBeaver 支持多种数据库系统,包括但不限于 PostgreSQL、MySQL、SQLite、Oracle、SQL Server 以及…

RabbitMQ入门精讲

1. 什么是消息队列 消息指的是两个应用间传递的数据。数据的类型有很多种形式,可能只包含文本字符串,也可能包含嵌入对象。 “消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中,通常有生产者和消费者两个角色。…

【Java基础_01】Java运行机制及运行过程

【Java基础_01】Java运行机制及运行过程 文章目录 【Java基础_01】Java运行机制及运行过程1.Java 运行机制及运行过程1.1 Java 核心机制-Java 虚拟机 [JVM java virtual machine] 1.2 JDK,JRE1.3 JVM,JDK和JRE1.4 环境变量path1.4.1 为什么要配置path1.4.2 配置环…

【一步一步学】ROS软路由设置代理IP教程

申明:本文仅针对国内L2TP/PPTP,适用于国内的游戏加速或学术研究,禁止一切利用该技术的翻墙行为。 今天和大家分享的是ROS软路由如何设置分流的问题,很多做过工作室的小伙伴肯定很熟悉。 简单来讲,ROS软路由就是普通的路…

数模转换 120dB,192kHz DAC 音频转换芯片DP7398 软硬件兼容替代CS4398

数模转换芯片(DAC)是一种将数字信号转换为模拟信号的集成电路。它通过将数字数据转换为相应的模拟电压或电流输出,实现了数字系统与模拟系统之间的接口和互联。 DAC具有许多优势,使其在各种应用领域得到广泛应用。首先&#xff0c…

接口测试 01 -- 基础与原理

接口概述 什么是接口 接口是计算机系统中不同组件之间进行交流和互动的一种方式。 在软件开发中,接口通常指的是一组定义了输入、输出、功能和规范的方法、函数或协议。接口定义了组件之间的通信协议,使得它们可以相互协作,实现特定的功能。…

23.实战演练--个人主页

<?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"><applicationandroid:allowBackup"true"an…