共计 2669 个字符,预计需要花费 7 分钟才能阅读完成。
规划控制模块架构概述
Autoware.Universe 的规划控制模块采用分层设计理念,核心包含全局路径规划(Route Planning)、行为决策(Behavior Planning)和局部轨迹生成(Motion Planning)三层。这种架构设计能够有效平衡计算效率与规划质量,尤其适合复杂城市道路场景。

- 全局路径规划层:基于矢量地图和路由信息,生成连接起点到终点的粗粒度路径。这一层主要考虑道路拓扑结构和交通规则约束。
- 行为决策层:根据实时感知数据(障碍物、交通灯等)决定车辆行为(跟车、变道、停车等),输出语义级驾驶指令。
- 局部轨迹层:将高层指令转化为可执行的平滑轨迹,需要满足动力学约束和舒适性要求。
核心算法原理解析
Hybrid A* 算法实践
Hybrid A* 是 Autoware 中常用的全局路径规划算法,相比传统 A * 算法,它引入了车辆运动学模型:
// 典型 Hybrid A* 启发式函数实现(autoware_planning 部分源码节选)double HybridAStar::heuristic(const Pose & current, const Pose & goal) {
// 欧式距离启发项
const double distance_cost = calcDistance(current.position, goal.position);
// 航向角差异惩罚项
const double angle_cost = std::abs(normalizeRadian(calcYawFromQuat(current.orientation)
- calcYawFromQuat(goal.orientation)));
return distance_cost + angle_weight_ * angle_cost;
}
关键参数调优建议:
angle_weight_(角度权重):建议取值 0.1-0.3,过高会导致路径迂回curve_weight_(曲率惩罚):城市道路建议 0.05-0.1,高速公路可降低reverse_weight_(倒车惩罚):停车场场景需适当减小
Lattice Planner 局部规划
Lattice 规划器通过采样 + 优化的方式生成平滑轨迹,其核心优势在于:
- 纵向采样:沿参考线生成 S - T 图,考虑前车动态
- 横向偏移:在 Frenet 坐标系下生成候选路径
- 多目标优化:平衡舒适性、安全性和路径跟踪精度
典型参数配置示例(lattice_planner.param.yaml):
sampling:
lateral_interval: 0.5 # 横向采样间隔(m)
longitudinal_interval: 5.0 # 纵向采样间隔(m)
cost:
jerk_weight: 1.0 # 加加速度惩罚项
obstacle_weight: 10.0 # 障碍物距离代价
工程实现关键技巧
ROS2 节点高效实现
规划模块通常需要处理多路传感器输入,建议采用 Component 节点设计:
class PlanningNode : public rclcpp::Node {
public:
PlanningNode() : Node("planning_node") {
// 使用回调组实现并行处理
callback_group_ = create_callback_group(rclcpp::CallbackGroupType::MutuallyExclusive);
auto sub_opt = rclcpp::SubscriptionOptions();
sub_opt.callback_group = callback_group_;
odom_sub_ = create_subscription<Odometry>(
"/localization/kinematic_state", 10,
[this](const Odometry::SharedPtr msg) {/* 处理逻辑 */},
sub_opt);
// 规划器运行在独立线程
planning_thread_ = std::thread(&PlanningNode::planningLoop, this);
}
private:
void planningLoop() {rclcpp::Rate rate(20); // 控制规划频率
while (rclcpp::ok()) {
// 执行规划计算
rate.sleep();}
}
rclcpp::CallbackGroup::SharedPtr callback_group_;
std::thread planning_thread_;
};
性能优化实战方案
- 计算耗时优化:
- 对 A * 算法使用双向搜索策略
- Lattice 规划采用动态分辨率采样(弯道密集 / 直道稀疏)
-
预先生成轨迹模板库
-
内存管理:
- 重用轨迹计算中间变量
-
使用内存池管理频繁创建的 ROS 消息
-
实时性保障:
- 设置规划超时机制(典型值 200ms)
- 实现轨迹预测缓存,超时后使用预测轨迹
生产环境问题排查
典型问题与解决方案
| 问题现象 | 可能原因 | 解决措施 |
|---|---|---|
| 轨迹抖动 | 优化目标权重失衡 | 调整 jerk_weight 与 curvature_weight 比值 |
| 规划超时 | 采样分辨率过高 | 动态调整 lateral_interval 参数 |
| 避障失败 | 障碍物投影误差 | 增加感知 - 规划时钟同步检查 |
时钟同步检查示例
# 检查感知消息时效性(Python 示例)def check_message_freshness(msg):
now = self.get_clock().now()
msg_time = rclpy.time.Time.from_msg(msg.header.stamp)
if (now - msg_time).nanoseconds > 1e8: # 100ms 阈值
self.get_logger().warn("Obstacle msg outdated! Delay: {}ms".format((now - msg_time).nanoseconds / 1e6))
return False
return True
延伸思考
- 如何设计自适应参数调整策略,使同一套规划算法能适应城市道路和高速公路场景?
- 当感知模块出现短暂失效时,规划控制层应如何保持安全运行?
- 在确保功能安全的前提下,有哪些方法可以进一步提升规划模块的计算效率?
实践建议
建议开发者从 Autoware.Universe 的 planning_launch 包入手,通过修改 scenario_planning 中的参数配置文件来验证不同算法组合的效果。调试时可使用 rviz2 的轨迹可视化工具,重点关注轨迹曲率连续性和计算延迟指标。对于复杂场景,建议录制 rosbag 进行离线回放测试,逐步优化参数配置。
正文完
