直接上代码:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time :2021/6/17 9:05
# @Author :weiz
# @ProjectName :pycharmProject
# @File :roboticArmControl.py
# @Description :
import socket
import struct
import math
def dataAnalysis(data):
"""
解析优傲机器人数据。注意这个跟机器的版本和型号有关
"""
# # 将机械臂返回值的保存到文件
# f = open('data.txt', 'a')
# f.write('\n'+str(data))
# f.close()
dic = {'MessageSize': 'i', 'Time': 'd', 'q target': '6d', 'qd target': '6d', 'qdd target': '6d', 'I target': '6d',
'M target': '6d', 'q actual': '6d', 'qd actual': '6d', 'I actual': '6d', 'I control': '6d',
'Tool vector actual': '6d', 'TCP speed actual': '6d', 'TCP force': '6d', 'Tool vector target': '6d',
'TCP speed target': '6d', 'Digital input bits': 'd', 'Motor temperatures': '6d', 'Controller Timer': 'd',
'Test value': 'd', 'Robot Mode': 'd', 'Joint Modes': '6d', 'Safety Mode': 'd', 'empty1': '6d',
'Tool Accelerometer values': '3d',
'empty2': '6d', 'Speed scaling': 'd', 'Linear momentum norm': 'd', 'SoftwareOnly': 'd', 'softwareOnly2': 'd',
'V main': 'd',
'V robot': 'd', 'I robot': 'd', 'V actual': '6d', 'Digital outputs': 'd', 'Program state': 'd',
'Elbow position': '3d', 'Elbow velocity': '3d'}
names = []
ii = range(len(dic))
for key, i in zip(dic, ii):
fmtsize = struct.calcsize(dic[key])
data1, data = data[0:fmtsize], data[fmtsize:]
fmt = "!" + dic[key]
names.append(struct.unpack(fmt, data1))
if key == "Tool vector target":
tcp_data = (float(struct.unpack(fmt, data1)[0]) * 1000, float(struct.unpack(fmt, data1)[1]) * 1000,
float(struct.unpack(fmt, data1)[2]) * 1000, float(struct.unpack(fmt, data1)[3]),
float(struct.unpack(fmt, data1)[4]), float(struct.unpack(fmt, data1)[5]))
dic[key] = dic[key], tcp_data
else:
dic[key] = dic[key], struct.unpack(fmt, data1)
return dic
def buildOrder(data):
"""
组建指令
"""
if data == '':
return ''
x1, x2, x3, x4, x5, x6 = data.split(' ')
order = '''
def endMovement():
movej(p[{},{},{},{},{},{}])
'''.format(float(x1) / 1000, float(x2) / 1000, float(x3) / 1000, x4, x5, x6)
return order
def connectS(host, port, buf):
"""
和服务端建立连接,进行通信
"""
while True:
inputData = input("请输入位置信息[x y z rx ry rz]或exit退出: ")
if inputData == "exit":
break
order = buildOrder(inputData)
# 只能按链接,接受数据并解析,发送数据,断开链接步骤进行,否则就会解析出错
addr = (host, port)
TCPSock = socket.socket()
TCPSock.connect(addr)
data = TCPSock.recv(buf)
dataDic = dataAnalysis(data)
print("机械臂末端坐标[毫米]及位姿[弧度]:", dataDic["Tool vector target"][1])
if order == '':
continue
TCPSock.send(order.encode("utf-8"))
TCPSock.close()
port = 30003
host = "192.168.207.128" # 机械臂的ip地址
buf = 1140 # 大于发送的数据长度即可
# 输入案例:594.53 430.99 819.97 4.209 1.270 -0.384
# 924.48 507.74 628.57 3.618 -1.531 0.824
if __name__ == "__main__":
connectS(host, port, buf)#!/usr/bin/env python
# -*- coding: ut