第一章:ROS2与规划模块概述

大家好,我是你们这门课的老朋友。在正式开始之前,我想先聊聊我自己的经历。几年前我刚接触自动驾驶规划时,面对一堆节点、话题、服务,说实话有点懵。后来我发现,很多人卡在第一步——不是算法难,而是环境没搭好,概念没理清。所以这一章,咱们先把地基打牢。

1.1 ROS2核心概念:从通信到协作

ROS2说白了,就是一个分布式通信框架。它让车上的各个模块——感知、定位、规划、控制——能互相说话。我个人习惯把ROS2的核心抽象成三样东西:节点、话题、服务。

  • 节点:每个节点就是一个独立进程。比如规划节点、控制节点。节点之间不直接调用,而是通过话题或服务通信。
  • 话题:一对多、异步通信。规划节点发布路径,控制节点订阅。我经常跟新人说,话题就像广播电台,谁想听谁听。
  • 服务:一对一、同步通信。比如规划节点请求地图数据,服务端返回结果。适合需要即时响应的场景。

重要概念:ROS2的DDS(数据分发服务)是底层通信中间件。它保证了实时性、可靠性。我在项目中遇到过因为DDS配置不当导致消息丢帧的问题,后来发现是QoS策略没设对。嗯,这里要注意,QoS(服务质量)是调试时的关键参数。

来看一个最简单的规划节点示例:

import rclpy
from rclpy.node import Node
from std_msgs.msg import String

class PlannerNode(Node):
    def __init__(self):
        super().__init__('planner_node')
        self.publisher_ = self.create_publisher(String, 'planned_path', 10)
        self.timer = self.create_timer(1.0, self.publish_path)

    def publish_path(self):
        msg = String()
        msg.data = 'Path: [x1,y1] -> [x2,y2]'
        self.publisher_.publish(msg)
        self.get_logger().info('Publishing: "%s"' % msg.data)

def main(args=None):
    rclpy.init(args=args)
    node = PlannerNode()
    rclpy.spin(node)
    node.destroy_node()
    rclpy.shutdown()

if __name__ == '__main__':
    main()

这段代码创建了一个规划节点,每秒发布一次路径消息。你想想看,实际项目中,这个节点会订阅感知结果、定位信息,然后计算出一条安全轨迹。

1.2 自动驾驶规划栈介绍:分层决策的艺术

自动驾驶规划不是一步到位的。它像剥洋葱一样,一层层细化。我习惯把规划栈分成三层:

层级 名称 输入 输出 典型频率
L1 全局规划 起点、终点、地图 粗粒度路径(车道级) 1-10 Hz
L2 行为规划 全局路径、障碍物 驾驶决策(跟车、变道、停车) 10-50 Hz
L3 运动规划 行为决策、车辆状态 轨迹(时间+空间) 50-100 Hz

为什么会这样分层?说白了,全局规划考虑宏观路线,不需要高频更新。而运动规划要实时避障,必须跑得快。我曾经在一个项目里把全局规划频率设到50Hz,结果CPU爆了,车辆反而反应迟钝。后来降到5Hz,一切正常。

个人经验:调试时先检查每一层的输出是否合理。比如全局路径是否穿墙?行为决策是否在路口犹豫?运动规划是否急转弯?逐层排查,效率最高。

下面这张图展示了规划栈的完整流程:

全局规划 输入:地图+起点终点 行为规划 输入:全局路径+障碍物 运动规划 输入:行为决策+状态 最终轨迹 反馈:碰撞检测、状态更新 自动驾驶规划栈架构图

从图中你能看到,规划不是单向的。运动规划的结果会反馈给行为规划,行为规划也可能触发全局重规划。这种闭环设计,保证了系统的鲁棒性。

1.3 调试环境搭建:工欲善其事,必先利其器

环境搭建是很多人头疼的地方。我建议按以下步骤来:

  1. 安装ROS2 Humble(推荐Ubuntu 22.04)。直接用apt安装,别自己编译,省时间。
  2. 创建工作空间:mkdir -p ~/planning_ws/src
  3. 安装依赖工具:sudo apt install python3-colcon-common-extensions
  4. 安装可视化工具:sudo apt install ros-humble-rviz2
  5. 安装规划相关包:sudo apt install ros-humble-nav2-*

避坑指南:我曾经因为Python版本冲突,折腾了一整天。后来发现ROS2 Humble要求Python 3.10以上。如果你用Python 3.8,很多包会报错。建议先检查版本:python3 --version。

搭建完成后,验证环境:

# 终端1
ros2 run demo_nodes_cpp talker

# 终端2
ros2 run demo_nodes_py listener

如果能看到消息收发,说明环境OK。接下来,我习惯用ros2 topic list和ros2 node list来检查节点和话题是否正常。这是调试的第一步。

调试小技巧:用ros2 bag record录制数据,然后离线回放。这样你可以反复分析规划模块的行为,而不需要真车跑。我在测试新算法时,总是先录一段数据,再离线调试。

嗯,这一章的内容就到这里。记住,规划调试的核心是理解通信、分层排查、善用工具。后面我们会一步步深入每个模块的实战细节。

可可精品资料库