第四章:控制模块概览

各位同学,今天我们来聊聊Autoware里一个特别关键的模块——控制模块。说实话,很多刚接触Autoware的朋友,往往把精力都放在感知和规划上,觉得控制就是“最后跑一下”的事。我在项目里吃过这个亏,后来才明白,控制模块其实是整个自动驾驶系统的“最后一公里”。

控制模块在Autoware中的角色

控制模块到底扮演什么角色?我打个比方你就懂了。

感知模块是车的“眼睛”,规划模块是车的“大脑”,那控制模块就是车的“手脚”。眼睛看到了路况,大脑想好了怎么走,最后得靠手脚去执行。没有手脚,前面做得再好也是白搭。

在Autoware的架构里,控制模块负责把规划模块输出的轨迹,转换成车辆能理解的油门、刹车、方向盘指令。说白了,就是让车按照规划好的路线走。

核心职责:

  • 接收规划模块的轨迹(Trajectory)
  • 计算当前车辆状态与目标轨迹的偏差
  • 输出油门、刹车、转向的控制指令
  • 保证车辆稳定、安全地跟踪轨迹

我记得有一次,规划模块输出的轨迹明明很完美,但车就是跑偏。查了半天,发现是控制模块的参数没调好。嗯,从那以后我再也不敢轻视控制模块了。

控制流水线:Planning → Control → Vehicle

整个控制流水线其实就三步,但每一步都有讲究。

第一步:Planning(规划)

规划模块会生成一条轨迹。这条轨迹包含了一系列路径点,每个点都有位置、速度、朝向等信息。你想想看,这就像给车画了一条“导航线”。

规划模块输出的轨迹格式大概是这样的:

trajectory_msgs::msg::Trajectory
  - header: 时间戳、坐标系
  - points[]:
    - position: x, y, z
    - velocity: 线速度
    - acceleration: 加速度
    - heading: 朝向角
    - time_from_start: 相对时间

第二步:Control(控制)

控制模块拿到轨迹后,会做两件事:

  1. 横向控制:控制方向盘转角,让车保持在轨迹中心线上
  2. 纵向控制:控制油门和刹车,让车速匹配轨迹要求

Autoware默认用的是PID控制,但说实话,纯PID在弯道多的场景下表现一般。我在项目中遇到过这种情况:高速过弯时,PID控制的车会明显偏离轨迹。后来我们改用了MPC(模型预测控制),效果好了不少。

我的经验:如果你刚开始调控制参数,建议先从纵向控制入手。纵向控制相对简单,调好了再搞横向。别问我为什么知道,问就是踩过坑。

第三步:Vehicle(车辆)

车辆接收到控制指令后,通过CAN总线或者以太网,把指令发给执行器。执行器包括:

  • 转向系统(Steering)
  • 动力系统(Throttle)
  • 制动系统(Brake)

这里有个关键点:不同车辆的接口协议不一样。有的车用CAN,有的车用UDP,有的车甚至用串口。所以控制模块必须做一层“接口适配”,把统一的控制指令转换成车辆能理解的格式。

注意:接口适配是控制模块接入时最容易出问题的地方。我曾经因为CAN报文的字节序搞反了,导致车辆在测试时突然加速,差点出事。所以,接口适配一定要反复验证。

控制模块的内部结构

为了让你更直观地理解,我画了一张控制模块的流程图:

Planning 轨迹生成 Trajectory Control 横向控制(转向) 纵向控制(油门/刹车) Control Cmd Vehicle 执行器 车辆状态反馈 控制流水线:Planning → Control → Vehicle 规划模块 控制模块 车辆执行器 反馈回路

从这张图你能看到,控制模块不是单向的。它需要接收车辆的实时状态反馈,比如当前车速、方向盘转角、横摆角速度等,然后动态调整控制指令。这就是所谓的“闭环控制”。

控制模块的关键参数

调控制参数是个技术活。我整理了一份常用参数表,供你参考:

参数名称 作用 典型值 注意事项
Kp(比例增益) 控制响应速度 0.5 - 2.0 太大容易震荡
Ki(积分增益) 消除稳态误差 0.01 - 0.1 太大容易积分饱和
Kd(微分增益) 抑制超调 0.1 - 0.5 对噪声敏感
最大转向角 限制方向盘转角 ±30° 根据车辆机械限制设定
最大加速度 限制纵向加速度 2.0 m/s² 保证乘坐舒适性

调参小技巧:我个人习惯先调Kp,让车能大致跟上轨迹。然后加一点Ki消除误差。最后再调Kd抑制震荡。别一上来就三个参数一起调,那样你根本不知道哪个参数出了问题。

控制模块的常见问题

在实际项目中,控制模块最容易遇到这几个问题:

  • 轨迹跟踪偏差大:通常是PID参数没调好,或者车辆模型不准确
  • 车辆震荡:Kp太大或者Kd太小,导致控制指令频繁变化
  • 响应延迟:从控制指令发出到车辆执行,中间有延迟。这个延迟如果不补偿,车就会“慢半拍”
  • 接口不匹配:控制模块输出的指令格式,跟车辆执行器要求的格式不一致

我曾经在一个项目中,车辆在直线行驶时一切正常,但一到弯道就开始左右摇摆。查了两天才发现,是横向控制的Kp参数在弯道时不够用。后来我们做了参数自适应,根据曲率动态调整Kp,问题才解决。

好了,关于控制模块的概览就讲到这里。你只要记住一句话:控制模块是连接规划和车辆的桥梁,桥没搭好,前面做得再好也是白搭。

可可精品资料库