基于车辆运动学模型的LQR横向控制算法

本文介绍了车辆运动学模型的建立、线性化、离散化过程,并详细阐述了基于LQR(线性二次调节器)的控制理论,通过泰勒展开和前向欧拉法对模型进行处理,最后给出了一段用于计算控制量的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,车辆运动学模型的建立

 如图所示,对于横向控制而言,因变量X,Y,\varphi自变量\delta

将速度v沿X,Y轴分解得车辆的模型为:

\dot{x} = vcos\varphi

\dot{y}=vsin\varphi

\dot{\varphi }=\frac{v}{R}= \frac{vtan\delta}{l}

即:

\dot{X}= \begin{bmatrix} \dot{x}\\ \dot{x}\\ \dot{\varphi } \end{bmatrix} = \begin{bmatrix} vcos\varphi \\ vsin\varphi \\ v\frac{tan\delta}{l} \end{bmatrix}=\begin{bmatrix} f_{1} \\ f_{2} \\ f_{3} \end{bmatrix} =f(X,u)

其中,因为是横向控制,故假设v是常数

X=\begin{bmatrix} x\\ y\\ \varphi \end{bmatrix}

u=\delta

上述车辆运动学模型为非线性模型:\dot{X}=f(X,u)

二,车辆运动学模型的线性化:泰勒展开

f(X,u)在参考点(X_{r},u_{r})处的泰勒展开公式,忽略高次项为:

f(X,u)=f(X_{r},u_{r})+\frac{\partial f(X,u)}{\partial X}|_{(X_{r},u_{r})}(X-X_{r})+\frac{\partial f(X,u)}{\partial u}|_{(X_{r},u_{r})}(u-u_{r})

\frac{\partial f(X,u)}{\partial X}|_{(X_{r},u_{r})}=\begin{bmatrix} \frac{\partial f_{1}}{\partial x} & \frac{\partial f_{1}}{\partial y} & \frac{\partial f_{1}}{\partial \varphi }\\ \frac{\partial f_{2}}{\partial x} & \frac{\partial f_{2}}{\partial y} & \frac{\partial f_{2}}{\partial \varphi } \\ \frac{\partial f_{3}}{\partial x} & \frac{\partial f_{3}}{\partial y} & \frac{\partial f_{3}}{\partial \varphi } \end{bmatrix}= \begin{bmatrix} 0& 0 &-vsin\varphi_{r} \\ 0& 0& vcos\varphi_{r} \\ 0& 0& 0 \end{bmatrix}

\frac{\partial f(X,u)}{\partial u}|_{(X_{r},u_{r})}=\begin{bmatrix} \frac{\partial f_{1}}{\partial \delta }\\ \frac{\partial f_{2}}{\partial \delta } \\ \frac{\partial f_{3}}{\partial \delta } \end{bmatrix}= \begin{bmatrix} 0\\ 0 \\ \frac{v}{l(cos\delta _{r})^{2}} \end{bmatrix}

\dot{X}-\dot{X_{r}}= \begin{bmatrix} 0& 0 &-vsin\varphi_{r} \\ 0& 0& vcos\varphi_{r} \\ 0& 0& 0 \end{bmatrix}(X-X_{r})+\begin{bmatrix} 0\\ 0 \\ \frac{v}{l(cos\delta _{r})^{2}} \end{bmatrix}(\delta -\delta _{r})

其中,tan\delta _{r}=\frac{l}{R_{r}}=k_{r}l

\chi =X-X_{r}=\begin{bmatrix} x-x_{r}\\ y-y_{r} \\ \varphi -\varphi _{r} \end{bmatrix},\mu =(\delta -\delta _{r})

则上式可表示为:

\dot{\chi }= \begin{bmatrix} 0& 0 &-vsin\varphi_{r} \\ 0& 0& vcos\varphi_{r} \\ 0& 0& 0 \end{bmatrix}\chi +\begin{bmatrix} 0\\ 0 \\ \frac{v}{l(cos\delta _{r})^{2}} \end{bmatrix}\mu

\dot{\chi }= A\chi +B\mu

三,车辆运动学模型的离散化:前向欧拉

\frac{\chi _{k+1} - \chi _{k}}{T}=\dot{\chi _{k}}=A\chi_{k} +B\mu_{k}

\chi _{k+1}=(AT+E)\chi_{k} +BT\mu_{k}

 \chi_{k+1}=A_{d}\chi_{k} +B_{d}\mu_{k}

其中,

A_{d}=AT+E

B_{d}=BT

四,基于LQR模型,求解控制量

LQR的代价函数为:J= \sum_{i=0}^{n-1}(X_{i}^{T}QX_{i}+u_{i}^{T}Ru_{i})

假设Q=\begin{bmatrix} 1.0 &0 &0 \\ 0&1.0 &0 \\ 0& 0 & 1.0 \end{bmatrix},R=[1.0]

迭代法求黎卡提方程的解P设置迭代次数和迭代精度,如果在迭代次数范围内满足迭代精度的要求,我们认为该方程收敛,从而求得P,则反馈增益K为:

K=-(B_{d}^{T}PB+R)^{-1}B_{d}^{T}PA_{d}

