LQR轨迹跟踪|python实现

LQR轨迹跟踪 | python实现

基本概念

离散LQR求解公式推导看这篇博客,这里直接给出结果。
P k = Q + A T P k − 1 A − A T P B ( B T P k − 1 B + R ) − 1 B T P k − 1 A K = ( B T P B + R ) − 1 B T P A u ∗ ( k ) = − K x ( k ) \begin{aligned} &P_{k} = Q + A^T P_{k-1} A - A^T P B(B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A \\ &K = (B^T P B + R)^{-1} B^T P A \\ &u^*(k) = -Kx(k) \end{aligned} Pk=Q+ATPk1AATPB(BTPk1B+R)1BTPk1AK=(BTPB+R)1BTPAu(k)=Kx(k)
式中 P k P_k Pk表示LQR求解过程中的黎卡提矩阵迭代值, P P P表示收敛后的黎卡提矩阵; K K K表示反馈增益; A , B A, B A,B表示离散的系统矩阵; Q , R Q, R Q,R表示系统状态和输入的权重矩阵; x , u x, u x,u分别表示系统状态和系统输入, u ∗ u^* u表示最优系统输入。

求解步骤

  1. 设置迭代最大值 N N N和收敛差值 ε \varepsilon ε

  2. 设置迭代初值 P 0 = Q P_{0} = Q P0=Q

  3. 迭代求解, k = 1 , . . . , N k=1,...,N k=1,...,N
    P k = Q + A T P k − 1 A − A T P B ( B T P k − 1 B + R ) − 1 B T P k − 1 A P_{k} = Q + A^T P_{k-1} A - A^T P B(B^T P_{k-1} B + R)^{-1} B^T P_{k-1} A Pk=Q+ATPk1AATPB(BTPk1B+R)1BTPk1A
    ∣ P k − P k − 1 ∣ ≤ ε \vert P_{k} - P_{k-1} \vert \leq \varepsilon PkPk1ε,表示黎卡提矩阵收敛,可以结束迭代,否则迭代至最大步数 N N N

  4. 计算反馈增益
    K = ( B T P B + R ) − 1 B T P A K = (B^T P B + R)^{-1} B^T P A K=(BTPB+R)1BTPA

  5. 用反馈增益 K K K进行控制
    u ∗ ( t ) = − K x ( t ) u^*(t) = -Kx(t) u(t)=Kx(t)

python实现轨迹跟踪

实现效果


图1 LQR轨迹跟踪效果示意

这里用LQR控制以后轴中心为车辆中心的模型进行轨迹跟踪,用这个模型是因为方便线性化进行控制,该模型线性化推导过程可以看这篇博客

LQR求解

轨迹跟踪的完整代码在github仓库,这里给出LQR求解部分

import math
import numpy as np

class DiscreteLQR:
    def __init__(self, Ad, Bd, Q, R, epsilon = 1e-4):
        self.Ad = Ad # 离散系统矩阵
        self.Bd = Bd # 离散系统矩阵
        self.Q = Q
        self.R = R
        self.P = Q # 给个初始值Q
        self.K = np.mat(np.zeros([Bd.shape[1], Bd.shape[0]]))
        self.epsilon = epsilon
    
    # 离散LQR迭代求解,给定一个P的初值,迭代更新P和K,直到收敛
    def solve(self, MAX_ITER = 100):
        self.P = self.Q
        for it in range(MAX_ITER):
            P_ = self.Q + self.Ad.T * self.P * self.Ad - self.Ad.T * self.P * self.Bd * (self.R + self.Bd.T * self.P * self.Bd).I * self.Bd.T * self.P * self.Ad
            if (abs(P_ - self.P).max() < self.epsilon):
                break
            self.P = P_
        if (it == MAX_ITER - 1):
            print("Maximum iteration reached.")
            return False
        self.K = (self.R + self.Bd.T * self.P * self.Bd).I * self.Bd.T * self.P * self.Ad
        return True

    def update_mat(self, Ad, Bd, Q, R):
        self.Ad = Ad
        self.Bd = Bd
        self.Q = Q
        self.R = R
  • 27
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LQR(线性二次调节)控制是经典控制理论中一种常用的控制方法,在现代控制领域得到了广泛应用。Matlab是一种强大的数学计算软件,可以方便地实现各种控制算法。这里将介绍如何利用Matlab实现LQR跟踪控制算法。 LQR算法的核心是设计一个最优控制器,使得系统在满足一定性能指标下能够稳定地运行。这里以单自由度调节系统为例,其动力学方程为: $$m \ddot{x} + c \dot{x} + kx = u$$ 其中,$m$、$c$、$k$分别是质量、阻尼和弹性系数;$x$是位移;$u$是控制力。假设需要将系统调整到某一给定位置$x_d$,设计LQR控制器需要先将系统状态转化为标准状态空间形式: $$\dot{x} = Ax + Bu$$ $$y = Cx + Du$$ 其中,$A$、$B$、$C$、$D$分别是状态方程和输出方程的系数矩阵和向量。针对该系统,其状态方程和输出方程可分别表示为: $$\begin{bmatrix} \dot{x}_1 \\ \dot{x}_2 \end{bmatrix}=\begin{bmatrix} 0 & 1 \\ -\frac{k}{m} & -\frac{c}{m} \end{bmatrix}\begin{bmatrix} {x}_1 \\ {x}_2 \end{bmatrix}+\begin{bmatrix} 0 \\ \frac{1}{m} \end{bmatrix}u$$ $$y = \begin{bmatrix} 1 & 0 \end{bmatrix}\begin{bmatrix} {x}_1 \\ {x}_2 \end{bmatrix}$$ 在Matlab中,可以利用lqr函数求解问题。具体步骤如下: 1.定义状态方程和输出方程。 2.设置Q矩阵和R矩阵,其中Q矩阵衡量状态误差对控制变量的影响,R矩阵则衡量控制力的大小,需要根据实际情况进行取值。在本系统中,可以设置如下值: $$Q = \begin{bmatrix} 1 & 0 \\ 0 & 10 \end{bmatrix},R = 1$$ 3.调用lqr函数,得到最优控制器增益矩阵K。 4.针对系统初始状态$x(0)$和给定状态$x_d$,计算控制力u。 5.根据计算的控制力进行控制,更新系统状态。重复步骤4和5,直至系统稳定。 通过以上步骤,就可以在Matlab中实现LQR跟踪控制算法。需要注意的是,应当根据实际系统情况选择不同的参数,并对控制器进行调试和优化,以达到最优的控制效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值