小强在群体机器人中的应用

原链接

ROS是一种分布式设计的通信框架,所以非常适合用来做群体机器人的研究。下面就简单介绍下如何用小强实现机器人集群的控制。

首先回顾一下ROS通信的基本结构

0_1506414335562_Screenshot from 2017-09-26 16-25-15.png

ROS的通信由master, node组成。nodemaster获取其他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。首先要保证网络的联通性,即xiaoqiangnowhere要在同一个局域网下。由于ROS的node间访问的时候使用的是计算机名,所以我们要在xiaoqiangnowherehosts文件中添加各自的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

终端输出如下
0_1506425004656_Screenshot from 2017-09-26 19-22-50.png

这时在nowhere上输入rostopic list终端的输出如下

0_1506425071329_Screenshot from 2017-09-26 19-24-24.png

可以看到已经有来自小强的topic了

这样我们就实现了masternode之间的通信。按照这种方式可以继续添加多台小强。

实际使用中情况要比这个例子复杂一些。比如如果有多台小强,由于每台小强的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数据也是不通的。

参考资料
ROS 基本概念
ROS Wiki: roslaunch machine
ROS 多机通信

猜你喜欢

转载自blog.csdn.net/bluewhalerobot/article/details/79649699