工业机器人是机器人中非常重要的一个部分,在工业领域应用广泛而且成熟,ROS迅猛发展的过程中,也不断渗入到工业领域,从而产生了一个新的分支——ROS-IndustrialROS-I)。

      ROS-I的官网: http://rosindustrial.org/

Capture

一、ROS-I的目标

  1. ROS强大的功能应用到工业生产的过程中;
  2. 为工业机器人的研究与应用提供快捷有效的开发途径;
  3. 为工业机器人创建一个强大的社区支持;
  4. 为工业机器人提供一站式的工业级ROS应用开发支持。

      ROS向工业领域的渗透,可以将ROS中丰富的功能、特性带给工业机器人,比如运动规划,运动学算法,视觉感知,还有rvizgazebo等工具,不仅降低了原本复杂严格的工业机器人研发门槛,而且在研发成本发面也具有极大的优势。

二、ROS-I的安装

在完整安装ROS之后,通过以下的命令就可以安装ROS-I了:

$ sudo apt-get install ros-indigo-industrial-core ros-indigo-open-industrial-ros-controllers

三、ROS-I的架构

clip_image004[4]

  1. GUI:上层UI分为两个部分:一个部分是ROS中现在已有的UI工具;另外一个部分是专门针对工业机器人通用的UI工具,不过是将来才会实现。
  2. ROS LayerROS基础框架,提供核心通讯机制
  3. MoveIt! Layer:为工业机器人提供规划、运动学等核心功能的解决方案
  4. ROS-I Application Layer:处理工业生产的具体应用,也是针对将来的规划
  5. ROS-I Interface Layer:接口层,包括工业机器人的客户端,可以通过 simple message协议与机器人的控制器通信
  6. ROS-I Simple Message Layer:通信层,定义了通信的协议,打包和解析通信数据
  7. ROS-I Controller Layer:机器人厂商开发的工业机器人控制器。

从上边的架构我们可以看到,ROS-I在复用已有ROS框架、功能的基础上,针对工业领域进行了针对性的拓展,而且可以通用于不同厂家的机器人控制器。

   

四、ROS-I控制UR机械臂

Universal Robots是丹麦的一家工业机器人制作商,主要的机器人产品有:UR3UR5UR10,分别针对不同的负载:

clip_image006[4]

我们以该机器人作为示例,看一下ROS-I的应用。

4.1 安装

   首先我们需要安装UR机器人的ROS功能包集。

$ sudo apt-get install ros-indigo-universal-robot

   该功能包集包含了UR仿真、运行需要的主要功能包:ur_description ur_driver ur_bringup ur_gazebo ur_msgsur10_moveit_config/ur5_moveit_config ur_kinematics

 

4.2 运行

安装完成后,使用下边的命令,我们就可以看到UR10的机器人模型了(第一次运行需要等待较长时间完成模型加载):

$ roslaunch ur_gazebo ur10.launch

    clip_image008[4]

然后我们让机械臂动起来,需要运行MoveIt运动规划的节点:

$ roslaunch ur10_moveit_config ur10_moveit_planning_execution.launch sim:=true

然后运行rviz

$ roslaunch ur10_moveit_config moveit_rviz.launch config:=true

clip_image010[4]

启动之后,我们可以看到rivz中的机器人模型和gazebo中的机器人模型应该是一样的姿态。在rviz中,我们可以用鼠标拖动机器人的终端,然后点击planning标签页中的plan nad execute就可以让机器人规划路径并且到达目标位置了,gazebo中的模型也会跟随变化。

clip_image012[4]

 4.3 分析

看到这里,也许我们会有一个疑问:这不就是MoveIt那一套东西么, 感觉和ROS-I并没有什么关系?再回头看ROS-I的架构,这种架构的上层控制本身就是复用的已有的软件包,ROS-I目前主要关注的是如何使用这些软件包来控制工业机械臂,也就是最下边的三层结构。我们把这三层从上到下分析一下:

首先是ROS-I Interface Layer层,这一层需要我们设计一个机器人的客户端节点,主要功能是完成数据从ROS到机械臂的转发,ROS-I为我们提供了许多编程接口,可以帮助我们快速开发,下图就是几个比较常用的API,具体API的使用说明可以查看官方文档。

clip_image014[5]

对于机械臂来讲,这里最重要的是 robot_state joint_trajectory robot_state包括很多状态信息,ROS-I都已经帮我们定义好了,可以去industrial_msgs包里看到消息的定义文件。joint_trajectory订阅了MoveIt规划出来的路径消息,然后打包发送给最下层的机器人服务器端。通常会把这一层的功能封装成robot_name_driver功能包,可以看ROS-IABBUR的机械臂都是这样的,可以参考他们的源码进行设计。

然后是ROS-I Simple Message Layer层,这一层主要是上下两层的通信协议。Simple Message这个协议是基于TCP的,上下层客户端和服务器端的消息交互,全部通过这一层提供的API进行打包和解析。具体使用方法可以参考http://wiki.ros.org/simple_message,也可以直接看ROS-I的源码:https://github.com/ros-industrial/industrial_core,主要实现SimpleSerializeTypedMessage两个类的功能即可。

最下层的ROS-I Controller Layer是厂家自己的控制器,考虑到实时性的要求,一般不会使用ROS,只要留出TCP的接口即可,接收到trajectory消息解析之后,就按照厂家自己的算法完成动作了。

可见,如果我们想要通过ROS-I来控制自己的机械臂,最下边的三层使我们需要实现的重点,上层运动规划部分可以交给ROS来完成。