想象要造一个机器人,它需要:眼睛(摄像头/激光雷达)、大脑(决策电脑)、四肢(轮子/机械臂)、神经系统(线路与信号)。从零开始的话,换一个摄像头、加一个机械臂,整个通信系统可能都要重写。
| ROS 概念 | 中文 | 人体类比 | 一句话解释 |
|---|---|---|---|
| Node | 节点 | 大脑功能区/器官 | 一个个独立的可执行程序(如 camera_node 发图像、motor_control_node 控电机) |
| Topic | 话题 | 广播频道 | 节点间异步通信管道,发布/订阅一对多广播 |
| Message | 消息 | 语言/信号 | 话题上传输的、有严格类型定义的数据 |
| Service | 服务 | 问答/请求 | 一对一同步请求-响应,适合"重置里程计"这类短暂任务 |
| Action | 动作 | 布置任务并汇报进度 | 带连续反馈的异步通信,适合"导航到 20 米外"这类长任务 |
| Master | 主节点(仅 ROS1) | 总机/通信录 | 注册中心,启动任何 ROS1 系统前必须先启动(ROS2 已去掉) |
网上海量教程仍是 ROS1 的,学习前先分清版本,否则会卡在各种报错里。
| 判别点 | ROS1(老) | ROS2(新,推荐学这个) |
|---|---|---|
| 核心架构 | 中心化(依赖 Master,单点故障) | 去中心化(节点自动发现,DDS 通信) |
| 搜索关键词 | — | 务必加 "ROS 2" 或发行版名(Humble/Jazzy) |
| 编译命令 | catkin_make / catkin build | colcon build |
| Python 库 | import rospy | import rclpy |
| C++ 库 | #include "ros/ros.h" | #include "rclcpp/rclcpp.hpp" |
| 运行命令 | rosrun / rostopic | ros2 run / ros2 topic |
国内用户强烈推荐 小鱼的一键安装脚本(支持 ROS Noetic / ROS2 Foxy / Humble 等):
wget http://fishros.com/install -O fishros && . fishros
安装后检查环境变量是否已写入 ~/.bashrc(或 ~/.zshrc):
source /opt/ros/humble/setup.bash # ROS2 Humble(Ubuntu 22.04)
source ~/ros2_ws/install/setup.bash # 你的工作空间(见下,别写进 .bashrc!)
/opt/ros/humble/setup.bash 写进 .bashrc,但千万不要把工作空间的 install/setup.bash 写进去—— 否则 ROS 环境被"写死"在一个工作空间,换项目时各种环境变量冲突。验证:printenv | grep ROS 或直接敲 ros2 看是否有帮助信息。
ROS 命令又长又多,配一个强大的命令行环境非常值得。三步搞定:
git clone https://github.com/zsh-users/zsh-autosuggestions.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
# 编辑 ~/.zshrc,把 plugins=(git) 改为:
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
# 然后:
source ~/.zshrc # 或 exec zsh
验证:新终端输入 ros2 topic list - 后按 Tab,应能看到参数补全提示。
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
src 是源代码目录(关键字);功能包都放这里。
cd ~/ros2_ws/src
ros2 pkg create --build-type ament_python --node-name simple_publisher my_first_package
--build-type ament_python 指定 Python 包(C++ 用 ament_cmake);--node-name 自动生成节点文件。生成的结构:
src/my_first_package/
├── my_first_package/
│ ├── __init__.py
│ └── simple_publisher.py <- 节点代码在这
├── package.xml <- 包清单(依赖/许可证)
├── setup.cfg
├── setup.py <- 入口点配置(见 6.4)
└── resource/
用编辑器打开 simple_publisher.py,替换为:
import rclpy
from rclpy.node import Node
from std_msgs.msg import String
class MinimalPublisher(Node):
def __init__(self):
super().__init__('minimal_publisher')
# 创建发布者:向 talker_topic 发 String 消息,队列长度 10(QoS 基础)
self.publisher_ = self.create_publisher(String, 'talker_topic', 10)
# 定时器:每 0.5 秒触发一次
self.timer = self.create_timer(0.5, self.timer_callback)
self.i = 0
def timer_callback(self):
msg = String()
msg.data = 'Hello World: %d' % self.i
self.publisher_.publish(msg)
self.get_logger().info('Publishing: "%s"' % msg.data)
self.i += 1
def main(args=None):
rclpy.init(args=args)
minimal_publisher = MinimalPublisher()
rclpy.spin(minimal_publisher) # 保持运行,处理回调
minimal_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
entry_points={
'console_scripts': [
'talker = my_first_package.simple_publisher:main',
],
},
意思是:创建名为 talker 的可执行脚本,运行它即执行包内模块的 main()。
# ① 编译(在 ~/ros2_ws)
cd ~/ros2_ws
colcon build
# ② 激活环境(每个新终端都要先 source!)
source install/setup.bash
# ③ 运行节点(同一个已激活的终端)
ros2 run my_first_package talker
# → [INFO] Publishing: "Hello World: 0" ... 每秒刷屏
# ④ 新开一个终端,先 source,然后验证:
source ~/ros2_ws/install/setup.bash
ros2 topic list # 应看到 /talker_topic
ros2 topic echo /talker_topic # 实时看到发布的消息
rqt_graph # 可视化计算图:节点 → 话题
/minimal_publisher → /talker_topic 的连线 —— 你的第一个 ROS2 程序就跑通了!| 命令 | 作用 |
|---|---|
| ros2 run <包> <可执行> | 运行一个节点 |
| ros2 node list | 列出所有运行中的节点 |
| ros2 topic list / echo <话题> | 列出话题 / 实时监听消息(调试最常用) |
| ros2 topic pub <话题> <类型> '<数据>' | 从命令行发布一条消息 |
| ros2 service list / call | 列出服务 / 调用服务 |
| ros2 param list | 列出节点参数 |
| ros2 bag record / play | 录制 / 回放话题数据(现场录数据回实验室重放调试) |
| rqt_graph / rqt_plot / rqt_console | 计算图可视化 / 数据曲线 / 日志过滤 |
self.create_publisher(String, 'talker_topic', 10) 的第三个参数「10」表示什么?create_timer(0.5, ...)),与 10 无关。--build-type 应填哪个值?--build-type ament_python 指定 Python 包(C++ 用 ament_cmake)。catkin 是 ROS1 的构建工具,rosbuild 是更早期的构建方式——混用会卡在各种报错里(见第 3 节)。