CS Robot use MDH parameters to create models, the MDH parameter for each model can be found at: https://bbs.elibot.cn/forum/detail/topic/376.html
Users can use TCP/IP communication to obtain data from port 30001, the data contains MDH parameter for current robot.
To analysis the data from port 30001, please use the Robot State Message Chat that attached with the User manual, which can be download from the the following link:
https://drive.google.com/drive/folders/1ImbQzU5DomuCiMznPaauQsyDpmYew2_t
The following are some sample code. The robot comunicates with itself to obtain the MDH parameters.
It also uses the data to perfrom a forward kinematic calculation.
import socket
import struct
import time
HOST = "127.0.0.1" # The server's hostname or IP address
PORT = 30001 # The port used by the server
global a
global d
global alpha
global theta
a = [0, 0, 0, 0, 0, 0]
d = [0, 0, 0, 0, 0, 0]
alpha = [0, 0, 0, 0, 0, 0]
theta = [0, 0, 0, 0, 0, 0]
# CS Obtains MDH parameter
bFinish = False
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.connect((HOST, PORT))
while bFinish == False:
__buf = s.recv(4096)
#print(len(__buf))
if len(__buf) <= 0:
time.sleep(0.01)
while(len(__buf) > 0):
data_length = struct.unpack(">i", __buf[0:4])[0]
data_type = struct.unpack("B", __buf[4:5])[0]
#print(data_length, data_type)
data, __buf = __buf[0:data_length], __buf[data_length:]
if data_type == 16:
# MESSAGE_TYPE_ROBOT_STATE = 16
bFinish = True
sub_type = 0
data = data[5:data_length]
# Remove the head of the message at the first 5 bytes
while sub_type != 6:
#ROBOT_STATE_PACKAGE_TYPE_CONFIGURATION_DATA = 6
sub_length = struct.unpack(">i", data[0:4])[0]
sub_type = struct.unpack("B", data[4:5])[0]
data1, data = data[0:sub_length], data[sub_length:]
curr_data_add = 5+32*6+40
for i in range(0, 6):
a[i] = struct.unpack(
">d", data1[curr_data_add:curr_data_add+8])[0]
curr_data_add = curr_data_add+8
for i in range(0, 6):
d[i] = struct.unpack(
">d", data1[curr_data_add:curr_data_add+8])[0]
curr_data_add = curr_data_add+8
for i in range(0, 6):
alpha[i] = struct.unpack(
">d", data1[curr_data_add:curr_data_add+8])[0]
curr_data_add = curr_data_add+8
for i in range(0, 6):
theta[i] = struct.unpack(
">d", data1[curr_data_add:curr_data_add+8])[0]
curr_data_add = curr_data_add+8
def mdh2pose(a,alpha,d,theta):
# Rx(alpha) * Dx(a) * Rz(theta) * Dz(d)
pose = [0, 0, 0, 0, 0, 0]
pose[0] = a
pose[3] = alpha
pose = pose_trans(pose, [0, 0, 0, 0, 0, theta])
pose = pose_trans(pose, [0, 0, d, 0, 0, 0])
return pose
end
def ForwardKinCal(c_joint):
# Input angle to calculate Position in Cartesian Coordinate refer to base of the robot by forward kinematics
out = [0,0,0,0,0,0]
for i in range(0,6):
out = pose_trans(out,mdh2pose(a[i], alpha[i], d[i], theta[i]+c_joint[i]))
return out
# Returns the pose of the flange
global c_pose
# Unit for xyz are in m,Unit for rpy are in radian
global c_pose1
# Unit for xyz are in mm,Unit for rpy are in degrees
joint = get_actual_joint_positions()
c_pose = ForwardKinCal(joint)
c_pose1=[c_pose[0]*1000,c_pose[1]*1000,c_pose[2]*1000,c_pose[3]/3.14159*180,c_pose[4]/3.14159*180,c_pose[5]/3.14159*180]
The calculated result for c_pose1 matches with the actual result displaying in Tool Position