我编写了下面的MATLAB代码,从UR5的TCP / IP 30003端口读取一些数据流。我得到的结果与我的机器人上的结果不同(I我正在使用URSim 3.5.3虚拟环境)但它假设是相同的。虽然它看起来很接近,因为有6个数据符合预期。
我相信这是可能的,因为有人使用python实现它http://www.zacobria.com/universal-robots-knowledge-base-tech-support-forum-hints-tips/knowledge-base/client-interfaces-cartesian-matlab-data/,但我被指示使用MATLAB。
MATLAB代码
clear all
HOST = '192.168.56.101';
PORT_30003 = 30003;
while (true)
s = tcpclient(HOST, PORT_30003);
disp('connected and starting program');
disp('data received:');
data = read(s, 80, 'double');
disp(data(56:61));
pause(1);
end
获得的结果:
>> ur5
connected and starting program
data received:
1.0e-15 *
-0.4406 0.0000 -0.0000 0.0000 0.0000 -0.0000
connected and starting program
data received:
1.0e-15 *
-0.4406 0.0000 -0.0000 0.0000 0.0000 -0.0000
由于机器人没有移动但与我的机器人中的值非常不同,因此持续相同。第一行是笛卡尔坐标(X,Y,Z,RX,RY,RZ),但运行程序时机器人的值为:-120.11mm,-431.76mm,146.07mm,0.0012, - 3.1664,-0.0395,第二个用于Gripper状态(X,Y,Z,RX,RY,RZ)。有人知道这是否是转换问题?我该如何纠正呢?
答案 0 :(得分:0)
Universal Robots Matlab接口(实时客户端/端口30003)发送数据包结构数据:
int LENGTH
double PAYLOAD_0
double PAYLOAD_1
double ...
double PAYLOAD_n
长度可能因软件版本而异,因此建议先读取长度,然后读取剩余的双倍值。如果您没有读取包的完整长度,则输入缓冲区中可能会有一些“最后一个包的剩余部分”,然后您阅读的下一个包将是无意义的。
因此,我建议阅读长度,缓冲剩余的包,然后提取感兴趣的包。
length = read(s, 1, 'int64')
payload = read(s, length, 'double')
disp(payload(x:y))
您可以找到UR TCP interfaces here的官方文档。 请注意,端口30003接口有时会扩展,最后会有新的变量。双打的完整长度应该是139双打。