本文基于 Ubuntu 20.04 + ROS Noetic(ROS 1),面向初学者梳理 ROS 的核心概念与常用命令。建议按章节顺序操作,并在每次打开新终端后确认 ROS 环境已加载。
一、安装与配置 ROS 环境1.1 安装 ROS1.2 管理环境1.3 创建 ROS 空间二、认识 ROS 文件系统2.1 文件系统概念2.2 文件系统工具三、创建 ROS 软件包3.1 创建 catkin 软件包3.2 查看软件包依赖关系3.3 catkin 软件包组成四、构建 ROS 软件包4.1 catkin_make 构建软件包4.2 开始构建你的软件包五、理解 ROS 节点5.1 使用 roscore 和 rosnode5.2 使用 rosrun 调出另一个节点六、理解 ROS 话题与消息6.1 引例 - 通过键盘控制乌龟移动6.2 话题和话题消息类型6.3 发布话题消息和频率6.4 显示话题数据(数字和图形)七、理解 ROS 服务与参数7.1 调用服务(输入服务参数)7.2 参数(设置、获取、保存和加载)八、使用 roslaunch 启动多个节点九、创建自定义消息与服务9.1 创建 msg9.2 使用 rosmsg9.3 创建 srv9.4 使用 rossrv9.5 生成消息与服务代码参考资料
一、安装与配置 ROS 环境
1.1 安装 ROS
ROS 发行版需要与 Ubuntu 版本匹配。可在 ROS 安装页面查看各版本的系统要求。本文使用 Ubuntu 20.04,因此选择 ROS Noetic。
序号 | 名称 | 发布时间 | 支持时间 | 操作系统支持 |
1 | ROS Melodic Morenia | 发布于2018年5月 | LTS长期支持到2023年5月 | 建议在Ubuntu 18.04上安装 |
2 | ROS Noetic Ninjemys | 发布于2020年5月 | 最新的LTS长期支持到2025年5月 | 建议在Ubuntu 20.04上安装 |
先确认 Ubuntu 版本,再选择对应的 ROS 发行版:
常见 Ubuntu 版本及代号如下:
- Ubuntu 12.04 LTS:Precise
- Ubuntu 14.04 LTS:Trusty
- Ubuntu 15.04:Vivid
- Ubuntu 15.10:Wily
- Ubuntu 16.04 LTS:Xenial
- Ubuntu 18.04 LTS:Bionic
- Ubuntu 20.04 LTS:Focal
具体安装步骤参考:在 Ubuntu 上安装 ROS Noetic。
1.2 管理环境
ROS 通过 Shell 环境变量确定当前使用的发行版、工作空间和软件包路径。正确加载环境脚本后,终端才能找到
roscore、rosrun 等命令,以及对应的软件包。环境脚本主要来自以下位置:
- 通过软件包管理器安装 ROS 时,由系统提供
setup.*sh。
- 编译或安装 Catkin 软件包时,由 Catkin 自动生成。
- 旧版 rosbuild 工作空间可由 rosws 等工具生成,但 rosbuild 已停止维护,不建议在新项目中使用。
- 设置环境变量
如果通过 Ubuntu 的
apt安装 ROS,可在/opt/ros/<distro>/目录找到setup.*sh。以 Noetic 为例:
该配置只对当前终端生效。若希望新终端自动加载,可将命令写入
~/.bashrc:- 验证环境是否加载成功
1.3 创建 ROS 空间
本文使用 Catkin 创建工作空间。以下操作适用于 ROS Groovy 及更新版本;更早的 ROS Fuerte 等版本使用 rosbuild。
创建并初始化 Catkin 工作空间:
执行
catkin_make 后会生成 build/ 和 devel/ 目录,并在 src/ 下创建顶层 CMakeLists.txt 链接。使用以下命令加载当前工作空间:
加载后,确认
ROS_PACKAGE_PATH 包含当前工作空间的 src 目录:至此,环境已搭建好。
二、认识 ROS 文件系统
2.1 文件系统概念
- 软件包(Package):ROS 代码的基本组织单元,可以包含库、可执行文件、脚本、配置文件等。
- 软件包清单(package.xml):记录软件包的名称、版本、维护者、许可证和依赖关系。
2.2 文件系统工具
ROS 提供了一组定位和浏览软件包的命令,避免手动查找绝对路径:
rospack find <package>:返回软件包路径,例如rospack find roscpp。
roscd <package>:进入软件包目录,例如roscd roscpp。- 只能进入
ROS_PACKAGE_PATH中可见的软件包。 - 可直接进入子目录,例如
roscd roscpp/cmake。 roscd log可进入 ROS 日志目录;如果尚未运行过 ROS 程序,该目录可能不存在。
rosls <package>:列出软件包内容,例如rosls roscpp_tutorials。
三、创建 ROS 软件包
3.1 创建 catkin 软件包
3.2 查看软件包依赖关系
depends1 显示直接依赖,通常对应创建软件包时传给 catkin_create_pkg 的依赖项;这些依赖也记录在 package.xml 中:3.3 catkin 软件包组成
一个合法的 Catkin 软件包至少需要满足以下条件:
- 位于独立目录中。
- 包含符合 Catkin 规范的
package.xml。
- 包含 Catkin 版本的
CMakeLists.txt。
最简单的软件包看起来就像这样:
package.xml的组成部分
- 描述标签
- 维护者标签
- 许可证标签
- 依赖项标签

