DAY3
1.需求
一个程序中可能需要启动多个节点,比如:ROS 内置的小乌龟案例,如果要控制乌龟运动,要启动多个窗口,分别启动 roscore、乌龟界面节点、键盘控制节点。如果每次都调用 rosrun 逐一启动,显然效率低下,如何优化?
官方给出的优化策略是使用 launch 文件,可以一次性启动多个 ROS 节点。
2.实现
-
选定功能包右击 ---> 添加 launch 文件夹
-
选定 launch 文件夹右击 ---> 添加 launch 文件 为xml文件
-
编辑 launch 文件内容
<launch>
<node pkg="helloworld" type="demo_hello" name="hello" output="screen" />
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
</launch>
Copy-
node ---> 包含的某个节点
-
pkg -----> 功能包
-
type ----> 被运行的节点文件
-
name --> 为节点命名
-
output-> 设置日志的输出目标
![]()
![]()
pkg 表示功能包的名称
-
-
运行 launch 文件
运行前要 source ./devel/setup.bash 刷新环境变量
roslaunch 包名(功能包的名字) launch文件名 -
运行结果: 一次性启动了多个节点
如果想在控制台输出,需要加上output="screen
<launch>
<node pkg="haha" type="oo" name="hello" output="screen" />
<node pkg="turtlesim" type="turtlesim_node" name="t1"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="key1" />
</launch>
1.5 ROS架构
到目前为止,我们已经安装了ROS,运行了ROS中内置的小乌龟案例,并且也编写了ROS小程序,对ROS也有了一个大概的认知,当然这个认知可能还是比较模糊并不清晰的,接下来,我们要从宏观上来介绍一下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/。
-
1.5.1 ROS文件系统
ROS文件系统级指的是在硬盘上ROS源代码的组织形式,其结构大致可以如下图所示:


WorkSpace --- 自定义的工作空间
|--- build:编译空间,用于存放CMake和catkin的缓存信息、配置信息和其他中间文件。
|--- devel:开发空间,用于存放编译后生成的目标文件,包括头文件、动态&静态链接库、可执行文件等。
|--- src: 源码
|-- package:功能包(ROS基本单元)包含多个节点、库与配置文件,包名所有字母小写,只能由字母、数字与下划线组成
|-- CMakeLists.txt 配置编译规则,比如源文件、依赖项、目标文件
|-- package.xml 包信息,比如:包名、版本、作者、依赖项...(以前版本是 manifest.xml)
|-- scripts 存储python文件
|-- src 存储C++源文件
|-- include 头文件
|-- msg 消息通信格式文件
|-- srv 服务通信格式文件
|-- action 动作格式文件
|-- launch 可一次性运行多个节点
|-- config 配置信息
|-- CMakeLists.txt: 编译的基本配置
1.package.xml
该文件定义有关软件包的属性,例如软件包名称,版本号,作者,维护者以及对其他catkin软件包的依赖性。请注意,该概念类似于旧版 rosbuild 构建系统中使用的manifest.xml文件。

2.CMakelists.txt
文件CMakeLists.txt是CMake构建系统的输入,用于构建软件包。任何兼容CMake的软件包都包含一个或多个CMakeLists.txt文件,这些文件描述了如何构建代码以及将代码安装到何处
python中
1.5.2 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 日志节点
用法:
roscore
Copy
或(指定端口号)
roscore -p xxxx
Copy
5.2rosrun
rosrun 包名 可执行文件名 === 运行指定的ROS节点
比如:rosrun turtlesim turtlesim_node
5.3roslaunch
roslaunch 包名 launch文件名 === 执行某个包下的 launch 文件
1.5.3 ROS计算图
原因:为啥要用计算图,查看不同节点的关系

1.计算图简介
前面介绍的是ROS文件结构,是磁盘上 ROS 程序的存储结构,是静态的,而 ros 程序运行之后,不同的节点之间是错综复杂的,ROS 中提供了一个实用的工具:rqt_graph。
rqt_graph能够创建一个显示当前系统运行情况的动态图形。ROS 分布式系统中不同进程需要进行数据交互,计算图可以以点对点的网络形式表现数据交互过程。rqt_graph是rqt程序包中的一部分。
2.计算图安装
如果前期把所有的功能包(package)都已经安装完成,则直接在终端窗口中输入
rosrun rqt_graph(包名) rqt_graph(节点名)
如果未安装则在终端(terminal)中输入
$ sudo apt install ros-<distro>-rqt
$ sudo apt install ros-<distro>-rqt-common-plugins
Copy
请使用你的ROS版本名称(比如:kinetic、melodic、Noetic等)来替换掉<distro>。
例如当前版本是 Noetic,就在终端窗口中输入
$ sudo apt install ros-noetic-rqt
$ sudo apt install ros-noetic-rqt-common-plugins
Copy
3.计算图演示
接下来以 ROS 内置的小乌龟案例来演示计算图
首先,按照前面所示,运行案例
然后,启动新终端,键入: rqt_graph 或 rosrun rqt_graph rqt_graph,可以看到类似下图的网络拓扑图,该图可以显示不同节点之间的关系。

9.17


浙公网安备 33010602011771号