反馈量为:

\mu =\delta -\delta r =-K\chi

\delta = -K\chi +\delta r = -K\chi + actan(k_{r}l)

LQR控制理论已经非常成熟,核心是建立模型,对模型进行线性化,并离散化,最终带入公式求解LQR的控制量。

五,实例代码

double lqrComputeCommand(double vx, double x, double y, double yaw, Traj_Point match_point,
                                 double vel, double l, double dt)
{
    double steer = 0.0;
    MatrixXd Q = MatrixXd::Zero(3,3);  
    MatrixXd R = MatrixXd::Zero(1,1);
    Q << 1      , 0    , 0,
         0      , 1    , 0,
         0      , 0    , 1;
    R << 1;

    double curvature = match_point.path_point.kappa;
    if(vel < 0) curvature = -curvature;
    double feed_forword = atan2(l * curvature, 1);

    MatrixXd A = MatrixXd::Zero(3, 3);
    A(0, 0) = 1.0;
    A(0, 2) = -vel*sin(match_point.path_point.yaw)*dt;
    A(1, 1) = 1;
    A(1, 2) = vel*cos(match_point.path_point.yaw)*dt;
    A(2, 2) = 1.0;

    MatrixXd B = MatrixXd::Zero(3,1);
    B(2, 0) = vel*dt/l/pow(cos(feed_forword),2);

    double delta_x = x - match_point.path_point.x;
    double delta_y = y - match_point.path_point.y;
    double delta_yaw = NormalizeAngle(yaw - match_point.path_point.yaw);
    VectorXd dx(3); dx << delta_x, delta_y, delta_yaw;

    double eps = 0.01;
    double diff = std::numeric_limits<double>::max();

    MatrixXd P = Q;
    MatrixXd AT = A.transpose();
    MatrixXd BT = B.transpose();
    int num_iter = 0;
    while(num_iter++ < param_.maxiter && diff > eps)
    {
        MatrixXd Pn = AT * P * A - AT * P * B * (R + BT * P * B).inverse() * BT * P * A + Q;
        diff = ((Pn - P).array().abs()).maxCoeff();
        P = Pn;
    }

    MatrixXd feed_back = -((R + BT * P * B).inverse() * BT * P * A) * dx;
    steer = NormalizeAngle(feed_back(0,0) + feed_forword);
    return steer;
}

### LQR车辆运动学控制算法实现与应用 #### 设计背景 路径跟踪算法作为自动驾驶系统的核心模块之一,旨在让车辆沿预设路径行驶并保持在既定道路内。为了达成这一目的,常采用基于运动学模型控制理论的方法来构建控制系统[^1]。 #### 系统建模 对于两轮机器人或其他类似的简单动力学系统而言,在进行LQR控制器设计之前首先要完成系统的运动学建模工作。这一步骤涉及描述物体如何响应外部输入而改变位置或姿态的信息。具体来说就是定义状态向量\( \mathbf{x}=[x,y,\theta]^T\)表示车体中心坐标以及朝向角度;同时引入输入变量\(\delta\)代表转向角速度变化率。由此可以写出非线性的单轨自行车模型方程组: \[ \dot{\mathbf{x}}=\left[\begin{array}{c} v\cos (\theta )\\ v\sin (\theta ) \\ r \end{array}\right],\quad r=k_{\beta }\tan (\delta ) \] 其中\( v \)为纵向速度, \( k_\beta \)取决于轮胎特性参数。当假设小偏移情况下可近似认为上述关系呈线性形式,则进一步简化成标准的状态空间表达式: \[ \dot{\mathbf{x}}=A\cdot \mathbf{x}(t)+B\cdot u(t), \] 这里矩阵\( A,B \)由特定条件下的系数构成[^2]。 #### 控制律推导 有了精确的数学表征之后就可以着手解决最优控制问题了——即寻找合适的增益阵\( K \),使得闭环传递函数具有期望品质的同时最小化代价泛函J : \[ J=\int_0^\infty [\mathbf{x}^{T}(t)\mathbf{Q}\mathbf{x}(t)+u^{T}(t)\mathbf{R}u(t)]dt, \] 这里的权重矩阵\( Q,R \)反映了不同维度上误差惩罚程度的不同偏好设置。利用离散时间域内的代数黎卡提方程(Algebraic Riccati Equation,A.R.E.)求得稳定解P后便能获得所需的反馈项K=-R^{-1}B^TP 。因此最终形成的控制规律将是形如这样的比例环节输出: ```cpp double calcSteeringAngle(const Eigen::VectorXd& X){ // 计算当前时刻的位置偏差 double e_x=X[0]; double e_y=X[1]; double e_theta=X[2]; // 构造状态矢量X Eigen::MatrixXd stateVector(3,1); stateVector << e_x,e_y,e_theta; // 获取预先计算好的增益矩阵K static const Eigen::RowVectorXd gainMatrix={/* ... */}; // 返回前馈补偿后的实际舵机指令 return -(gainMatrix*stateVector)[0]+feedforwardTerm; } ``` 此段伪代码片段展示了如何依据实时测量到的姿态数据调整方向盘的角度大小以纠正偏离趋势[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值