Note1: 本文主要讲了ROS-Industrial节点与Universal Robots UR5 (controller CB3)的通信过程。此过程在UR5中进行测试,当应用在UR10中也采用相同的过程。
需要前期准备的安装环境:
1. ROS kinetic系统
2. ROS-Industrial 的 universal_robot包
UR5机器人控制器的镜像版本是 3.0。
驱动兼容性
需要检查 universal_robot包的驱动和控制器的兼容性。
universal_robot包通过以太网连接与硬件进行通信,当建立连接的时候ROS-Industrial上传由URScript编写的程序,URScript是类似python的UR机器人自己的脚本语言。这段程序负责监听ROS-Industrial的 simple_messages 包发送的消息信息,并将这些消息解释成硬件指令。
我们不必明确了解安装在UR机器人上的所有与ROS-Industrial进行通信的程序
可以通过 apt-get (preferred) 命令,也可以用源码进行安装。参考 universal_robot包进行。
确保机器人控制器能够通过以太网进行通信。UR控制器的网络功能默认是关闭的。打开网络功能需要示教盒进行操作,操作步骤是Setup Robot -> Setup Network Menu (shown in the below attachment).
ping IP_OF_THE_ROBOT
如果没反应则检查错误。
launch文件可以用来启动描述机械臂的ur_description包。
注意:如果UR机器人控制器的版本在3.0及以上的,需要使用新的驱动包ur_modern_driver ,包中ur_Interface_Hardware源码文件中,需要把”->interface_hardware”改成”->type”。
一下命令用于ROS与UR机器人建立连接,需要把”IP_OF_THE_ROBOT”改成机器人控制器的IP地址。
roslaunch ur_modern_driver ur5_bringup.launch robot_ip:=IP_OF_THE_ROBOT [reverse_port:=REVERSE_PORT]
这时及以后就应该手在急停按钮附近了
在一个新终端里,就可以使用脚本语言控制机器人按照预定义的位置进行运动了
rosrun ur_driver test_move.py//可以试一下,没试过
设置moveit!节点:
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch
启动带有运动规划插件的 RViz
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
由于MoveIt!在 [−π,π] 范围内进行运动规划有困难,所以将关节约束在 [−π2,π2] 范围内,使用关节约束的版本的命令:
roslaunch ur_modern_driver ur5_bringup.launch limited:=true robot_ip:=IP_OF_THE_ROBOT [reverse_port:=REVERSE_PORT]
roslaunch ur5_moveit_config ur5_moveit_planning_execution.launch limited:=true
roslaunch ur5_moveit_config moveit_rviz.launch config:=true
有些时候操作机器人不方便,那么可以通过gazebo仿真学习
roslaunch ur_gazebo ur10.launch
roslaunch ur10_moveit_config ur10_moveit_planning_execution.launch sim:=true
roslaunch ur10_moveit_config moveit_rviz.launch config:=true
工业机器人是机器人中非常重要的一个部分,在工业领域应用广泛而且成熟,ROS迅猛发展的过程中,也不断渗入到工业领域,从而产生了一个新的分支——ROS-Industrial
从上边的架构我们可以看到,ROS-I在复用已有ROS框架、功能的基础上,针对工业领域进行了针对性的拓展,而且可以通用于不同厂家的机器人控制器。
这种架构的上层控制本身就是复用的已有的软件包,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来完成。