背景介绍
目前,市面上大多数的拖动试教机器人是UR的协作机器人和DLR-KUKA的iiwa机器人,相比于UR机器人,iiwa机器人在结构上有一点重要的不同。
UR在每个关节上采取的是双编码器的方式,分别测量电机角度和连杆角度。而iiwa机器人在每个关节上还加入了一个单轴力矩传感器(一般位于减速器输出端与末端连杆间),用于测量每个关节的输出力矩。如图所示,iiwa在牵引拖动时表现更好,同时iiwa机器人拥有更小的运动盲区。用户可以施加更小的力就可以牵着机器人按其意图运动,而不会担心机械臂运动受限。
ROS API说明
以iiwa为代表的七轴机械臂在高精度的工作中有着很重要的应用,但是作为以java语言为驱动的机械臂,相较于以python为驱动的UR机械臂而言,其上手难度更高,难以去进行二次开发。之前常用的开发主要通过SunriseWorkbench等软件进行的开发。难以满足现有的分布式控制需求。为此也有很多人通过使用ROSjava来对iiwa机器人进行开发。但是ROSjava已在几年前停止了维护。为此本文尝试通过TCP+ROS+Python的搭建方法来满足机械臂的驱动需求。本文为KUKA-iiwa 智能机器人提供了应用程序编程接口(API)。来支持后续的iiwa开发工作。该API建立在KUKA iiwa内核安全性的基础上,可实现紧密的工作并与操作员进行交互。它将功能引入了机器人操作系统(ROS),后者提供了一个分布式开发环境,同时允许多种新的设备形式轻松地进行接口。
API架构
开发的API设计得很简单,通过TCP通讯建立出一套方便与ROS交互开发的平台。API体系结构侧重于突破通常在Smartpad上运行的KUKA Sunrise控制器中可用的功能。通过使用下图所示的通用结构,可以看到该体系结构扩展了KUKA LBR iiwa的功能。API公开了在机器网络上操作的接口。这允许在KUKA LBR iiwa的操作中轻松部署和利用不同的传感方法和额外的计算资源。
KUKA-iiwa的守护程序还处理一些低级但通用和关键的控制任务,例如碰撞检测。这样的操作可以给我们的二次开发提供基础的安全保障。ROS-KUKA节点也以Python脚本语言实现,通过订阅ROS节点来使KUKA守护程序和ROS主节点之间起到中间接口的作用。通过python订阅来自其他控制ROS节点的命令,并将它们传递给KUKA服务端。这样可以实现良好的外部扩展。同样,它从KUKA服务端接收感官和状态信息,并通过ROS将其其发布到python中。从而实现在计算机上不安装KUKA Sunrise OS即可外部运行此ROS-KUKA节点,这意味着无需修改KUKA Sunrise Cabinet。因此,保留了KUKA提供的安全协议,并且添加了功能而不是对其进行了更改。无需在Sunrise OS上安装第三方软件(例如ROS),只需使用基于标准Sunrise的应用程序就可以设置KUKA iiwa ROS接口。
下表列出了可通过API调用的ROS主题以读取KUKA-iiwa内部的参数
订阅主题名称 |
描述 |
例子 |
JointPosition [A1,A2,A3,A4,A5,A6,A7]time | 对应了iiwa7个自由度 |
JointPosition [0.0, 0.17, 0.0, 1.92, 0.0,0.35, 0.0] 1459253274.1 |
ToolPosition [X, Y, Z, A, B, C] time |
工具末端的位置以及三个旋转量 | ToolPosition [433.59711426170867,0.028881929589094864, 601.4449734558293,3.1414002368275726, 1.0471367465304213,3.141453681799645] 1459253274.11 |
ToolForce [X, Y, Z] time | 力模式施加的力 | ToolForce [13.485958070668463,0.3785658886199012, 5.964988607372689] 1459253274.11’ |
ToolTorque [A, B, C] time | 设置对应的三个扭矩参数 | ToolTorque [13.485958070668463, 0.3785658886199012, 5.964988607372689] 1459253274.11’ |
ToolTorque [A, B, C] time | joint关节加速度值 | JointAcceleration 0.4 1459253274.11’ |
JointVelocity Float time | joint关节速度值 | JointVelocity 1.0 1459253274.11’ |
JointVelocity Float time | joint关节速度值 | JointJerk 1.0 1459253274.11’ |
isCompliance Boolean time | 判断机器人状态是否符合规范 |
isCompliance off 1459253274.11’ |
isReadyToMove Boolean time | 判断机器人是否执行完所有步骤 | isReadyToMove true 1459253274.11’ |
isCollision Boolean time | 检测是否碰撞 |
isCollision false 1459253274.11’ |
isCollision Boolean time | 是否为主程序 | isMastered true 1459253274.11’ |
isJointOutOfRange Boolean time | 是否超出设定值范围 | isJointOutOfRange false 1459253274.11’ |
另外一个表列出了可通过字符串调用的ROS主题以向KUKA-iiwa发送指令
订阅主题名称 |
描述 |
例子 |
setJointAcceleration F | 设定/变更关节加速度值 |
’setJointAcceleration 0.4’ |
setJointVelocity F | 设定/更改关节速度值 | ’setJointVelocity 1.0’ |
setJointJerk F |
设置/更改关节Jerk速度值 | ’setJointJerk 1.0’ |
setPosition A1 A2 A3 A4 A5 A6 A7 ptp/lin | 根据关节位置移动机器人手臂。可以选择点对点(ptp)或线性(lin)运动。float类型的角度值(以度为单位)可以在A1-7中替换。如果不需要移动任何轴,可以使用-代替值。该示例为除A2不变的每个轴分配新位置。 | ’setPosition 0 21 0 -100 0 60 0 ptp’ |
setPositionXYZABC X Y Z A B C ptp/lin | 在机器人笛卡尔空间中移动机器人末端执行器。可以选择点对点(ptp)或线性(lin)运动。这会将机器人末端执行器移动到特定位置[x,y,z]方向[a,b,c](浮点中的值)。如果不需要更改任何参数,可以使用-代替值。 | ’setPositionXYZABC 700 0 290 - 180 0 -180 lin’ |
MoveXYZABC X Y Z A B C |
仅通过点对点(ptp)运动在机器人笛卡尔空间中移动机器人末端执行器。对于给定值(以毫米和度为单位),这会将机器人末端执行器沿特定方向[x,y,z]和/或方向[a,b,c]移动。 | MoveXYZABC 10 20 0 30 0 0 |
MoveCirc X1 Y1 Z1 A1 B1 C1 X2 Y2 Z2 A2 B2 C2 BlendingOri | 以给定的混合值将机器人末端执行器从第一个位置( [x1 y1 z1 a1 b1c1])的当前位置以弧形/圆周运动从其当前位置移动到第二个位置([x2y2 z2 a2 b2 c2]) 。 | MoveCirc 700 0 290 -180 0 -180 710 0 300 -180 0 -180 0.1 |
setCompliance X Y Z Z B C | 在每个x,y,z,a,b和c中具有特定刚度的情况下激活机器人的Compliance模式。给定的示例仅在x和y直角坐标系中以非常低的刚度激活Compliance。 | ’setCompliance 10 10 5000 300 300 300’ |
resetCompliance | 停用机器人的“合规性”模式 | ’resetCompliance’ |
resetCollision | 如果检测到任何碰撞,则重置碰撞 | ’resetCollision’ |
forceStop | 停止机器人并删除所有等待执行的机器人运动队列 | ’forceStop’ |
setWorkspace xmin ymin zmin xmax ymax zmax |
定义工作区边界 |
‘SetWorkspace 100 -300 0 600 300 500’ |
ROS环境搭建
.........详情请参考古月居文章