自动驾驶:LQR、ILQR和DDP原理、公式推导以及代码演示(六、ILQR正则化和line search)

(六)ILQR正则化和line search

1. ILQR正则化

在iLQR中,我们通常线性化系统动力学并对目标函数进行二阶近似。在反向传播步骤中,我们需要计算逆矩阵Q_{uu}(控制变量对目标函数的二阶导数矩阵),用以更新控制增量。但在某些情况下,Q_{uu}可能是奇异的或者接近奇异,导致逆矩阵的计算不稳定。为了避免这种问题,可以通过加入正则化项,使得Q_{uu}变得更具条件性。

方法1:基于梯度下降的正则化

一种常见的正则化方法是在Q_{uu}上加上一个对角项,这类似于梯度下降中的学习率调节。

令正则化矩阵为\lambda I,其中I是单位矩阵,\lambda是正则化系数。我们可以将Q_{uu}调整为:

Q_{uu}^{\text{reg}} = Q_{uu} + \lambda I

通过这种方式,即便Q_{uu}是非正定或接近奇异的,我们仍然可以通过计算 Q_{uu}^{\text{reg}}的逆矩阵来进行控制更新。

方法2:信赖域正则化(Trust-Region Regularization)

另一种正则化方法是基于信赖域(trust region)优化的思想。我们在优化控制增量时限制其大小。具体而言,控制增量\delta u_k的大小受限于一个固定范围:

\|\delta u_k\| \leq \Delta

这种方法通过限制更新步长来确保每一步的更新都不会过大,从而提高优化的鲁棒性。

正则化对算法的影响

收敛性: 适当的正则化能够提高 DDP 收敛的稳定性,但过大的正则化参数\lambda可能会减慢算法的收敛速度。

步长控制: 一些算法中,正则化系数\lambda会根据当前迭代的效果动态调整。若迭代效果较好,减小\lambda以加快收敛;若效果较差,则增大\lambda以确保稳定性。

2. 线搜索(Line Search)

在 iLQR中,线搜索(Line Search)是一种常见的技巧,用于在更新控制序列时进一步提高算法的数值稳定性和收敛性。在 iLQR 的反向传播阶段,通过局部线性化的系统模型和二次近似的目标函数来计算新的控制增量。然而,由于近似并不精确,直接应用所得到的控制更新可能会导致目标函数值的增加,尤其是当系统具有高度非线性时。为了防止目标值恶化,线搜索通过控制步长来确保新的控制输入能带来实际的性能提升。

线搜索的基本步骤

线搜索的核心思想是在一条给定的方向上缩小步长,直到找到一个合适的步长,使得目标函数有所改善。以下是具体的步骤:

  1. 初始控制增量: 通过反向传播步骤得到一个控制增量\delta u_k,假设控制更新为:

    u_k^{\text{new}} = u_k + \alpha \delta u_k

    其中\alpha是步长系数(初始设定为 1)。

  2. 目标函数改善判定: 对于每一个\alpha,我们进行前向传播以计算新的目标函数值J_{\text{new}}​。比较更新前后的目标函数值J_{\text{old}}

    J_{\text{new}} \leq J_{\text{old}}

    如果目标函数值降低,则可以接受当前的步长\alpha并更新控制序列。

  3. 缩小步长: 如果新的控制增量导致目标函数值变差,即J_{\text{new}} > J_{\text{old}}​,则缩小步长\alpha,例如设\alpha为初始值的一半(或其他比例),即\alpha = \beta \alpha \quad,其中\quad 0 < \beta < 1,继续计算目标函数值,直到找到合适的步长。

  4. 重复迭代: 重复前向模拟和目标函数比较,直到找到合适的 α\alphaα 或步长缩小到某个阈值以下。

3. python代码演示

