4. 控制模块概览
各位同学,今天我们来聊聊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(控制)
控制模块拿到轨迹后,会做两件事:
- 横向控制:控制方向盘转角,让车保持在轨迹中心线上
- 纵向控制:控制油门和刹车,让车速匹配轨迹要求
Autoware默认用的是PID控制,但说实话,纯PID在弯道多的场景下表现一般。我在项目中遇到过这种情况:高速过弯时,PID控制的车会明显偏离轨迹。后来我们改用了MPC(模型预测控制),效果好了不少。
我的经验:如果你刚开始调控制参数,建议先从纵向控制入手。纵向控制相对简单,调好了再搞横向。别问我为什么知道,问就是踩过坑。
第三步:Vehicle(车辆)
车辆接收到控制指令后,通过CAN总线或者以太网,把指令发给执行器。执行器包括:
- 转向系统(Steering)
- 动力系统(Throttle)
- 制动系统(Brake)
这里有个关键点:不同车辆的接口协议不一样。有的车用CAN,有的车用UDP,有的车甚至用串口。所以控制模块必须做一层“接口适配”,把统一的控制指令转换成车辆能理解的格式。
注意:接口适配是控制模块接入时最容易出问题的地方。我曾经因为CAN报文的字节序搞反了,导致车辆在测试时突然加速,差点出事。所以,接口适配一定要反复验证。
控制模块的内部结构
为了让你更直观地理解,我画了一张控制模块的流程图:
从这张图你能看到,控制模块不是单向的。它需要接收车辆的实时状态反馈,比如当前车速、方向盘转角、横摆角速度等,然后动态调整控制指令。这就是所谓的“闭环控制”。
控制模块的关键参数
调控制参数是个技术活。我整理了一份常用参数表,供你参考:
| 参数名称 | 作用 | 典型值 | 注意事项 |
|---|---|---|---|
| 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,问题才解决。
好了,关于控制模块的概览就讲到这里。你只要记住一句话:控制模块是连接规划和车辆的桥梁,桥没搭好,前面做得再好也是白搭。