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

在自动驾驶的研究领域中,优化控制策略是实现高效和安全自动驾驶的关键。本文将详细探讨增量线性二次调节器(iLQR)的正则化和线搜索(Line Search)方法,并通过案例和代码演示来说明这些技术在实际应用中的重要性。

目录

  1. 引言
  2. ILQR概述
  3. ILQR正则化
  4. ILQR的线搜索方法
  5. 案例研究与场景
  6. 代码演示
  7. 总结
  8. 参考文献

引言

增量线性二次调节器(iLQR)是一种用于求解非线性控制问题的优化算法。它通过迭代优化来寻找系统的最优控制输入。iLQR的核心在于通过线性化系统动态和二次化成本函数,简化优化问题。正则化和线搜索是iLQR算法中的关键步骤,能够有效提高算法的稳定性和收敛速度。

ILQR概述

LQR和iLQR简介

线性二次调节器(LQR)是一种经典的最优控制方法,它假设系统是线性的,且成本函数是二次型的。LQR的目标是找到一个控制策略,使得系统的状态和控制输入的加权平方和最小化。

增量线性二次调节器(iLQR)是LQR的非线性扩展。iLQR的主要步骤包括:

  1. 线性化系统动态方程和成本函数。
  2. 应用LQR求解线性化后的问题。
  3. 更新控制策略并重复以上步骤,直到收敛。

iLQR算法步骤

  1. 初始化:选择一个初始控制策略。
  2. 线性化:对系统动态方程和成本函数进行线性化。
  3. 求解LQR问题:得到增量控制策略。
  4. 更新策略:将增量应用到当前策略上。
  5. 检查收敛性:如果满足收敛条件,则停止;否则,返回第2步。

ILQR正则化

在实际应用中,iLQR算法可能会遇到数值不稳定的问题,特别是在系统动态方程和成本函数的线性化近似不准确时。为了解决这些问题,通常需要引入正则化技术。

正则化的概念

正则化是对优化问题引入额外的约束或惩罚项,以避免过拟合或提高数值稳定性。在iLQR中,正则化主要用于改善线性化模型的稳定性。

ILQR中的正则化方法

  1. 增量正则化:在计算控制增量时加入正则化项。常见的方法包括对控制增量引入L2范数惩罚。
  2. 模型正则化:对线性化模型引入正则化,防止模型在某些状态下变得不稳定。

增量正则化公式

假设我们要优化的控制增量为 δu\delta u,则正则化后的优化问题可以表示为:

minδut[(xt+1f(xt,ut))Q(xt+1f(xt,ut))+(ut+δut)R(ut+δut)]\min_{\delta u} \sum_{t} \left[ (x_{t+1} - f(x_t, u_t))^\top Q (x_{t+1} - f(x_t, u_t)) + (u_t + \delta u_t)^\top R (u_t + \delta u_t) \right]

其中,QQRR 是权重矩阵,用于调节状态误差和控制输入的惩罚程度。正则化项通常在优化过程中作为附加项进行加权。

ILQR的线搜索方法

线搜索是一种用于确定最优步长的技术。在线搜索过程中,算法尝试不同的步长,以找到使得目标函数最小化的最佳步长。

线搜索的原理

线搜索的基本原理是通过逐步调整步长,找到使得目标函数值下降最多的步长。在iLQR中,线搜索用于确定增量控制策略的步长。

常用的线搜索算法

  1. 固定步长线搜索:选择一个固定的步长进行搜索。
  2. 黄金分割法:通过缩小搜索范围找到最优步长。
  3. Armijo条件:基于目标函数的下降速度调整步长。

Armijo条件

Armijo条件是一种常用的线搜索准则,用于确定步长是否足够好。具体条件如下:

J(xt+1,ut+αδut)J(xt,ut)+ραJδuJ(x_{t+1}, u_t + \alpha \delta u_t) \leq J(x_t, u_t) + \rho \alpha \nabla J^\top \delta u

其中,JJ 是目标函数,α\alpha 是步长,ρ\rho 是步长调整因子,J\nabla J 是目标函数的梯度。

案例研究与场景

案例:自动驾驶车辆路径优化

在自动驾驶中,路径优化是一个关键问题。假设我们有一个自动驾驶车辆,其路径优化问题可以建模为一个非线性最优控制问题。使用iLQR算法可以有效地解决这个问题。

问题描述

考虑一辆自动驾驶车辆在二维平面上行驶,我们希望优化其路径,使得车辆能够从起点A到达终点B,同时最小化总行驶时间和能耗。

系统模型

车辆的动态方程可以表示为:

[xt+1yt+1θt+1]=[xt+vtcos(θt)yt+vtsin(θt)θt+ωt]\begin{bmatrix} x_{t+1} \\ y_{t+1} \\ \theta_{t+1} \end{bmatrix} = \begin{bmatrix} x_t + v_t \cos(\theta_t) \\ y_t + v_t \sin(\theta_t) \\ \theta_t + \omega_t \end{bmatrix}

其中,xtx_tyty_t 是车辆的位置信息,θt\theta_t 是车辆的朝向,vtv_t 是前进速度,ωt\omega_t 是转向角速度。

优化目标

优化目标是最小化总行驶时间和能耗。成本函数可以表示为:

J=t[α(xtx)2+β(yty)2+γvt2+δωt2]J = \sum_{t} \left[ \alpha (x_t - x^*)^2 + \beta (y_t - y^*)^2 + \gamma v_t^2 + \delta \omega_t^2 \right]

其中,xx^*yy^* 是目标位置,α\alphaβ\betaγ\gammaδ\delta 是权重系数。

ILQR算法应用

使用iLQR算法对上述问题进行求解时,需要进行以下步骤:

  1. 初始化:选择一个初始控制策略。
  2. 线性化:对车辆动态方程和成本函数进行线性化。
  3. 正则化:加入正则化项,提高算法稳定性。
  4. 线搜索:确定最优步长。
  5. 更新策略:根据优化结果更新控制策略。
  6. 检查收敛性:重复上述步骤,直到收敛。

代码演示

以下是使用Python实现iLQR算法的代码示例,包括正则化和线搜索的步骤。

pythonCopy Code
import numpy as np # 定义系统参数 dt = 0.1 N = 100 # 计划步数 n = 3 # 状态维度 m = 2 # 控制维度 # 初始状态 x0 = np.array([0, 0, 0]) # 目标状态 x_goal = np.array([10, 10, 0]) # 权重矩阵 Q = np.diag([1, 1, 0.1]) R = np.diag([0.1, 0.1]) # 定义动态方程 def dynamics(x, u): x_new = np.zeros(n) x_new[0] = x[0] + u[0] * np.cos(x[2]) * dt x_new[1] = x[1] + u[0] * np.sin(x[2]) * dt x_new[2] = x[2] + u[1] * dt return x_new # 定义成本函数 def cost(x, u): return np.dot(x - x_goal, np.dot(Q, x - x_goal)) + np.dot(u, np.dot(R, u)) # iLQR算法 def ilqr(x0, u0, N, Q, R