U1_ ROS概述与环境搭建
U1 ROS概述与环境搭建
学习目标:
- 了解 ROS 概念、设计目标以及发展历程
- 能够独立安装并运行 ROS
- 能够使用 C++ 或 Python 实现 ROS 版本的
HelloWorld
- 能够搭建 ROS 的集成开发环境
- 了解 ROS 架构设计
工作环境配置
- 先创建一个工作空间;
- 再创建一个功能包;
- 编辑源文件;
- 编辑配置文件;
- 编译并执行
1.创建工作空间并初始化
1 | mkdir -p 自定义空间名称/src |
上述命令,首先会创建一个工作空间以及一个 src
子目录,然后再进入工作空间调用 catkin_make命令编译。
2.进入 src
创建
ros 包
并添加依赖
1 | cd src |
上述命令,会在工作空间下生成一个功能包,该功能包依赖于
roscpp
、rospy
与
std_msgs
,其中roscpp
是使用C++实现的库,而rospy
则是使用python实现的库,std_msgs
是标准消息库,创建ROS功能包时,一般都会依赖这三个库实现。
注意:
在ROS中,虽然实现同一功能时,C++和Python可以互换,但是具体选择哪种语言,需要视需求而定,因为两种语言相较而言:C++运行效率高但是编码效率低,而Python则反之,基于二者互补的特点,ROS设计者分别设计了roscpp
与rospy
库,前者旨在成为ROS的高性能库,而后者则一般用于对性能无要求的场景,旨在提高开发效率。
C++实现
HelloWorld(C++版)
本节内容基于1.3.1,假设你已经创建了ROS的工作空间,并且创建了ROS的功能包,那么就可以进入核心步骤了,使用C++编写程序实现:
1.进入 ros 包的 src 目录编辑源文件
1 | cd 自定义的包 |
C++源码实现(文件名自定义)
1 |
|
2.编辑 ros 包下的 Cmakelist.txt文件
1 | add_executable(步骤3的源文件名 |
3.进入工作空间目录并编译
1 | cd 自定义空间名称 |
生成 build devel ....
4.执行
先启动命令行1:
1 | roscore |
再启动命令行2:
1 | cd 工作空间 |
命令行输出: HelloWorld!
PS:source ~/工作空间/devel/setup.bash
可以添加进.bashrc
文件,使用上更方便
添加方式1: 直接使用 gedit 或 vi 编辑 .bashrc 文件,最后添加该内容
添加方式2:echo "source ~/工作空间/devel/setup.bash" >> ~/.bashrc

HelloWorld(Python版)
本节内容基于1.3.1,假设你已经创建了ROS的工作空间,并且创建了ROS的功能包,那么就可以进入核心步骤了,使用Python编写程序实现:
1.进入 ros 包添加 scripts 目录并编辑 python 文件
1 | cd ros包 |
新建 python 文件: (文件名自定义)
1 | #! /usr/bin/env python |
2.为 python 文件添加可执行权限
1 | chmod +x 自定义文件名.py |
3.编辑 ros 包下的 CamkeList.txt 文件
1 | catkin_install_python(PROGRAMS scripts/自定义文件名.py |
4.进入工作空间目录并编译
1 | cd 自定义空间名称 |
5.进入工作空间目录并执行
先启动命令行1:
1 | roscore |
再启动命令行2:
1 | cd 工作空间 |
输出结果:Hello World!!!!
File Tree
1 | # ~/ROS_ws/autolabor_ws/src |
VScode 配置
https://blog.csdn.net/g944468183/article/details/123759886

编写launch
1 | <launch> |
ROS架构
立足不同的角度,对ROS架构的描述也是不同的,一般我们可以从设计者、维护者、系统结构与自身结构4个角度来描述ROS结构:
1.设计者
ROS设计者将ROS表述为“ROS = Plumbing + Tools + Capabilities + Ecosystem”
- Plumbing: 通讯机制(实现ROS不同节点之间的交互)
- Tools :工具软件包(ROS中的开发和调试工具)
- Capabilities :机器人高层技能(ROS中某些功能的集合,比如:导航)
- Ecosystem:机器人生态系统(跨地域、跨软件与硬件的ROS联盟)
2.维护者
立足维护者的角度: ROS 架构可划分为两大部分
- main:核心部分,主要由Willow Garage 和一些开发者设计、提供以及维护。它提供了一些分布式计算的基本工具,以及整个ROS的核心部分的程序编写。
- universe:全球范围的代码,有不同国家的ROS社区组织开发和维护。一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能。
3.系统架构
立足系统架构: ROS 可以划分为三层
OS 层,也即经典意义的操作系统
ROS 只是元操作系统,需要依托真正意义的操作系统,目前兼容性最好的是 Linux 的 Ubuntu,Mac、Windows 也支持 ROS 的较新版本
中间层
是 ROS 封装的关于机器人开发的中间件,比如:
- 基于 TCP/UDP 继续封装的 TCPROS/UDPROS 通信系统
- 用于进程间通信 Nodelet,为数据的实时性传输提供支持
- 另外,还提供了大量的机器人开发实现库,如:数据类型定义、坐标变换、运动控制....
应用层
功能包,以及功能包内的节点,比如: master、turtlesim的控制与运动节点...
4.自身结构
就 ROS 自身实现而言: 也可以划分为三层
文件系统
ROS文件系统级指的是在硬盘上面查看的ROS源代码的组织形式
计算图
ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程,计算图中的重要概念: 节点(Node)、消息(message)、通信机制_主题(topic)、通信机制_服务(service)
开源社区
ROS的社区级概念是ROS网络上进行代码发布的一种表现形式
- 发行版(Distribution) ROS发行版是可以独立安装、带有版本号的一系列综合功能包。ROS发行版像Linux发行版一样发挥类似的作用。这使得ROS软件安装更加容易,而且能够通过一个软件集合维持一致的版本。
- 软件库(Repository) ROS依赖于共享开源代码与软件库的网站或主机服务,在这里不同的机构能够发布和分享各自的机器人软件与程序。
- ROS维基(ROS Wiki) ROS Wiki是用于记录有关ROS系统信息的主要论坛。任何人都可以注册账户、贡献自己的文件、提供更正或更新、编写教程以及其他行为。网址是http://wiki.ros.org/。
- Bug提交系统(Bug Ticket System)如果你发现问题或者想提出一个新功能,ROS提供这个资源去做这些。
- 邮件列表(Mailing list) ROS用户邮件列表是关于ROS的主要交流渠道,能够像论坛一样交流从ROS软件更新到ROS软件使用中的各种疑问或信息。网址是http://lists.ros.org/。
- ROS问答(ROS Answer)用户可以使用这个资源去提问题。网址是https://answers.ros.org/questions/。
- 博客(Blog)你可以看到定期更新、照片和新闻。网址是https://www.ros.org/news/,不过博客系统已经退休,ROS社区取而代之,网址是https://discourse.ros.org/。
现在处于学习的初级阶段,只是运行了ROS的内置案例,编写了简单的ROS实现,因此,受限于当前进度,不会详细介绍所有设计架构中的所有模块,当前只介绍文件系统与计算图,下一章会介绍 ROS 的通信机制,这也是ROS的核心实现之一。
ROS文件系统
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:
1 | WorkSpace --- 自定义的工作空间 |
ROS 文件系统中部分目录和文件前面编程中已经有所涉及,比如功能包的创建、src目录下cpp文件的编写、scripts目录下python文件的编写、launch目录下launch文件的编写,并且也配置了 package.xml 与 CMakeLists.txt 文件。其他目录下的内容后面教程将会再行介绍,当前我们主要介绍: package.xml 与 CMakeLists.txt 这两个配置文件。
1.package.xml
该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。请注意,该概念类似于旧版 rosbuild 构建系统中使用的manifest.xml文件。
1 |
|
2.CMakelists.txt
文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处。
1 | cmake_minimum_required(VERSION 3.0.2) #所需 cmake 版本 |
ROS文件系统相关命令
ROS 的文件系统本质上都还是操作系统文件,我们可以使用Linux命令来操作这些文件,不过,在ROS中为了更好的用户体验,ROS专门提供了一些类似于Linux的命令,这些命令较之于Linux原生命令,更为简介、高效。文件操作,无外乎就是增删改查与执行等操作,接下来,我们就从这五个维度,来介绍ROS文件系统的一些常用命令。
1.增
catkin_create_pkg 自定义包名 依赖包 === 创建新的ROS功能包
sudo apt install xxx === 安装 ROS功能包
2.删
sudo apt purge xxx ==== 删除某个功能包
3.查
rospack list === 列出所有功能包
rospack find 包名 === 查找某个功能包是否存在,如果存在返回安装路径
roscd 包名 === 进入某个功能包
rosls 包名 === 列出某个包下的文件
apt search xxx === 搜索某个功能包
4.改
rosed 包名 文件名 === 修改功能包文件
需要安装 vim
比如:rosed turtlesim Color.msg
5.执行
5.1roscore
roscore === 是 ROS 的系统先决条件节点和程序的集合, 必须运行 roscore 才能使 ROS 节点进行通信。
roscore 将启动:
- ros master
- ros 参数服务器
- rosout 日志节点
用法:
1 | roscore |
或(指定端口号)
1 | roscore -p xxxx |
5.2rosrun
rosrun 包名 可执行文件名 === 运行指定的ROS节点
比如:rosrun turtlesim turtlesim_node
5.3roslaunch
roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件
ROS计算图
1.计算图简介
前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph。
rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分。
2.计算图安装
如果前期把所有的功能包(package)都已经安装完成,则直接在终端窗口中输入
rosrun rqt_graph rqt_graph
如果未安装则在终端(terminal)中输入
1 | $ sudo apt install ros-<distro>-rqt |
请使用你的ROS版本名称(比如:kinetic、melodic、Noetic等)来替换掉
例如当前版本是 Noetic,就在终端窗口中输入
1 | $ sudo apt install ros-noetic-rqt |
3.计算图演示
接下来以 ROS 内置的小乌龟案例来演示计算图
首先,按照前面所示,运行案例
然后,启动新终端,键入: rqt_graph 或 rosrun rqt_graph rqt_graph,可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系。