Autoware.Universe规划控制模块实战指南:从零构建自动驾驶决策系统

1次阅读
没有评论

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

image.webp

背景痛点与架构优势

传统自动驾驶规划控制方案在复杂城市场景中常面临三大挑战:动态障碍物避让反应滞后、多目标决策逻辑耦合度高、紧急制动场景下的轨迹抖动。Autoware.Universe 通过模块化架构将问题分解为三层:

Autoware.Universe 规划控制模块实战指南:从零构建自动驾驶决策系统

  1. 行为决策层 :基于有限状态机(FSM) 处理变道、跟车等高层指令,采用 ROS2 Action 机制实现异步任务调度
  2. 运动规划层:使用 Conformal Lattice 算法在 Frenet 坐标系下生成候选轨迹,避免笛卡尔空间的曲率突变
  3. 控制执行层:通过 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

调优建议:

  1. MPC 的预测时域 (horizon) 控制在 15-20 步最佳
  2. 降低 QP 求解器精度要求可节省 30% 计算资源
  3. 对控制指令做低通滤波避免执行器抖动

五大典型问题解决方案

  1. 坐标系未统一 :在global_planner 中强制转换所有输入到 UTM 坐标系
  2. 轨迹跳变:在轨迹点间插入三次样条插值
  3. DDS 通信延迟:配置 ROS2 QoS 为 BEST_EFFORT 模式
  4. 控制指令振荡:在 MPC 代价函数中增加平滑项权重
  5. 紧急制动失效:独立部署看门狗线程监测刹车指令

Apollo 算法移植实践

将 EM Planner 移植到 Autoware 的步骤:

  1. 创建新的 ROS2 包 em_planner 实现算法核心
  2. 适配 Autoware 接口:
  3. 继承 PlanningInterface 基类
  4. 转换参考线到 Frenet Frame
  5. 性能优化技巧:
  6. 复用 Autoware 的 MotionPrimitive
  7. 使用 OpenMP 并行化代价计算

实车调试 Checklist

  • [] 验证所有坐标系转换(尤其注意 LiDAR 与 IMU 的 TF 树)
  • [] 录制 Rosbag 复现规划失败场景
  • [] 监控 /planning/trajectory 的发布频率
  • [] 实车测试前完成 HIL 仿真

通过本文介绍的方法,我们成功在园区接驳车上实现了 7×24 小时连续运行。建议开发者先从仿真环境验证核心算法,再逐步过渡到实车部署。未来可探索与感知模块的联合优化,进一步提升复杂场景通过率。

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