type
date
slug
category
icon
password
一、安装和配置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九、创建ROS消息和服务9.1 创建 msg9.2 使用 rosmsg9.3 创建 srv9.4 使用 rossrv10.5 msg 和 srv 的一般步骤参考资料
一、安装和配置ROS环境
1.1 安装 ROS
ROS安装选择介绍了不同ROS安装版本
序号 | 名称 | 发布时间 | 支持时间 | 操作系统支持 |
1 | ROS Melodic Morenia | 发布于2018年5月 | LTS长期支持到2023年5月 | 建议在Ubuntu 18.04上安装 |
2 | ROS Noetic Ninjemys | 发布于2020年5月 | 最新的LTS长期支持到2025年5月 | 建议在Ubuntu 20.04上安装 |
可以通过如下命令查看系统版本,当前版本为 20.04,根据建议,安装了 ROS Noetic
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 代号bionic 仿生的
- Ubuntu 20.04 代号focal
ROS安装方法参考在 Ubuntu 上安装 ROS Noetic。
1.2 管理环境
- 环境变量管理用途
ROS依赖于使用shell环境组合空间的概念,这使得针对不同版本的ROS或不同的软件包集开发变得更加容易。
- 环境变量设置文件来源
- 用软件包管理器安装的ROS软件包已经提供了setup.*sh文件
- 在rosbuild workspaces中使用类似rosws的工具生成(rosbuild工具不再维护不推荐)
- 编译或安装catkin软件包时自动生成(catkin现在是组织代码的推荐方式,它使用更标准的CMake约定,并具有更大的灵活性)
- 设置环境变量
通过Ubuntu上的apt工具来安装ROS的,那么你将会在/opt/ros//目录中看到setup.*sh文件,以执行下面的source命令:
在每次打开终端时你都需要先运行上面这条后才能访问ROS相关的命令,为了避免这一繁琐过程,你可以事先在
.bashrc
文件中添加这条命令。- 测试是否正确配置了环境
1.3 创建 ROS 空间
- Catkin适用性
- 操作方法只适用于ROS Groovy及更新版本
- 对于ROS Fuerte及早期版本,请选择rosbuild。
- 创建和构建一个 catkin 工作空间创建完,catkin_ws 目录结构如下(build子文件夹有删减)
- src目录下创建一个CMakeLists.txt的链接。
source devel/setup.bash
可将当前工作空间设置在环境最顶层- 要保证工作区被安装脚本正确覆盖,需确定ROS_PACKAGE_PATH环境变量包含你当前的工作空间目录:
至此,环境已搭建好。
二、ROS文件系统导览
2.1 文件系统概念
- 软件包(Packages):包是ROS代码的软件组织单元,每个软件包都可以包含程序库、可执行文件、脚本或其他构件。
- Manifests (package.xml): 清单(Manifest)是对软件包的描述。它用于定义软件包之间的依赖关系,并记录有关软件包的元信息,如版本、维护者、许可证等。
2.2 文件系统工具
程序代码散落在许多ROS包中。使用Linux内置命令行工具(如ls和cd)来进行查找和导航可能非常繁琐,因此ROS提供了专门的命令工具来简化这些操作1。
- rospack = ros + pack(age) - rospack允许你获取软件包的有关信息。
- 查找是否存在该报,存在返回地址
rospack find roscpp
- roscd = ros + cd - 允许你直接切换目录(cd)到某个软件包或者软件包集当中
- 切换到软件包
roscd roscpp
- roscd只能切换到那些路径已经包含在ROS_PACKAGE_PATH环境变量中的软件包
- 切换到软件包子目录
roscd roscpp/cmake
- 存储ROS日志文件的目录
roscd log
,但若未执行任何 ROS 程序,系统会报错该目录不存在
- rosls = ros + ls - 直接按软件包的名称执行 ls 命令(而不必输入绝对路径)
- 查看roscpp_tutorials组成
rosls roscpp_tutorials
三、创建ROS软件包
3.1 创建 catkin 软件包
3.2 查看软件包依赖关系
beginner_tutorials 的一级依赖运行为catkin_create_pkg命令时作为参数的依赖包,同样可以在 package.xml 文件中查看
3.3 catkin 软件包组成
- 这个包必须有一个符合catkin规范的package.xml文件
- 这个包必须有一个catkin版本的CMakeLists.txt文件
- 每个包必须有自己的目录
最简单的软件包看起来就像这样:
package.xml的组成部分
- 描述标签
- 维护者标签
- 许可证标签
- 依赖项标签

