第三章: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核心逻辑。你把它存下来,以后写代码时对照着看。
好了,这一章的内容就到这里。记住:节点是执行者,话题是通道,服务是触发器。命令行工具是你的眼睛和手,工作空间是你的工程地基。把这些搞明白,后面的激光雷达数据处理才能顺风顺水。
核心要点:
- 节点是独立进程,话题用于持续数据流,服务用于一次性操作
- 学会用
rosnode、rostopic、rosbag调试系统 - Catkin工作空间三步走:创建src → catkin_make → source setup.bash