import numpy as np# System dynamics (nonlinear)
def system_dynamics(x, u):return x + np.sin(u)# Cost function for a single step
def cost_function(x, u):return 0.5 * (x**2 + u**2)# Derivative of the cost function w.r.t. control input u (l_u)
def cost_u(u):return u# Derivative of the cost function w.r.t. state x (l_x)
def cost_x(x):return x# Second derivative of the cost function w.r.t. control input u (l_uu)
def cost_uu():return 1# Second derivative of the cost function w.r.t. state x (l_xx)
def cost_xx():return 1# Terminal cost for the final state
def terminal_cost(x):return 0.5 * x**2# Derivative of terminal cost w.r.t state (l_x at final step)
def terminal_cost_x(x):return x# Function to calculate the initial state trajectory based on control sequence
def compute_initial_trajectory(x0, u):x = np.zeros(N+1)x[0] = x0for k in range(N):x[k+1] = system_dynamics(x[k], u[k])return x# iLQR algorithm with gradient descent, trust-region regularization, and line search
def ilqr_with_regularization_and_linesearch(x0, u, iterations, epsilon_u, epsilon_J, epsilon_x, max_step_size, line_search_steps=10):x = compute_initial_trajectory(x0, u)  # Compute initial trajectoryprev_cost = np.infregularization = 1e-3  # Regularization term for gradient descent (small to avoid overfitting)for i in range(iterations):# Backward passV_x = np.zeros(N+1)V_xx = np.zeros(N+1)V_x[-1] = terminal_cost_x(x[-1])  # Terminal value for V_xV_xx[-1] = 1  # Terminal value for V_xx (quadratic cost on terminal state)du = np.zeros(N)  # Control updates# Backward pass: compute Q function and control updatefor k in range(N-1, -1, -1):# Compute Q-function termsf_u = np.cos(u[k])  # Derivative of system dynamics w.r.t. uQ_u = cost_u(u[k]) + f_u * V_x[k+1]  # Q_u = l_u + f_u^T * V_x(k+1)Q_uu = cost_uu() + f_u**2 * V_xx[k+1] + regularization  # Add regularization to avoid singularityQ_x = cost_x(x[k]) + V_x[k+1]  # Q_x = l_x + f_x^T * V_x(k+1)Q_xx = cost_xx() + V_xx[k+1]  # Q_xx = l_xx + f_x^T * V_xx(k+1) * f_x# Update control input with trust-region regularizationstep = -Q_u / Q_uu  # Compute step size for control updatestep = np.clip(step, -max_step_size, max_step_size)  # Apply trust-region constraint (step size regularization)du[k] = stepV_x[k] = Q_x + Q_uu * du[k]  # Update value function gradientV_xx[k] = Q_xx  # Update value function Hessian (V_xx)# Forward pass: update trajectory using the new control inputs and line searchx_new = np.zeros(N+1)u_new = np.zeros(N)x_new[0] = x0alpha = 1.0  # Starting step size for line searchfor search_step in range(line_search_steps):for k in range(N):u_new[k] = u[k] + alpha * du[k]  # Update control with line search stepx_new[k+1] = system_dynamics(x_new[k], u_new[k])  # Update state# Compute the total cost for the current trajectorycurrent_cost = np.sum([cost_function(x_new[k], u_new[k]) for k in range(N)]) + terminal_cost(x_new[-1])# Check if this step size improves the costif current_cost < prev_cost:breakalpha *= 0.5  # Reduce step size if no improvement# 1. Stop based on control input changeif np.max(np.abs(du)) < epsilon_u:print(f"Stopped due to control input convergence at iteration {i}")break# 2. Stop based on cost function change (relative)if np.abs(prev_cost - current_cost) / np.abs(prev_cost) < epsilon_J:print(f"Stopped due to cost function convergence at iteration {i}")break# 3. Stop based on state trajectory changeif np.max(np.abs(x_new - x)) < epsilon_x:print(f"Stopped due to state trajectory convergence at iteration {i}")break# Update for next iterationx = x_newu = u_newprev_cost = current_costelse:print("Reached maximum number of iterations")return x, u, iif __name__ == "__main__":# iLQR parametersN = 3  # Number of time stepsx0 = 1  # Initial stateiterations = 50  # Maximum number of iterationsepsilon_u = 1e-3  # Tolerance for control input changesepsilon_J = 1e-4  # Tolerance for cost function change (relative)epsilon_x = 1e-4  # Tolerance for state trajectory changemax_step_size = 1.0  # Trust region step size for control updates# Initialize control sequence and state trajectoryu = np.zeros(N)  # Initial control sequencex = np.zeros(N+1)  # State trajectoryx[0] = x0# Compute initial trajectoryx_initial = compute_initial_trajectory(x0, u)# Run iLQR with stopping conditionsx_final, u_final, num_iterations = ilqr_with_regularization_and_linesearch(x0, u, iterations, epsilon_u, epsilon_J, epsilon_x, max_step_size)# Output the final results and number of iterationsprint("Final state trajectory: ", x_final)print("Final control inputs: ", u_final)print("Total iterations: ", num_iterations)