最终 package.xml
四、构建ROS软件包
4.1 catkin_make 构建软件包
CMake工作流程
工作空间有多个软件包时,则需要每个 package 都需使用 cmake 编译
而多个 catkin 项目放在工作空间,可以通过 catkin_make 一起构建
若catkin项目没有放在工作空间的 catkin/src 目录下,比如 my_src 下,可以这样使用 catkin_make:
对于catkin_make的高级用法,请参考catkin/commands/catkin_make。
4.2 开始构建你的软件包
五、理解 ROS 节点
节点:ROS软件包中的一个可执行文件。节点组成通过话题、服务和动作与其他节点之间沟通2。
注:节点是ROS中非常重要的一个概念,为了帮助初学者理解这个概念,这里举一个通俗的例子:例如,咱们有一个机器人,和一个遥控器,那么这个机器人和遥控器开始工作后,就是两个节点。遥控器起到了下达指 令的作用;机器人负责监听遥控器下达的指令,完成相应动作。从这里我们可以看出,节点是一个能执行特定工作任 务的工作单元,并且能够相互通信,从而实现一个机器人系统整体的功能。在这里我们把遥控器和机器人简单定义为两个节点,实际上在机器人中根据控制器、传感器、执行机构等不同组成模块,还可以将其进一步细分为更多的节点,这个是根据用户编写的程序来定义的。)

Understanding nodes — ROS 2 Documentation: Foxy documentation
:beetle:注意: 当打开一个新的终端时,环境将会重置,
~/.bashrc
文件将会生效。如果你在运行rosnode
等命令时出现一些问题,那么可能需要将一些环境设置文件添加到~/.bashrc
或手动source
一下。5.1 使用 roscore 和 rosnode
- roscore 运行所有 ROS 程序前首先要运行的命令
- 打开一个新终端,查看正在运行的节点
rosnode list
- 查看节点信息
rosnode info /rosout
5.2 使用 rosrun 调出另一个节点
在 ubuntu 中,可以使用
Ctrl+Shift+C
可以关掉节点。六、理解 ROS 话题和消息
6.1 引例 - 通过键盘控制乌龟移动
- 运行 roscore,若上一节未退出,则即可,重复输入启动命令,会报错
- 打开 turtlesim 包下的 turtlesim_node 节点,
rosrun turtlesim turtlesim_node
- 通过键盘控制 turtle,
rosrun turtlesim turtle_teleop_key
, 按键盘上方向键,可以控制乌龟移动
:warning: 注意:请选中turtle_teleop_key的终端窗口(是中断窗口而非图形界面窗口)以确保按键输入能够被捕获。
rosrun rqt_graph rqt_graph
,使用rqt_graph来显示当前运行的节点和话题。

以上,建立了两个节点,而
turtlesim_node
节点和turtle_teleop_key
节点之间是通过一个ROS话题来相互通信的。turtle_teleop_key
在话题上发布键盘按下的消息,turtlesim
则订阅该话题以接收消息。6.2 话题和话题消息类型
命令
使用
6.3 发布话题消息和频率
命令
使用
6.4 显示话题数据(数字和图形)
关于话题上发布的数据,可以通过下面两种方式查看:
经过 6-1 到 6-3 到此步骤后,更新 6-1 第四步骤画出的节点图,如下:

显示 /turtle1/pose/y 和 /turtle1/pose/x

显示 /turtle1/pose/theta

七、理解 ROS 服务和参数
7.1 调用服务(输入服务参数)
服务(Services)是节点之间通讯的另一种方式。服务允许节点发送一个请求(request)并获得一个响应(response)。
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 参数(设置、获取、保存和加载)
设置和获得参数
现在我们修改背景颜色的红色通道值:
上述指令修改了参数的值,现在我们==需要调用clear服务使得参数的修改能生效==:
保存和加载参数
在这里,我们将所有的参数写入
params.yaml
文件:你甚至可以将yaml文件重载入新的命名空间,例如
copy_turtle
:八、使用 roslaunch
- 切换工作目录,并创建 launch 文件夹
⚠️注意:存放launch文件的目录不一定非要命名为
launch
,事实上都不用非得放在目录中,roslaunch
命令会自动查找经过的包并检测可用的启动文件。然而,这种推荐的标准做法被认为是“最佳实践”。- 创建 turtlemimic.launch 文件
- 行 3 - 行 9:创建两个分组,以 namespace标签区分,其中一个名为
turtulesim1
,另一个名为turtlesim2
,两个分组中都有相同的名为sim
的turtlesim节点。这样可以让我们同时启动两个turtlesim模拟器,而不会产生命名冲突。 - 行 11 - 行 14:在这里我们启动模仿节点,话题的输入和输出分别重命名为
turtlesim1
和turtlesim2
,这样就可以让turtlesim2模仿turtlesim1了。
- roslaunch 启动

- 节点图查看Launch 操作

九、创建ROS消息和服务
9.1 创建 msg
为了确保msg文件能被转换为C++、Python和其他语言的源代码,还需要如下操作:
- 打开 package.xml,添加如下两行
- 打开 CMakeLists.txt 文件中,为已经存在里面的find_package调用添加message_generation依赖项,这样就能生成消息了
- 打开 CMakeLists.txt 文件中,作如下修改,确保导出消息的运行时依赖关系
9.2 使用 rosmsg
创建消息后,可以通过 rosmsg show 命令看看 ROS 能否识别它
- beginner_tutorials -- 定义消息的软件包
- Num -- 消息的名称 Num
如果不记得msg在哪个包中,也可以省略包名称。尝试:
你会看到:
9.3 创建 srv
从另一个包复制现有的srv定义,而不是手动创建新的srv。
为了确保msg文件能被转换为C++、Python和其他语言的源代码,还需要如下操作:
1、2 项操作和[创建 msg](#创建 msg)处一致
添加所需的服务依赖项
9.4 使用 rossrv
创建服务后,可以通过 rossrv show 命令看看 ROS 能否识别它
- beginner_tutorials -- 定义消息的软件包
- AddTwoInts -- 服务的名称 AddTwoInts
如果不记得srv在哪个包中,也可以省略包名称。尝试:
你会看到:
10.5 msg 和 srv 的一般步骤
如果没做过上面的教程,请先修改下
CMakeLists.txt
:取消注释,然后添加任意你的消息用到的包含
.msg
文件的软件包(本例中为std_msgs
),如下所示:现在我们已经创建了一些新消息,所以需要重新
make
一下软件包:msg
目录中的任何.msg
文件都将生成所有支持语言的代码。- C++消息的头文件将生成在
~/catkin_ws/devel/include/beginner_tutorials/
。
- Python脚本将创建在
~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg
。
- Lisp文件则出现在
~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/
。
类似地,
srv
目录中的任何.srv
文件都将生成支持语言的代码。对于C++,头文件将生成在消息的头文件的同一目录中。对于Python和Lisp,会在msg
目录旁边的srv
目录中。消息格式的完整规范在消息描述语言中。
如果你正在构建使用新消息的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_basics
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!