工业机器人是机器人中非常重要的一个部分,在工业领域应用广泛而且成熟,ROS迅猛发展的过程中,也不断渗入到工业领域,从而产生了一个新的分支——ROS-Industrial(ROS-I)。
ROS-I的官网: http://rosindustrial.org/
一、ROS-I的目标
- 将ROS强大的功能应用到工业生产的过程中;
- 为工业机器人的研究与应用提供快捷有效的开发途径;
- 为工业机器人创建一个强大的社区支持;
- 为工业机器人提供一站式的工业级ROS应用开发支持。
ROS向工业领域的渗透,可以将ROS中丰富的功能、特性带给工业机器人,比如运动规划,运动学算法,视觉感知,还有rviz,gazebo等工具,不仅降低了原本复杂严格的工业机器人研发门槛,而且在研发成本发面也具有极大的优势。
二、ROS-I的安装
在完整安装ROS之后,通过以下的命令就可以安装ROS-I了:
$ sudo apt-get install ros-indigo-industrial-core ros-indigo-open-industrial-ros-controllers
三、ROS-I的架构
- GUI:上层UI分为两个部分:一个部分是ROS中现在已有的UI工具;另外一个部分是专门针对工业机器人通用的UI工具,不过是将来才会实现。
- ROS Layer:ROS基础框架,提供核心通讯机制
- MoveIt! Layer:为工业机器人提供规划、运动学等核心功能的解决方案
- ROS-I Application Layer:处理工业生产的具体应用,也是针对将来的规划
- ROS-I Interface Layer:接口层,包括工业机器人的客户端,可以通过 simple message协议与机器人的控制器通信
- ROS-I Simple Message Layer:通信层,定义了通信的协议,打包和解析通信数据
- ROS-I Controller Layer:机器人厂商开发的工业机器人控制器。
从上边的架构我们可以看到,ROS-I在复用已有ROS框架、功能的基础上,针对工业领域进行了针对性的拓展,而且可以通用于不同厂家的机器人控制器。
四、ROS-I控制UR机械臂
Universal Robots是丹麦的一家工业机器人制作商,主要的机器人产品有:UR3、UR5和UR10,分别针对不同的负载:
我们以该机器人作为示例,看一下ROS-I的应用。
4.1 安装
首先我们需要安装UR机器人的ROS功能包集。
$ sudo apt-get install ros-indigo-universal-robot
该功能包集包含了UR仿真、运行需要的主要功能包:ur_description, ur_driver, ur_bringup, ur_gazebo, ur_msgs, ur10_moveit_config/ur5_moveit_config, ur_kinematics。
4.2 运行
安装完成后,使用下边的命令,我们就可以看到UR10的机器人模型了(第一次运行需要等待较长时间完成模型加载):
$ roslaunch ur_gazebo ur10.launch
然后我们让机械臂动起来,需要运行MoveIt运动规划的节点:
$ roslaunch ur10_moveit_config ur10_moveit_planning_execution.launch sim:=true
然后运行rviz:
$ roslaunch ur10_moveit_config moveit_rviz.launch config:=true
启动之后,我们可以看到rivz中的机器人模型和gazebo中的机器人模型应该是一样的姿态。在rviz中,我们可以用鼠标拖动机器人的终端,然后点击planning标签页中的plan nad execute就可以让机器人规划路径并且到达目标位置了,gazebo中的模型也会跟随变化。
4.3 分析
看到这里,也许我们会有一个疑问:这不就是MoveIt那一套东西么, 感觉和ROS-I并没有什么关系?再回头看ROS-I的架构,这种架构的上层控制本身就是复用的已有的软件包,ROS-I目前主要关注的是如何使用这些软件包来控制工业机械臂,也就是最下边的三层结构。我们把这三层从上到下分析一下:
首先是ROS-I Interface Layer层,这一层需要我们设计一个机器人的客户端节点,主要功能是完成数据从ROS到机械臂的转发,ROS-I为我们提供了许多编程接口,可以帮助我们快速开发,下图就是几个比较常用的API,具体API的使用说明可以查看官方文档。
对于机械臂来讲,这里最重要的是 robot_state和 joint_trajectory。 robot_state包括很多状态信息,ROS-I都已经帮我们定义好了,可以去industrial_msgs包里看到消息的定义文件。joint_trajectory订阅了MoveIt规划出来的路径消息,然后打包发送给最下层的机器人服务器端。通常会把这一层的功能封装成robot_name_driver功能包,可以看ROS-I中ABB和UR的机械臂都是这样的,可以参考他们的源码进行设计。
然后是ROS-I Simple Message Layer层,这一层主要是上下两层的通信协议。Simple Message这个协议是基于TCP的,上下层客户端和服务器端的消息交互,全部通过这一层提供的API进行打包和解析。具体使用方法可以参考http://wiki.ros.org/simple_message,也可以直接看ROS-I的源码:https://github.com/ros-industrial/industrial_core,主要实现SimpleSerialize和TypedMessage两个类的功能即可。
最下层的ROS-I Controller Layer是厂家自己的控制器,考虑到实时性的要求,一般不会使用ROS,只要留出TCP的接口即可,接收到trajectory消息解析之后,就按照厂家自己的算法完成动作了。
可见,如果我们想要通过ROS-I来控制自己的机械臂,最下边的三层使我们需要实现的重点,上层运动规划部分可以交给ROS来完成。