最终 package.xml
四、构建 ROS 软件包
4.1 catkin_make 构建软件包
CMake工作流程
普通 CMake 项目通常需要逐个进入构建目录执行
cmake 和 make:Catkin 工作空间则可以使用
catkin_make 按依赖顺序统一构建多个软件包:若catkin项目没有放在工作空间的 catkin/src 目录下,比如 my_src 下,可以这样使用 catkin_make:
对于catkin_make的高级用法,请参考catkin/commands/catkin_make。
4.2 开始构建你的软件包
五、理解 ROS 节点
节点(Node)是一个参与 ROS 通信的运行中进程,通常由软件包中的某个可执行文件启动。节点之间通过话题、服务或动作交换数据2。
可以把节点理解为“职责单一、能够通信的运行单元”。例如,遥控器节点发布控制指令,机器人节点接收指令并执行动作。实际机器人通常还会把传感器、控制器和执行机构拆成多个节点,使各模块能够独立开发和运行。

每个新终端都需要加载 ROS 和工作空间环境。如果
rosnode 等命令不可用,请检查 ~/.bashrc,或手动执行相应的 source <setup.bash> 命令。5.1 使用 roscore 和 rosnode
- 启动 ROS Master:
roscore。
- 打开新终端,列出当前节点:
rosnode list。
- 查看指定节点的信息:
rosnode info /rosout。
- 检查节点是否可达:
rosnode ping <node_name>。
5.2 使用 rosrun 调出另一个节点
在运行节点的终端中按
Ctrl+C,即可终止该节点。六、理解 ROS 话题与消息
6.1 引例 - 通过键盘控制乌龟移动
- 启动
roscore。如果上一节的进程仍在运行,无需重复启动。
- 启动 turtlesim 仿真节点:
rosrun turtlesim turtlesim_node。
- 在新终端启动键盘控制节点:
rosrun turtlesim turtle_teleop_key。
- 使用方向键控制乌龟移动。
请先选中运行
turtle_teleop_key 的终端窗口,而不是 turtlesim 图形窗口,否则方向键输入无法被捕获。- 运行
rosrun rqt_graph rqt_graph,查看节点与话题之间的连接关系。

此时系统中有两个节点:
turtle_teleop_key 将键盘指令发布到话题,turtlesim_node 订阅该话题并控制乌龟运动。这体现了 ROS 的发布—订阅通信模型:发布者和订阅者通过话题交换消息,不需要直接调用对方。6.2 话题和话题消息类型
命令
使用
6.3 发布话题消息和频率
命令
使用
6.4 显示话题数据(数字和图形)
可以用以下两种方式观察话题数据:
执行前述发布命令后,
rqt_graph 中会出现新的话题连接关系:
显示 /turtle1/pose/y 和 /turtle1/pose/x