输出结果如下:

Stopped due to cost function convergence at iteration 8
Final state trajectory:  [1.         0.44370578 0.17737126 0.0834065 ]
Final control inputs:  [-0.58991961 -0.26958819 -0.09410359]
Total iterations:  8

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

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

相关文章

驰域货车四路监控ts视频格式化恢复方法

不少大货车都使用了驰域货车监控&#xff0c;一般是至少装四路&#xff0c;前后左右&#xff0c;有的还会车顶加一路。驰域货车记录仪特殊的地方在于&#xff1a;其采用了一种上古时期的视频格式----TS视频流。 故障存储: 128G卡/fat32 故障现象: 客户提供的信息是格式化后…

软件安装攻略:EmEditor编辑器下载安装与使用

EmEditor是一款在Windows平台上运行的文字编辑程序。EmEditor以运作轻巧、敏捷而又功能强大、丰富著称&#xff0c;得到许多用户的好评。Windows内建的记事本程式由于功能太过单薄&#xff0c;所以有不少用户直接以EmEditor取代&#xff0c;emeditor是一个跨平台的文本编辑器&a…

【STM32】外部中断

当程序正常运行执行main函数&#xff0c;此时如果外部中断来了&#xff0c;执行外部中断函数&#xff0c;实现相应的功能&#xff0c;然后就可以回到main. 一般stm32芯片每个引脚都有自己的外部中断&#xff0c;但是为了限制&#xff0c;会有一个中断线&#xff0c;对应一个中断…

搭建内网文件服务器(FTP),以及实现内网Gitee

一、实现windows搭建FTP&#xff0c;实现文件共享和管理 具体步骤&#xff1a; 1.打开控制面板&#xff0c;搜索功能 2.打开这几个配置 3.打开IIS&#xff0c;添加FTP站点即可 二、实现内网Gitee 参考博客&#xff1a; Gitblit服务器搭建及Git使用-CSDN博客 jdk1.8.0的安…

零基础国产GD32单片机编程入门(二十五)USB口介绍及CDC类虚拟串口通讯详解及源码

文章目录 一.概要二.USB2.0基本介绍及虚拟串口介绍三.GD32单片机USB模块框图四.GD32单片机USB设备模式五.GD32F103C8T6 USB设备CDC类六.配置一个USB虚拟串口收发例程七.工程源代码下载八.小结 一.概要 GD32F103C8T6 USB虚拟串口是一种采用GD32F103C8T6单片机&#xff0c;通过U…

vscode中使用go环境配置细节

1、在docker容器中下载了go的sdk 2、在/etc/profile.d/go.sh里填入如下内容&#xff1a; #!/bin/bashexport GOROOT/home/ud_dev/go export PATH$GOROOT/bin:$PATH3、设置go env go env -w GOPROXYhttps://goproxy.cn,direct go env -w GO111MODULEon 4、重启这个容器&#…

Java之ArrayList

1.ArrayList的简介 在集合框架中&#xff0c;ArrayList是一个普通的类&#xff0c;实现了List接口&#xff0c;具体框架图如下&#xff1a; ArrayList是以泛型方式实现的&#xff0c;使用时必须要先实例化ArrayList实现了RandomAccess接口&#xff0c;表明ArrayList支持随机…

springboot对数据库进行备份+对一个文件夹内的文件按时间排序,只保留最近的8个文件

首先&#xff0c;对数据库进行备份&#xff0c;用到的命令&#xff1a; mysqldump --opt -h 192.168.1.200 --userroot --passwordxxx --result-fileE://data//20240911141400.sql --default-character-setutf8 xxx&#xff08;数据库名&#xff09; 直接上代码 配置文件部分…

速通GPT-3:Language Models are Few-Shot Learners全文解读

文章目录 GPT系列论文速通论文实验总览1. 任务设置与测试策略2. 任务类别3. 关键实验结果4. 数据污染与实验局限性5. 总结与贡献 Abstract1. 概括2. 具体分析3. 摘要全文翻译4. 为什么不需要梯度更新或微调⭐ Introduction1. 概括2. 具体分析3. 进一步分析 Approach1. 概括2. 具…

