共计 2033 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点与架构优势
传统自动驾驶规划控制方案在复杂城市场景中常面临三大挑战:动态障碍物避让反应滞后、多目标决策逻辑耦合度高、紧急制动场景下的轨迹抖动。Autoware.Universe 通过模块化架构将问题分解为三层:

- 行为决策层 :基于有限状态机(FSM) 处理变道、跟车等高层指令,采用 ROS2 Action 机制实现异步任务调度
- 运动规划层:使用 Conformal Lattice 算法在 Frenet 坐标系下生成候选轨迹,避免笛卡尔空间的曲率突变
- 控制执行层:通过 MPC 控制器将规划轨迹转化为转向 / 油门指令,支持控制频率高达 100Hz
ROS2 节点通信全解析
规划控制模块的核心通信流程如下图所示(此处应有序列图描述):
@startuml
participant "Behavior Planner" as BP
participant "Motion Planner" as MP
participant "Controller" as CTL
BP -> MP : /planning/mission (Mission.msg)
MP -> CTL : /planning/trajectory (Trajectory.msg)
CTL -> MP : /control/reference (Feedback.msg)
@enduml
关键消息字段设计:
- /planning/trajectory:
header.stamp:采用 ROS2 的 builtin_interfaces/Time 时间戳points[]:轨迹点数组,每个点包含:pose(geometry_msgs/Pose):世界坐标系下的位姿velocity(float32):目标速度(m/s)acceleration(float32):期望加速度(m/s²)
代码实战:自定义状态机开发
以下示例展示如何实现红绿灯决策状态机(Python 与 C ++ 混合示例):
// 状态枚举定义 (C++14)
enum class TrafficLightState {
APPROACHING,
STOPPED,
PASSING
};
// Frenet 坐标系转换关键代码
void convertToFrenet(const Path &path, const Pose &pose, FrenetPoint *frenet) {
// 1. 寻找最近路径点
auto closest_idx = findClosestWaypoint(path, pose);
// 2. 计算横向偏移(数学公式)// s = ∫_0^t v(t)dt
// d = ||p - p_closest|| * sin(θ_diff)
...
}
# Python 状态转移逻辑
def update_state(self):
if self.current_state == TrafficLightState.APPROACHING:
if self._check_red_light():
self._publish_stop_command()
self.current_state = TrafficLightState.STOPPED
# ROS2 QoS 配置(避免消息丢失)qos_profile = QoSProfile(
depth=10,
reliability=QoSReliabilityPolicy.RELIABLE,
durability=QoSDurabilityPolicy.TRANSIENT_LOCAL
)
性能优化实测对比
在 Intel i7-1185G7 平台上的测试数据:
| 控制器类型 | CPU 占用率(%) | 最大延迟(ms) |
|---|---|---|
| Pure Pursuit | 12.3 | 45 |
| MPC (20 steps) | 28.7 | 18 |
调优建议:
- MPC 的预测时域 (horizon) 控制在 15-20 步最佳
- 降低 QP 求解器精度要求可节省 30% 计算资源
- 对控制指令做低通滤波避免执行器抖动
五大典型问题解决方案
- 坐标系未统一 :在
global_planner中强制转换所有输入到 UTM 坐标系 - 轨迹跳变:在轨迹点间插入三次样条插值
- DDS 通信延迟:配置 ROS2 QoS 为 BEST_EFFORT 模式
- 控制指令振荡:在 MPC 代价函数中增加平滑项权重
- 紧急制动失效:独立部署看门狗线程监测刹车指令
Apollo 算法移植实践
将 EM Planner 移植到 Autoware 的步骤:
- 创建新的 ROS2 包
em_planner实现算法核心 - 适配 Autoware 接口:
- 继承
PlanningInterface基类 - 转换参考线到 Frenet Frame
- 性能优化技巧:
- 复用 Autoware 的
MotionPrimitive库 - 使用 OpenMP 并行化代价计算
实车调试 Checklist
- [] 验证所有坐标系转换(尤其注意 LiDAR 与 IMU 的 TF 树)
- [] 录制 Rosbag 复现规划失败场景
- [] 监控
/planning/trajectory的发布频率 - [] 实车测试前完成 HIL 仿真
通过本文介绍的方法,我们成功在园区接驳车上实现了 7×24 小时连续运行。建议开发者先从仿真环境验证核心算法,再逐步过渡到实车部署。未来可探索与感知模块的联合优化,进一步提升复杂场景通过率。
正文完
发表至: 自动驾驶
近一天内
