Apollo自动驾驶控制算法入门指南:从PID到模型预测控制的实践解析

1次阅读
没有评论

共计 1972 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

1. Apollo 控制模块架构概览

在 Apollo 自动驾驶框架中,控制模块(Control Module)位于规划(Planning)和底盘(Chassis)之间。当规划模块生成期望轨迹后,控制模块负责计算油门、刹车和转向指令,使车辆精准跟踪轨迹。这张简化图展示了数据流向:

Apollo 自动驾驶控制算法入门指南:从 PID 到模型预测控制的实践解析

graph LR
  Planning-->|trajectory|Control
  Control-->|control_command|Chassis
  Localization-->|vehicle_state|Control

2. 基础控制算法对比

2.1 PID 控制原理

PID(Proportional-Integral-Derivative)通过三项组合计算控制量:

$$u(t) = K_p e(t) + K_i \int_0^t e(\tau)d\tau + K_d \frac{de(t)}{dt}$$

  • 比例项(P):快速响应当前误差,但可能引起超调
  • 积分项(I):消除稳态误差,但会导致积分饱和
  • 微分项(D):预测误差趋势,抑制震荡

2.2 MPC 核心优势

模型预测控制(Model Predictive Control)通过滚动优化解决以下问题:

$$
\begin{aligned}
\min_{u} & \sum_{k=0}^{N-1} (|x_k – x_{ref}|Q^2 + |u_k|_R^2) \
\text{s.t.} & \quad x
= f(x_k, u_k) \
& \quad u_{min} \leq u_k \leq u_{max}
\end{aligned}
$$

弯道跟踪对比

# 模拟数据对比(单位:米)pid_error = [0.12, 0.25, 0.18, 0.30]
mpc_error = [0.08, 0.15, 0.10, 0.12] 

3. Apollo 控制算法实战配置

3.1 control_config.pb.txt 关键参数

# PID 参数(横向控制)lateral_control_conf {
  pid_conf {
    kp: 1.5
    ki: 0.3
    kd: 0.2
    integrator_saturation_level: 0.5  # 抗积分饱和阈值
  }
}

# MPC 参数
mpc_controller_conf {
  qp_solver_type: OSQP
  horizon_length: 10
  weight_matrix {
    lateral_error: 1.0
    heading_error: 0.5
  }
}

3.2 C++ PID 实现(带抗饱和)

class PIDController {
public:
  double Calculate(double error, double dt) {
    integral_ += error * dt;
    // 抗积分饱和
    integral_ = std::clamp(integral_, -i_max_, i_max_);

    double derivative = (error - last_error_) / dt;
    last_error_ = error;

    return kp_ * error + ki_ * integral_ + kd_ * derivative;
  }

private:
  double kp_ = 0.0, ki_ = 0.0, kd_ = 0.0;
  double integral_ = 0.0, last_error_ = 0.0;
  double i_max_ = 1.0;  // 积分限幅
};

3.3 MPC 的 OSQP 求解示例

import osqp
import numpy as np

# 构建 QP 问题:H, f, A, l, u
prob = osqp.OSQP()
prob.setup(P=H, q=f, A=A, l=l, u=u, verbose=False)
res = prob.solve()

# 解析最优控制序列
optimal_controls = res.x[:N*control_dim]

4. 实车调试经验

4.1 油门 - 刹车震荡解决方案

  • 根本原因:控制器增益过高或延迟补偿不足
  • 调试步骤

  • 降低 PID 的微分增益(Kd)

  • 增加控制指令平滑滤波(一阶低通)
  • 检查底盘响应延迟时间参数

4.2 控制延迟补偿技巧

  1. 在预测模型中增加延迟项:$$x_{pred} = x + v \cdot \tau_{delay}$$
  2. 使用高频率定位数据(≥100Hz)
  3. 前馈补偿转向系统机械延迟
  4. 通过 ROS bag 回放校准延迟时间
  5. 采用自适应 Kalman 滤波预测状态

4.3 卡尔曼滤波推荐参数

process_noise:
  pos: 0.01  # 位置噪声方差
  vel: 0.1   # 速度噪声方差
measurement_noise:
  gps: 0.05  # GPS 测量噪声
  imu: 0.02  # IMU 偏置噪声

5. 算法性能对比

使用 Apollo 提供的 demo_3.5.bag 测试数据:

算法 最大横向误差(m) 平均误差(m)
PID 0.32 0.18
MPC 0.15 0.08

开放性问题:在雨雪天气下,轮胎摩擦系数降低 30% 时,如何调整 MPC 的约束条件以保证稳定性?

(提示:考虑动态更新 QP 问题中的 $u_{max}$ 约束)

正文完
 0
评论(没有评论)