在本博客系列中,我们将了解最优控制的经典方法,这些方法在某种程度上为强化学习等更熟悉的主题奠定了坚实的基础。这两个领域之间存在着不可避免的共同边界,本系列旨在提出这些最优控制的形式化方法,作为强化学习方法的有效替代方案。最优控制或RL旨在在某些约束和不断变化的系统动态下找到顺序行动/控制的最佳方法。
在我们进入主题之前,让我们举一个简单的动机示例,它有助于在最佳控制方法中形式化不同的术语。
轨迹优化:您的汽车被赋予一项任务,以遵循定义的航点或轨迹的方式控制自己。
If ᵢ is the control of car at time step i
ᵢ= { throttle, Steering }ᵢ
所以汽车需要应用一系列控制步骤U:u₀,u₁,u₂... un 并到达所有航点,如图 1 所示。问题的这种顺序性质使这个问题与其他问题非常不同,这些问题可以使用最优控制轻松解决
我们需要更正式的定义来为该方法和我们的直觉提供结构。
任务是找到一个允许的控制轨迹U,使用动态系统f生成相应的状态轨迹X,使得成本函数J(U)最小化。
不要被突然涌入的行话吓倒,如果打破定义并使用我们的动机示例理解每个术语,它们非常直观。
1.控制轨迹(U):控制UI是时间步骤i的输入,系列是这些控制步骤(油门,转向)将帮助汽车达到通过所有航点的目标。
2.S tate 轨迹 (X):状态 xi 是对当前场景的描述。例如:我们汽车的“状态”包括机器人在世界上的当前位置(例如X,Y坐标)和方向(偏航γ)。此状态显然受到控制输入更改的影响。
3. 动态系统(f):这只是一个数学模型,它讲述了世界是如何运作的。简单来说,这个数学模型 f 预测从状态 xi 执行操作 UI 时的下一个状态 xi+₁。
在动力车的例子中,我们可以使用简单的运动学方程在数学上确定系统动力学f
4. 成本函数(J):最优控制是关于成本函数的。它帮助我们在数学上描述顺序问题陈述的目标/任务。最优控制方法通过优化成本函数 J(U) 来计算最优轨迹 U。
在开始时定义的轨迹问题中,目标是到达定义的航点。我们可以将成本函数定义为汽车位置和下一个航点之间的余弦距离,因此,当我们最小化余弦距离成本时,我们更接近下一个航点。
最优控制问题的一个特例,其中动态方程f是线性的,目标函数是x和u的二次函数。 这个子问题在最优控制中是非常基本的,因为存在使用微分李嘉蒂方程的LQR问题的解析解。
让我们快速定义 LQR 的系统动力学函数 (f)、成本函数 J(U),我们将通过用 python 编码 LQR 解决方案来解决汽车轨迹优化问题。
所以这个想法很简单,动力学方程是线性的,我们使用矩阵A和B来描述线性。成本函数 J(U) 不太明显:它是 x 和 u 的二次函数,
Q(t) 称为状态成本矩阵。Q 帮助我们权衡状态向量中每个状态的相对重要性。Q 惩罚不良性能。Q 使我们能够通过使相应的 Q 值变大来定位我们想要低误差的状态。 R(t) 是输入成本矩阵。此矩阵会惩罚控制。
我们将简要讨论 LQR 问题的解析解。这是一种简化,可以得出有效的解决方案:控制律可以表示为线性状态反馈
R 是输入成本矩阵,B 是输入矩阵。现在 S(t) 是微分李嘉蒂方程的解:
这个问题的解决方案可以使用向后归纳法找到,我们将直接跳到最终的解决方案:
现在我们将使用 LQR 和 python 实现汽车轨迹跟踪问题。为了在最优控制范式中定义问题,我们需要定义状态、控制、系统动力学和成本函数。
我们在引入问题本身时定义了状态向量。
接下来,我们需要定义线性的系统动力学方程。
控制 UI 包括速度和转向输入。现在我们可以使用一个简单的无摩擦运动学方程来近似世界上的汽车运动。
接下来是使用矩阵操作来查找 A 和 B 矩阵
Q 惩罚您希望汽车的位置与现在的位置之间的巨大差异。Q 使我们能够通过使相应的 Q 值变大来定位我们想要低误差的状态。Q 沿对角线具有正值,其他地方为零。
代码在此存储库中可用:打开ipython以提供不同的航点并自己测试分析解决方案。
这是一个简单的问题,其中时间步长保持较大,这意味着代理可以覆盖更大的距离是单个时间步长。航点彼此垂直,因此汽车从一个航点到另一个航点采取半圆形轨迹。
我们提供了更平滑的轨迹,航点保持非常接近。LQR 非常有效地工作。
让我们给出更复杂的轨迹并观察不同的控制参数
我们可以在这里观察到轨迹非常接近。
感谢您抽出宝贵时间!
Kowshik chilamkurthy