1、ROS2与自动驾驶概览:自动驾驶技术栈简介、ROS2在自动驾驶中的角色、ROS2核心概念(节点、话题、服务、动作)回顾

1.1 自动驾驶技术栈:从传感器到执行器

聊自动驾驶,咱们得先看看它到底长什么样。

说白了,自动驾驶就是一个「感知-决策-控制」的闭环。我习惯把它分成三层:

  • 感知层:摄像头、激光雷达、毫米波雷达、IMU、GPS……这些传感器负责「看」和「听」。
  • 决策层:路径规划、行为预测、运动规划……这部分负责「想」。
  • 控制层:转向、油门、刹车……这部分负责「动」。

你想想看,这三层之间怎么通信?数据怎么流转?

嗯,这就是ROS2登场的地方了。

核心观点:ROS2不是自动驾驶的全部,但它是连接所有模块的「神经系统」。

1.2 ROS2在自动驾驶中的角色:不只是中间件

很多人觉得ROS2就是个通信中间件。其实不止。

我在做量产项目时遇到过一个问题:不同传感器厂商的驱动接口五花八门。有的用UDP,有的用共享内存,有的甚至直接写文件。如果没有ROS2的统一抽象层,光适配驱动就能把人逼疯。

ROS2在自动驾驶里扮演了三个关键角色:

  1. 通信总线:节点之间通过话题、服务、动作交换数据。
  2. 模块化框架:每个算法都可以独立开发、测试、替换。
  3. 工具链生态:可视化(Rviz2)、录制回放(rosbag2)、调试工具……

个人经验:我建议初学者先别急着写代码,先把rosbag2玩熟。录一段真实路测数据,然后在桌面端反复回放调试。这比在实车上改代码高效十倍。

1.3 ROS2核心概念回顾:节点、话题、服务、动作

这四个概念是ROS2的基石。咱们一个一个过。

1.3.1 节点(Node)

节点就是可执行进程。每个节点只干一件事,比如「激光雷达驱动节点」只管发点云,「融合定位节点」只管算位置。

我刚开始学的时候,总想把所有功能塞进一个节点里。后来被同事骂了一顿——「一个节点崩了,全车瘫痪」。记住:节点越单一,系统越健壮

// 创建一个节点(C++示例)
rclcpp::Node::SharedPtr node = std::make_shared<rclcpp::Node>("lidar_driver");

1.3.2 话题(Topic)

话题是异步通信的通道。发布者只管发,订阅者只管收。一对多、多对一都行。

举个例子:感知节点发布 /perception/objects 话题,规划节点订阅它。两者互不阻塞。

避坑指南:我曾经在项目中把话题名写错了大小写,结果两个节点默默运行了三天,谁也没收到谁的数据。ROS2的话题名是大小写敏感的,切记!

# 发布话题(Python示例)
self.publisher_ = self.create_publisher(String, 'topic_name', 10)

1.3.3 服务(Service)

服务是同步的请求-响应模式。客户端发请求,服务端处理完返回结果。

什么时候用服务?比如「请给我当前地图」——你问一次,它答一次。不需要持续订阅。

# 服务端(Python示例)
def get_map_callback(request, response):
    response.map_data = load_map()
    return response

self.srv = self.create_service(GetMap, 'get_map', get_map_callback)

我的习惯:服务适合低频、确定性的交互。如果你需要高频推送数据,别用服务,用话题。

1.3.4 动作(Action)

动作是服务的升级版。它支持:

  • 异步执行(不阻塞调用方)
  • 实时反馈(比如「当前进度30%」)
  • 可取消(比如「停!别走了」)

自动驾驶里最典型的动作就是「规划路径并执行」。你发出目标点,规划器一边算路径,一边告诉你「正在规划中」,还能随时取消。

# 动作客户端(Python示例)
self._action_client = ActionClient(self, NavigateToPose, 'navigate_to_pose')

# 发送目标
goal_msg = NavigateToPose.Goal()
goal_msg.pose = target_pose
self._action_client.send_goal_async(goal_msg)

1.4 小结:为什么ROS2适合自动驾驶?

说白了,自动驾驶系统太复杂了。一个模块崩了不能影响全车,一个算法升级了不能重写整个系统。

ROS2的节点化设计、话题/服务/动作的灵活通信、以及丰富的工具链,恰好解决了这些痛点。

我记得第一次用ROS2跑通一个完整的感知-规划-控制闭环时,那种感觉就像搭积木一样——每个模块独立工作,组合起来却能跑车。嗯,这就是ROS2的魅力。

下一章预告:我们会亲手搭建第一个ROS2节点,从零开始写一个「虚拟激光雷达」发布器。准备好你的终端,咱们动手了。