KUKA iiwa 机器人实时控制 – 3. 控制柜FRI JAVA程序
本文将对KUKA iiwa 控制柜 FRI JAVA程序进行介绍。
本教程其他文章请通过下面链接查看
KUKA iiwa 机器人实时控制 – 1. FRI通信硬件连接
KUKA iiwa 机器人实时控制 – 2. 基本环境配置
KUKA iiwa 机器人实时控制 – 3. 控制柜FRI JAVA程序
KUKA iiwa 机器人实时控制 – 4. 客户端FRI C++程序
测试平台
KUKA 机器人:KUKA iiwa 14
KUKA iiwa编程软件: Sunrise Workbench 1.7
KUKA iiwa 通信包: KUKA Sunrise.Connectivity FRI 1.7
操作系统:
- Windows 10 运行Sunrise Workbench软件
- Ubuntu 20.04 运行 FRI 客户端程序
1 FRI 位置控制JAVA例程
下面以KUKA提供的FRI关节位置控制程序LBRJointSineOverlay.java
为例进行介绍,该程序使关节在目标位置附近做正弦运动。该程序源代码以及其他FRI demo可以在 这里 下载。
程序要到导入到Sunrise Workbench中的JAVA工程进行编辑,关于如何构建JAVA工程可以参考KUKA iiwa 机器人实时控制 – 2. 基本环境配置,该文末尾参考链接部分包含使用Sunrise Workbench构建JAVA工程的详细介绍。
package com.kuka.connectivity.fri.example;
import static com.kuka.roboticsAPI.motionModel.BasicMotions.ptp;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import com.kuka.connectivity.fastRobotInterface.FRIConfiguration;
import com.kuka.connectivity.fastRobotInterface.FRIJointOverlay;
import com.kuka.connectivity.fastRobotInterface.FRISession;
import com.kuka.roboticsAPI.applicationModel.RoboticsAPIApplication;
import com.kuka.roboticsAPI.controllerModel.Controller;
import com.kuka.roboticsAPI.deviceModel.LBR;
/**
* Creates a FRI Session.
*/
public class LBRJointSineOverlay extends RoboticsAPIApplication
{
private Controller _lbrController;
private LBR _lbr;
private String _clientName;
@Override
public void initialize()
{
_lbrController = (Controller) getContext().getControllers().toArray()[0];
_lbr = (LBR) _lbrController.getDevices().toArray()[0];
// **********************************************************************
// *** change next line to the FRIClient's IP address ***
// **********************************************************************
//这里的 为FRI 客户端配置的IP地址,本教程将IP配置为 192.168.1.13
// _clientName = "127.0.0.1";
_clientName = "192.168.1.13";
}
@Override
public void run()
{
// configure and start FRI session
FRIConfiguration friConfiguration = FRIConfiguration.createRemoteConfiguration(_lbr, _clientName);
//配置通知频率,这里 5 表示通信间隔为 5ms
friConfiguration.setSendPeriodMilliSec(5);
getLogger().info("Creating FRI connection to " + friConfiguration.getHostName());
getLogger().info("SendPeriod: " + friConfiguration.getSendPeriodMilliSec() + "ms |"
+ " ReceiveMultiplier: " + friConfiguration.getReceiveMultiplier());
FRISession friSession = new FRISession(friConfiguration);
FRIJointOverlay jointOverlay = new FRIJointOverlay(friSession);
// wait until FRI session is ready to switch to command mode
try
{
//等待与客户端连接,等待时间设置为10s ,超时则退出程序
friSession.await(10, TimeUnit.SECONDS);
}
catch (final TimeoutException e)
{
getLogger().error(e.getLocalizedMessage());
friSession.close();
return;
}
getLogger().info("FRI connection established.");
// move to start pose
//连接成功后,不会立即接受来自FRI客户端的位置指令,而是先将关节运动到指定位置
_lbr.move(ptp(Math.toRadians(90), .0, .0, Math.toRadians(90), .0, Math.toRadians(-90), .0));
// async move with overlay ...
//moveAsync是异步运动模式,采用FRI控制iiwa建议优先考虑同步运动模式 move()
//addMotionOverlay(jointOverlay)意味着开始接受来自客户端的指令
_lbr.moveAsync(ptp(Math.toRadians(-90), .0, .0, Math.toRadians(90), .0, Math.toRadians(-90), .0)
.setJointVelocityRel(0.2)
.addMotionOverlay(jointOverlay)
.setBlendingRel(0.1)
);
// ... blending into sync move with overlay
//同步模式 接收来自客户端目标点数据,并实时控制关节移动
_lbr.move(ptp(Math.toRadians(90), .0, .0, Math.toRadians(90), .0, Math.toRadians(-90), .0)
.setJointVelocityRel(0.2)
.addMotionOverlay(jointOverlay)
);
// done
//通信结束
friSession.close();
}
/**
* main.
*
* @param args
* args
*/
public static void main(final String[] args)// 程序入口
{
final LBRJointSineOverlay app = new LBRJointSineOverlay();
app.runApplication();
}
}
2 代码分析
对于官方给出的demo,在关键语句处给出了注释,上述程序是演示程序,需要注意的是_clientName
一定要设置为运行FRI客户端程序的电脑IP地址。
通信端口号不设置的情况下,默认为30200,该值一般不需要修改。
如果我们需要机器人直接根据我们发送的关节角度进行运动,需要对代码进行修改。
将上述代码的_lbr.move(......)
以及_lbr.moveAsync(......)
删除,替换为
ctrMode= new PositionControlMode();//位置控制模式
// ctrMode为控制模式
// -1表示不限制函数运行时间,若设为正整数,则运行指定时间后退出函数
// TimeUnit.SECONDS表示时间单位为秒,可以设为其他单位
PositionHold posHold = new PositionHold(ctrMode, -1, TimeUnit.SECONDS);
_lbr.move(posHold.addMotionOverlay(jointOverlay));
addMotionOverlay( )
支持的控制模式包括:
(1)
PositionControlMode()
; //关节位置模式,实现关节精确定位
(2)JointImpedanceControlMode(200, 200, 200, 200, 200, 200, 200)
; //关节阻抗模式,关节具备柔性,可以提高安全性,需要设置刚度值,值越大刚度越强,这里的200属于偏小的值
(3)CartesianImpedanceControlMode()
; //笛卡尔阻抗模式
addMotionOverlay( )
支持的运动类型包括:
PTP
、LIN
、SPLINE
、PositionHold
PTP
在前面例程被使用,需要设置目标位置;PositionHold
基于机器人当前位置,根据客户端发来的关节角度运动,推荐使用该运动类型。
3 程序下载
上述程序编写完成,若编译器无错误提示,可以点击同步按钮,将程序下载至控制柜。
程序成功下载后,KUKA Smartpad 会显示可以运行的程序列表,点击LBRJointSineOverlay 进入程序准备运行页面。
初次执行程序前,建议将关节速度缩放比例调节至10% 以下,防止关节速度运行过快,发生危险!
使用钥匙旋钮将Smartpad模式设置为AUT
模式,返回程序,直接点击启动程序按钮,开始运行程序;
也可以在T1
模式运行,T1
模式下一直按住Smartpad背部的确认按钮,点击启动程序按钮开始执行程序,这种模式更加安全。
运行程序时,可能提示下面错误信息
这表示通信不成功,图中所示为IP地址设置错误,应该设为客户端的地址192.168.1.13
.
请在JAVA程序中修改IP地址,重新下载程序。
执行程序前可以使用ping指令检查网线连接是否正常。
如果IP地址和网线连接均没有问题,仍然提示失败,可能是因为客户端电脑还没有运行 FRI客户端程序。
控制柜FRI JAVA程序运行前,要先启动FRI 客户端的C++程序,下面将对客户端FRI C++程序进行介绍。
KUKA iiwa 机器人实时控制 – 4. 客户端FRI C++程序