ROS交流群
ROS Group
产品服务
Product Service
开源代码库
Github
官网
Official website
技术交流
Technological exchanges
激光雷达
LIDAR
ROS教程
ROS Tourials
深度学习
Deep Learning
机器视觉
Computer Vision

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


  • administrators

    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 多机通信