app抓包 chrome://inspect/#devices

一、前言&#xff1a; 1.首先不支持flutter框架&#xff0c;可支持ionic、taro 2.初次需要翻墙 3.app为debug包&#xff0c;非release 二、具体步骤 1.谷歌浏览器地址&#xff1a;chrome://inspect/#devices qq浏览器地址&#xff1a;qqbrowser://inspect/#devi…

C++:C++的IO流

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 C语言的输入与输出 二 流 三 CIO流 ​编辑 3.1 C标准IO流 3.2 C文件IO流 3.3 stringstream的简单介绍 四 CIO流的效率问题 总结 前言 本篇详细介绍了进一步介绍C中的IO流&#…

点可云ERP进销存V8版本PHPstudy(小皮)安装讲解

安装视频讲解链接&#xff1a; 点可云ERP教程 - PHPstudy安装篇_哔哩哔哩_bilibili 1、下载准备 PHPstudy可在官网下载&#xff08;https://www.xp.cn/&#xff09;不推荐在Linux系统安装小皮面板&#xff0c;Linux系统还是使用宝塔较好&#xff0c; 在PHPstudy官网下载时需要…

Rust运算符

【图书介绍】《Rust编程与项目实战》-CSDN博客 《Rust编程与项目实战》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 (jd.com) https://blog.csdn.net/brucexia/category_12779443.html 前面已经学习了变量和常量&#xff0c;本节开始对它们进行操作&#xff0c…

第三方软件测评机构分享:软件性能测试的测试方法和内容

软件性能测试是对软件系统在特定负载和条件下的性能进行评估的过程。它旨在确定软件的响应时间、稳定性、资源消耗及其可扩展性&#xff0c;以确保其在实际环境中能够满足用户的需求。通过性能测试&#xff0c;开发团队能够发现潜在的瓶颈问题&#xff0c;优化应用程序架构&…

前端:JavaScript 实现类

文章目录 1. Es6-类-class2. Es6-class 实现继承3. Es6-class 静态属性和私有属性4. Es5-寄生组合式继承 1. Es6-类-class 类是创建对象的模板&#xff0c;用代码封装数据以处理该数据&#xff0c;js中的类建立在原型上。 如何定义类&#xff0c;首先需要关键字 class&#x…

聊天组件 Vue3-beautiful-chat

前言 最近很多公司都在搞大模型&#xff0c;类似于 chatgpt 的功能&#xff1b;而 chatgpt 的界面其实就是个对话框。今天就介绍一个不错的对话框组件 Vue3-beautiful-chat 项目框架 vite vue3 TS Vue3-beautiful-chat 使用流程 1、引用三方件 npm install Vue3-beaut…

【JAVA基础】实现Tomcat基本功能

文章目录 TCP/IP协议Socket编程ServletTomcat 在搜索了两三天之后&#xff0c;也是大概弄懂了Tomcat是个什么东西&#xff0c;我们在说Tomcat之前&#xff0c;先来了解一下下面这三个东西&#xff1a; TCP/IP协议 TCP/IP 是互联网通信的基础协议。TCP&#xff08;传输控制协议…

SpringBoot框架下的房产销售系统开发

第一章 绪 论 1.1背景及意义 房产销售也都将通过计算机进行整体智能化操作&#xff0c;对于房产销售系统所牵扯的管理及数据保存都是非常多的&#xff0c;例如管理员&#xff1b;首页、个人中心、用户管理、销售经理管理、房源信息管理、房源类型管理、房子户型管理、交易订单管…

《Python青少年趣味编程108例》书籍介绍

文章目录 前言为什么选择Python&#xff1f;书籍介绍文章目录配套资源 前言 在这个数字化飞速发展的时代&#xff0c;编程已经成为了一项不可或缺的技能。对于青少年而言&#xff0c;学习编程不仅能够培养逻辑思维、解决问题的能力&#xff0c;还能激发无限创意&#xff0c;让…

【吊打面试官系列-Redis面试题】如果有大量的 key 需要设置同一时间过期,一般需要注意什么?

大家好&#xff0c;我是锋哥。今天分享关于【如果有大量的 key 需要设置同一时间过期&#xff0c;一般需要注意什么&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 如果有大量的 key 需要设置同一时间过期&#xff0c;一般需要注意什么&#xff1f; 如果大量的…