ROS(五)运行管理
文档维护:Arvin
网页部署:Arvin
▶
写在前面:本文旨在记录学习ROS过程中的一些重要知识概念和遇到的错误问题。主要参考赵虚左老师的ROS课程(第一个参考链接),由于赵老师用的noetic版本,而我用的是melodic版本,细节上可能会有所差异。
本章主要解决以下几个问题:
- 如何关联不同的功能包,繁多的ROS节点该如何启动?
- 功能包、节点、话题、参数重名时应该如何处理?
- 不同主机上的节点如何通信?
ROS元功能包
在ROS中,提供了一种方式可以将不同的功能包打包成一个功能包,当安装某个功能模块时,直接调用打包后的功能包即可,该包又称之为元功能包(metapackage)。
MwtaPackage是Linux的一个文件管理系统的概念。是ROS中的一个虚包,里面没有实质性的内容,但是它依赖了其他的软件包,通过这种方法可以把其他包组合起来,我们可以认为它是一本书的目录索引,告诉我们这个包集合中有哪些子包,并且应该去哪里下载。
ROS节点管理launch文件
概念
launch 文件是一个 XML 格式的文件,可以启动本地和远程的多个节点,还可以在参数服务器中设置参数。
作用
简化节点的配置与启动,提高ROS程序的启动效率。
roslaunch 命令执行launch文件时,首先会判断是否启动了 roscore,如果启动了,则不再启动,否则,会自动调用 roscore
launch文件标签
launch标签
<launch>
标签是所有 launch 文件的根标签,充当其他标签的容器
1.属性
-
deprecated = "弃用声明"
告知用户当前 launch 文件已经弃用
2.子级标签
所有其它标签都是launch的子级
node标签
1.属性
-
pkg=“包名”
节点所属的包
-
type=“nodeType”
节点类型(与之相同名称的可执行文件)
-
name=“nodeName”
节点名称(在 ROS 网络拓扑中节点的名称)
-
args=“xxx xxx xxx” (可选)
将参数传递给节点
-
machine=“机器名”
在指定机器上启动节点
-
respawn=“true | false” (可选)
如果节点退出,是否自动重启
-
respawn_delay=" N" (可选)
如果 respawn 为 true, 那么延迟 N 秒后启动节点
-
required=“true | false” (可选)
该节点是否必须,如果为 true,那么如果该节点退出,将杀死整个 roslaunch
-
ns=“xxx” (可选)
在指定命名空间 xxx 中启动节点
-
clear_params=“true | false” (可选)
在启动前,删除节点的私有空间的所有参数
-
output=“log | screen” (可选)
日志发送目标,可以设置为 log 日志文件,或 screen 屏幕,默认是 log
2.子级标签
- env 环境变量设置
- remap 重映射节点名称
- rosparam 参数设置
- param 参数设置
include标签
1.属性
-
file=“$(find 包名)/xxx/xxx.launch”
要包含的文件路径
-
ns=“xxx” (可选)
在指定命名空间导入文件
2.子级标签
- env 环境变量设置
- arg 将参数传递给被包含的文件
remap标签
1.属性
-
from=“xxx”
原始话题名称
-
to=“yyy”
目标名称
2.子级标签
- 无
param标签
1.属性
-
name=“命名空间/参数名”
参数名称,可以包含命名空间
-
value=“xxx” (可选)
定义参数值,如果此处省略,必须指定外部文件作为参数源
-
type=“str | int | double | bool | yaml” (可选)
指定参数类型,如果未指定,roslaunch 会尝试确定参数类型,规则如下:
- 如果包含 ‘.’ 的数字解析未浮点型,否则为整型
- “true” 和 “false” 是 bool 值(不区分大小写)
- 其他是字符串
2.子级标签
- 无
rosparam标签
1.属性
-
command=“load | dump | delete” (可选,默认 load)
加载、导出或删除参数
-
file=“$(find xxxxx)/xxx/yyy…”
加载或导出到的 yaml 文件
-
param=“参数名称”
-
ns=“命名空间” (可选)
2.子级标签
- 无
group标签
1.属性
-
ns=“名称空间” (可选)
-
clear_params=“true | false” (可选)
启动前,是否删除组名称空间的所有参数(慎用…此功能危险)
2.子级标签
- 除了launch 标签外的其他标签
arg标签
1.属性
-
name=“参数名称”
-
default=“默认值” (可选)
-
value=“数值” (可选)
不可以与 default 并存
-
doc=“描述”
参数说明
2.子级标签
- 无
ROS分布式通信
ROS是一个分布式计算环境。一个运行中的ROS系统可以包含分布在多台计算机上多个节点。根据系统的配置方式,任何节点可能随时需要与任何其他节点进行通信。因此,ROS对网络配置有某些要求:
- 所有端口上的所有机器之间必须有完整的双向连接。
- 每台计算机必须通过所有其他计算机都可以解析的名称来公告自己。
实现
准备
先要保证不同计算机处于统一网络中,最好分别设置固定IP,如果为虚拟机,需要将网络适配器改为桥接模式
配置文件修改
分别修改不同计算机的 /etc/hosts 文件,在该文件中加入对方的IP地址和计算机名:
主机端:
1 | 从机的IP 从机计算机名 |
从机端:
1 | 主机的IP 主机计算机名 |
设置完毕,可以通过``ping`命令检测网络通信是否正常。
IP地址查看名:ifconfig
计算机名称查看:hostname
配置主机IP
在 ~/.bashrc 中追加
1 | export ROS_MASTER_URI=http://主机IP:11311 |
配置从机IP
配置从机的 IP 地址,从机可以有多台,每台都做如下设置:
~/.bashrc 追加
1 | export ROS_MASTER_URI=http://主机IP:11311 |
测试
1.主机启动 roscore(必须)
2.主机启动订阅节点,从机启动发布节点,测试通信是否正常
3.反向测试,主机启动发布节点,从机启动订阅节点,测试通信是否正常
参考资料: