第一章: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 调试环境搭建:工欲善其事,必先利其器
环境搭建是很多人头疼的地方。我建议按以下步骤来:
- 安装ROS2 Humble(推荐Ubuntu 22.04)。直接用apt安装,别自己编译,省时间。
- 创建工作空间:
mkdir -p ~/planning_ws/src - 安装依赖工具:
sudo apt install python3-colcon-common-extensions - 安装可视化工具:
sudo apt install ros-humble-rviz2 - 安装规划相关包:
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录制数据,然后离线回放。这样你可以反复分析规划模块的行为,而不需要真车跑。我在测试新算法时,总是先录一段数据,再离线调试。
嗯,这一章的内容就到这里。记住,规划调试的核心是理解通信、分层排查、善用工具。后面我们会一步步深入每个模块的实战细节。