显示 /turtle1/pose/theta

七、理解 ROS 服务与参数
7.1 调用服务(输入服务参数)
服务(Service)采用请求—响应模型:客户端发送请求,服务端处理后返回一次响应。它适合“触发一个操作并立即获取结果”的场景,与持续传输数据的话题不同。
list命令显示turtlesim节点提供了9个服务:reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers, turtlesim/set_logger_level。同时还有两个与rosout节点有关的服务:/rosout/get_loggers和/rosout/set_logger_level。示例: /clear 服务
示例: /spawn 服务
7.2 参数(设置、获取、保存和加载)
设置和获得参数
现在我们修改背景颜色的红色通道值:
该命令只修改了参数服务器中的值。要让 turtlesim 重新读取背景色,需要调用
/clear 服务:保存和加载参数
在这里,我们将所有的参数写入
params.yaml文件:你甚至可以将yaml文件重载入新的命名空间,例如
copy_turtle:八、使用 roslaunch 启动多个节点
- 切换工作目录,并创建 launch 文件夹
launch 文件并非必须放在名为
launch 的目录中,但采用这一约定能让项目结构更统一,也更方便维护。- 创建 turtlemimic.launch 文件
- 第 3~9 行:在
turtlesim1和turtlesim2两个命名空间中分别启动名为sim的节点,避免同名冲突。 - 第 11~14 行:启动
mimic节点,并通过remap将输入和输出映射到两个 turtlesim 实例,使第二只乌龟模仿第一只。
- 启动 launch 文件:
- 在新终端持续发布速度指令:

- 使用
rqt_graph查看节点和话题连接:

九、创建自定义消息与服务
9.1 创建 msg
要让 Catkin 根据
.msg 文件生成 C++、Python 等语言的代码,需要补充以下构建配置:- 打开 package.xml,添加如下两行
- 在
CMakeLists.txt的find_package中加入message_generation:
- 在
catkin_package中声明运行时依赖,并登记消息文件:
9.2 使用 rosmsg
创建消息后,可以通过 rosmsg show 命令看看 ROS 能否识别它
- beginner_tutorials -- 定义消息的软件包
- Num -- 消息的名称 Num
如果不记得msg在哪个包中,也可以省略包名称。尝试:
你会看到:
9.3 创建 srv
从另一个包复制现有的srv定义,而不是手动创建新的srv。
要让 Catkin 根据
.srv 文件生成代码,先完成 9.1 中与 package.xml 和 find_package 相关的配置,再在 CMakeLists.txt 中声明服务文件:9.4 使用 rossrv
创建服务后,可以通过 rossrv show 命令看看 ROS 能否识别它
- beginner_tutorials -- 定义消息的软件包
- AddTwoInts -- 服务的名称 AddTwoInts
如果不记得srv在哪个包中,也可以省略包名称。尝试:
你会看到:
9.5 生成消息与服务代码
在
CMakeLists.txt 中启用 generate_messages,并列出自定义消息依赖的软件包。本例依赖 std_msgs:完成配置后,回到 Catkin 工作空间重新构建:
构建成功后,Catkin 会为
msg/ 和 srv/ 中的定义生成各语言接口:- C++ 头文件:
~/catkin_ws/devel/include/beginner_tutorials/
- Python 消息模块:
~/catkin_ws/devel/lib/python3/dist-packages/beginner_tutorials/msg/
- Python 服务模块:
~/catkin_ws/devel/lib/python3/dist-packages/beginner_tutorials/srv/
- Lisp 接口:
~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/
消息格式的完整规范在消息描述语言中。
如果你正在构建使用新消息的C++节点,则还需要声明节点和消息之间的依赖关系,参见catkin消息和服务构建文档。
参考资料
1. http://wiki.ros.org/rosbash ↩
2. [What is a ROS Node? - The Robotics Back-End (roboticsbackend.com)](https://roboticsbackend.com/what-is-a-ros-node/#:~:text=A ROS node%2C according to,%2C services%2C actions%2C etc.) ↩
- Author:felixfixit
- URL:http://www.felixmicrospace.top/article/ros_website_tutorial_basics
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!












