ROS Group 产品服务
Product Service 开源代码库
Github 官网
Official website 技术交流
Technological exchanges 激光雷达
LIDAR ROS教程
ROS Tourials 深度学习
Deep Learning 机器视觉
Computer Vision
小强在群体机器人中的应用
-
ROS是一种分布式设计的通信框架,所以非常适合用来做群体机器人的研究。下面就简单介绍下如何用小强实现机器人集群的控制。
首先回顾一下ROS通信的基本结构
ROS的通信由
master
,node
组成。node
从master
获取其他node
的信息,然后再根据这些信息和其他node
建立连接。不同的node
并不要求在同一个机器人上。所以只要我们以一台电脑作为master,让其他机器人的node
都连接这个master
就可以实现机器人之间的通信了。我们不仅能获取到所有机器人的状态信息,也可以向任意一台机器人发送控制命令。每台机器人负责各自节点的计算,所以我们的
master
并不需要很多的计算资源。整个处理过程也是分布式的。master
只要做好调度计算就可以了。不仅如此,ROS还提供了很方便的工具方便我们对集群进行配置。下面就以小强为例,配置一个简单的集群。这个集群总共有两台电脑组成。一台作为集群的中心节点,也就是
master
,计算机名为nowhere
。另一台作为node
,计算机名xiaoqiang
。实际使用中node
可以有很多台。控制方式是完全一样的。整体的结构如下master(nowhere ip: 192.168.0.116) <----> node(xiaoqiang ip: 192.168.0.130)
现在假设我们要在
nowhere
上启动小强的system_monitor
。首先要保证网络的联通性,即xiaoqiang
和nowhere
要在同一个局域网下。由于ROS的node
间访问的时候使用的是计算机名,所以我们要在xiaoqiang
和nowhere
的hosts
文件中添加各自的ip。
打开小强的/etc/hosts
文件在其中添加如下内容192.168.0.116 nowhere 127.0.0.1 xiaoqiang-desktop
打开nowhere的
/etc/hosts
文件,在其中添加如下内容192.168.0.130 xiaoqiang-desktop 127.0.0.1 nowhere
在nowhere的工作空间中新建一个叫做
cluster_robots
的软件包。catkin_create_pkg cluster_robots rospy
然后在
cluster_robots
文件夹内创建一个launch文件夹cd cluster_robots mkdir launch
在launch文件夹内创建一个
cluster.launch
文件
文件内容如下<launch> <machine name="xiaoqiang" address="192.168.0.130" env-loader="/home/xiaoqiang/Documents/ros/devel/env.sh" user="xiaoqiang" password="xiaoqiang" /> <node machine="xiaoqiang" pkg="system_monitor" type="monitor.py" name="monitor"></node> </launch>
在这个launch文件中首先定义一个machine。这个machine中包含了小强的基本信息。
name 此机器人的名称,之后会用在node里面
address 此机器人的ip
env-loader 此机器人的环境变量设置脚本。指向你的工作空间中的devel/env.sh
user 此机器人的用户名,用于远程登录此计算机
password 此机器人的密码下面的
node
和正常的node
写法是一样的,差别在于增加了一个machine
标签。在这里指定这个节点运行在哪台机器上。下面就可以执行了
roslauch cluster_robots cluster.launch
不过你会遇到一些错误。我们要先把它们解决。
出现
Incompatible ssh peer
错误。这是因为一个库的版本太低了,输入下面的指令升级sudo pip install paramiko --upgrade
出现
is not in your SSH known_hosts file
这是由于ssh默认的加密方式和ROS的ssh库不一样。输入下面的命令ssh -oHostKeyAlgorithms='ssh-rsa' xiaoqiang@xiaoqiang-desktop # 在nowhere上输入 ssh -oHostKeyAlgorithms='ssh-rsa' nowhere # 在xiaoqiang上输入
在nowhere确认
ROS_MASTER_URI
的值,如果是http://localhost:11311
则要输入export ROS_MASTER_URI=http://nowhere:11311 # 注意nowhere是计算机名,要根据你自己的情况更改
最后在nowhere上运行
roslauch cluster_robots cluster.launch
终端输出如下
这时在nowhere上输入rostopic list终端的输出如下
可以看到已经有来自小强的topic了
这样我们就实现了
master
和node
之间的通信。按照这种方式可以继续添加多台小强。实际使用中情况要比这个例子复杂一些。比如如果有多台小强,由于每台小强的topic名称默认都是一样的,所以很有可能存在冲突的情况。这时候就要通过remap给topic重命名。或者采用相对的namespace的方式对topic进行命名。同时一个小强可能要启动很多的节点。这样使用launch文件进行管理的时候也要充分考虑文件组织的合理性。
采用这种方式启动小强的节点,小强上是没有master节点的。如果在小强上输入
rostopic list
就会提示无法和master通信。同时小强自己ROS_MASTER_URI
是不受影响的,仍然是http://xiaoqiang-desktop:11311
。但是在nowhere上通过launch文件启动的小强的节点是可以和nowhere的master进行通信的。同时也和nowhere共享同一个参数服务器。如果小强本地同时启动了一个master
,小强的master和nowhere的master是完全独立的。之间的topic数据也是不通的。