MG400 Dobot-TCP/IP-Python Arc reporting Inverse kinematics error


#1

Hello
I am trying to make use of the Arc and Circle functions in the python TCP/IP API as described below:
4.9 Arc

Function: Move from the current position to the target position in the Cartesian coordinate system by circular interpolation.

​ This instruction needs to be combined with other motion instructions to determine the starting point of the arc.

Format: Arc(X1,Y1,Z1,Rx1,Ry1,Rz1,X2,Y2,Z2,Rx2,Ry2,Rz2)

Number of parameters: 12

Support port: 30003

Detailed parameters: 12
parameter name 	type 	meaning
X1 	double 	Indicates the position of the X1 axis of the intermediate point of the arc, unit: mm
Y1 	double 	Indicates the Y1 axis position of the middle point of the arc, unit: mm
Z1 	double 	Indicates the position of the Z1 axis of the intermediate point of the arc, unit: mm
Rx1 	double 	Indicates the Rx1 axis position of the intermediate point of the arc, unit: degree
Ry1 	double 	Indicates the Ry1 axis position of the intermediate point of the arc, unit: degree
Rz1 	double 	Indicates the Rz1 axis position of the intermediate point of the arc, unit: degree
X2 	double 	Indicates the X2 axis position of the arc end point, unit: mm
Y2 	double 	Indicates the Y2 axis position of the end point of the arc, unit: mm
Z2 	double 	Indicates the Z2 axis position of the arc end point, unit: mm
Rx2 	double 	Indicates the Rx2 axis position of the arc end point, unit: degree
Ry2 	double 	Indicates the Ry2 axis position of the arc end point, unit: degree
Rz2 	double 	Indicates the Rz2 axis position of the arc end point, unit: degree

Example:

4.10 Circle

Function: Full circle movement, which needs to be combined with other motion instructions to complete the full circle movement.

Format: Circle(count,X1,Y1,Z1,Rx1,Ry1,Rz1,X2,Y2,Z2,Rx2,Ry2,Rz2)

Number of parameters: 13

Support port: 30003

Detailed parameter explanation: 13
parameter name 	type 	meaning
count 	int 	Number of whole circles
X1 	double 	X1 axis position, unit: mm
Y1 	double 	Y1 axis position, unit: mm
Z1 	double 	Z1 axis position, unit: mm
Rx1 	double 	Rx1 axis position, unit: degree
Ry1 	double 	Ry1 axis position, unit: degree
Rz1 	double 	Rz1 axis position, unit: degree
X2 	double 	X2 axis position, unit: mm
Y2 	double 	Y2 axis position, unit: mm
Z2 	double 	Z2 axis position, unit: mm
Rx2 	double 	Rx2 axis position, unit: degree
Ry2 	double 	Ry2 axis position, unit: degree
Rz2 	double 	Rz2 axis position, unit: degree

Example:

To replicate my test setup:
I am using a MG400 and the TCP-IP-Python API
In my coordinate system I am trying to do a half circle from 287, 56, 40XYZ with R being 0.
My middle point is 307, 76, 40XYZ with R being -90
My endpoint is 327, 56, 40XYZ with R being 180 or -180
As mentioned in Arc, it needs to be combined with a movement function to set the starting point of the arc so I start out by calling:
MovJ(287, 56, 40, 0, 0, 0)
Then run the Arc function with the given information:
Arc(307, 76, 40, -90, 0, 0, 327, 56, 40, -180, 0, 0)
As soon as the Arc command is sent to the controller, it goes into emergency mode followed by my DisableRobot command after five seconds.

I am not sure if this is an error, but according to the API and what I know about the coordinate system, it should be possible for the robot to perform this action.
Update: I can confirm that it works within DobotStudio2020 with the following LUA Script:
P={coordinate = {287,56,40,0}}
MovJ§
P1={coordinate = {307,76,40,-90}}
P2={coordinate = {327,56,40,-180}}
Arc(P1, P2)

I can also see that in DobotStudio2020 I get the error:
Inverse kinematics error with result outside of working area

Maybe there is something in the Rx, Ry, Rz conversion that goes wrong?


#2

There is a post on this here:

I was able to get Circle working by editing definion of Circle in dobot_api.py to have
string = “Circle({:d},{:f},{:f},{:f},{:f},{:f},{:f},{:f},{:f})”.format(count,x1,y1,z1,a1,x2,y2,z2,a2)

Does not seem to work for Arc though.