第三章:ROS基础回顾——核心概念、命令行工具与工作空间构建

各位同学好,我是你们的自动驾驶感知讲师。今天咱们来聊聊ROS基础。说实话,很多初学者一上来就急着写代码,结果连节点和话题都分不清,调试起来一头雾水。我个人习惯是,先把地基打牢,后面才能跑得快。

ROS(Robot Operating System)说白了就是一个分布式通信框架。你想想看,激光雷达、摄像头、IMU这些传感器,各自跑在不同的进程里,怎么让它们协同工作?ROS就是干这个的。

3.1 ROS核心概念:节点、话题、服务

这三个概念,我建议你刻在脑子里。它们构成了ROS的骨架。

3.1.1 节点(Node)

节点就是可执行文件,是ROS里最小的处理单元。每个节点负责一个具体的任务。比如,一个节点负责读取激光雷达数据,另一个节点负责做点云滤波。

重要提示:每个节点都有自己的名字,且名字必须唯一。我在项目中遇到过两个节点同名,结果其中一个直接挂掉,查了半天才发现是命名冲突。

节点之间是松耦合的。一个节点挂了,其他节点还能继续跑。这在自动驾驶里太重要了——你总不希望激光雷达节点崩了,整个系统就瘫痪吧?

3.1.2 话题(Topic)

话题是节点之间通信的通道。它采用发布/订阅模式。一个节点发布数据到某个话题,其他节点订阅这个话题就能收到数据。

举个例子:激光雷达节点发布 /scan 话题,里面装着原始点云数据。滤波节点订阅 /scan,处理完后再发布 /filtered_scan。这样,下游的感知节点就能拿到干净的数据了。

我的经验:话题命名要规范。我习惯用 /sensor/lidar/raw 这种层级结构,而不是随便起个 /data。否则项目大了,你自己都找不到谁是谁。

3.1.3 服务(Service)

话题是单向的、持续的流式通信。服务则是请求-响应模式,适合一次性的操作。比如,你让某个节点「保存当前点云到文件」,这就是一个服务调用。

服务由客户端发起请求,服务端处理并返回响应。它不像话题那样持续发送数据,而是「问一句,答一句」。

特性 话题(Topic) 服务(Service)
通信模式 发布/订阅 请求/响应
数据流 持续、单向 一次性、双向
典型用途 传感器数据流 触发式操作
是否阻塞 非阻塞 阻塞(等待响应)

3.2 常用命令行工具

ROS的命令行工具,我每天至少用几十次。它们能帮你快速了解系统在干什么。

3.2.1 查看节点和话题

# 列出所有正在运行的节点
rosnode list

# 查看某个节点的详细信息
rosnode info /your_node_name

# 列出所有活跃的话题
rostopic list

# 查看某个话题的消息类型
rostopic info /scan

# 实时打印话题数据
rostopic echo /scan

嗯,这里要注意:rostopic echo 会持续输出数据,按 Ctrl+C 才能退出。我曾经在调试时忘了关,结果终端里刷了几万行点云数据,差点把电脑卡死。

3.2.2 消息类型与录制回放

# 查看消息类型定义
rosmsg show sensor_msgs/LaserScan

# 录制所有话题到bag文件
rosbag record -a

# 回放bag文件
rosbag play your_bag.bag

避坑指南:我曾经录了一个小时的激光雷达数据,结果忘了加 -a 参数,只录了部分话题。后来做回放分析时发现数据不全,只能重新采集。所以,录制前一定确认好话题列表。

3.3 Catkin工作空间构建

Catkin是ROS的构建系统。说白了,它帮你把C++或Python代码编译成可执行文件。

3.3.1 创建工作空间

# 创建目录
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

# 初始化工作空间
catkin_init_workspace

# 编译
cd ~/catkin_ws
catkin_make

编译完成后,你会看到 build 和 devel 两个目录。前者是编译中间文件,后者是生成的可执行文件和库。

3.3.2 设置环境变量

# 每次打开新终端都要执行
source ~/catkin_ws/devel/setup.bash

# 或者直接写入bashrc,一劳永逸
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

我的习惯:我会在 ~/.bashrc 里加一行注释,写上工作空间路径。这样换电脑或重装系统时,能快速恢复环境。

3.3.3 创建功能包

cd ~/catkin_ws/src
catkin_create_pkg lidar_filter roscpp rospy sensor_msgs std_msgs

# 编译
cd ~/catkin_ws
catkin_make

这个命令会生成 lidar_filter 包,里面包含 CMakeLists.txt 和 package.xml。依赖项 roscpp、rospy、sensor_msgs、std_msgs 会自动写入配置文件。

3.4 本章知识体系

下面这张图,是我自己画的ROS核心逻辑。你把它存下来,以后写代码时对照着看。

ROS核心知识体系 节点 (Node) 可执行进程 话题 (Topic) 发布/订阅通信 服务 (Service) 请求/响应通信 发布 订阅 命令行工具:rosnode / rostopic / rosbag / catkin_make Catkin工作空间:src → build → devel → setup.bash 三者结合,构成ROS分布式通信的基础架构

好了,这一章的内容就到这里。记住:节点是执行者,话题是通道,服务是触发器。命令行工具是你的眼睛和手,工作空间是你的工程地基。把这些搞明白,后面的激光雷达数据处理才能顺风顺水。

核心要点:

  • 节点是独立进程,话题用于持续数据流,服务用于一次性操作
  • 学会用 rosnode、rostopic、rosbag 调试系统
  • Catkin工作空间三步走:创建src → catkin_make → source setup.bash

可可精品资料库