Difference between revisions of "Robot Kinematics Models"

From SoftMC-Wiki
Jump to: navigation, search
(Introduction)
(Added a comment about default point type)
 
(75 intermediate revisions by 6 users not shown)
Line 1: Line 1:
 +
{{Languages|Robot_Kinematics_Models}} <div class="noprint" id="BackToTop" style="background-color:; position:fixed; bottom:32px; left:95%; z-index:9999; padding:0; margin:0;">
 +
&nbsp;
 +
<span style="color:blue; font-size:8pt; font-face:verdana,sans-serif; border:0.2em outset:#ceebf7; padding:0.1em; font-weight:bolder; -moz-border-radius:8px;">[[File:TOP2.png|50px|TOP2.png|link=#top]]</span></div>
 
= Introduction =
 
= Introduction =
This document has been written in accordance to the Kinematics proposal document received as an additional development request for the AMCS firmware. Following the proposal, this document is divided according to the development phases:
 
  
+
This document was written in accordance to the Kinematics proposal document received as an additional development request. <!-- Following the proposal, this document is divided according to the development phases: -->
* PUMA Kinematics
 
* DELTA Kinematics
 
* Tool, base and compound operator
 
  
The three parts of the document will be incrementally added.
+
*PUMA Kinematics
 +
*DELTA Kinematics
 +
*Tool, base and compound operator
  
 +
New kinematics models of PUMA and DELTA robots are made always keeping what has been implemented for SCARA robots. Therefore if not explicitly stated different, all robotics features that were developed and implemented for the SCARA model will be available for the two models also. Therefore all the capabilities, methods and definitions of the features are common to all three models. The common robotics features for the above robots are:
  
New kinematics models of PUMA and DELTA robots are made always keeping what has been implemented for SCARA robots. Therefore if not explicitly stated different, all robotics features that ware developed and implemented for the SCARA model will be available for the two models also. Therefore all the capabilities, methods and definitions of the features are common to all three models. The common robotics features for the above robots are:
+
*Straight-line motion
 +
*Circular movements
 +
*VIA (Pass-Through) movements.  
 +
*Continuous-Path – blending.  
 +
*Conveyor tracking (Moving Frames).  
  
 +
These features are not described in this document.
  
* Straight-line motion
+
&nbsp;
* Circular movements
 
* VIA (Pass-Through) movements.
 
* Continuous-Path – blending.
 
* Conveyor tracking (Moving Frames).
 
 
 
These features will be not described in this document.
 
  
 
= Overview =
 
= Overview =
This document describes a general kinematics implementation based on the AMCS system version 2.1.6. In addition to the built in SCARA kinematics the following new kinematics models are added:
 
 
 
* PUMA kinematics of classical PUMA robots of 6 degrees of freedom.
 
* DELTA kinematics of DELTA parallel robots of 4 degrees of freedom.
 
* USER kinematics for general user-defined robot kinematics of up-to 6 DOF systems.
 
 
First a general description of coordinate systems and location definitions will be given for all types of robot kinematics. Each robot type will be described separately in the following order:
 
 
 
PUMA robot specific will be given
 
 
 
DELTA robot specifics will be given.
 
 
 
General USER robot specific will be given.
 
  
 +
This document describes a general kinematics implementation in the softMC system with the following kinematics models (and growing):
  
At the end different types of user frames will be given (tool, world, base, machine, …).
+
*SCARA kinematics of '''4''' degrees of freedom.
 +
*PUMA kinematics of classical PUMA robots of '''6''' degrees of freedom.
 +
*DELTA kinematics of DELTA parallel robots of '''4''' degrees of freedom.
 +
*TARM kinematics of SpeedPicker robots of '''4''' degrees of freedom.
 +
*USER kinematics for general user-defined robot kinematics of up-to '''6''' DOF systems.  
  
  
 
== Definitions ==
 
== Definitions ==
  
* '''DOF''' – “degrees of freedom” of a robot, usually a number of motors in the robot.
+
*'''DOF''' – “degrees of freedom” of a robot. In a serial robot it is usually the same as the&nbsp;number of motors in the robot.  
  
* '''DH''' – Denavit Hartenberg parameters of robot describing robot geometry set of (θ<sub> i</sub>, α<sub> i</sub>, a<sub>i</sub>, d<sub>i</sub>) numbers for each robot segment.
+
*'''DH''' – Denavit Hartenberg parameters of the robot describing robot geometry set of (θ<sub>i</sub>, α<sub>i</sub>, a<sub>i</sub>, d<sub>i</sub>) numbers for each robot segment.  
  
* '''“Tool-Center-Point” - '''point in the middle of the last robot segment. Initially in the center of the sixth segment flange if a gripper is mounted it coordinates are displaced by the tool property (will be described in phase 3).
+
*'''“Tool-Center-Point (TCP)” - '''point on the last robot segment. By default it is in the center of the&nbsp;flange to which&nbsp;a gripper is mounted. Its coordinates can be&nbsp;displaced by the tool property as&nbsp;described below.  
  
* In the whole of the document we use term “'''point'''” for a vector describing position and orientation of the robot’s tool center. Depending on the robot type the point can be element of different vector spaces (two, three or six dimensional).  
+
*In the whole of this&nbsp;page we use term “'''point'''” for a vector describing the position and orientation of the robot’s TCP. The first part if this vector contains the cartesian coordinates of the TCP, while the second part describes its orientation. Depending on the robot type, the point can be an element of different vector spaces (such as two, three,&nbsp;six dimensional).  
  
* A '''“location”''' is AMCS data-type containing cartesian coordinates of a point.  
+
*A '''“location”''' is a softMC data-type containing cartesian coordinates of a point.  
  
* A '''“joint location”''' or '''“joint” '''is AMCS data-type containing joint coordinates of a point.
+
*A '''“joint location”''' or '''“joint” '''is a softMC data-type containing joint coordinates of a point.
  
 
= Coordinates Systems =
 
= Coordinates Systems =
== Cartesian coordinates and Euler Angles ==
 
In this section a method of robot point definition is shown. The presented method is given for a six-dimensional space defining both position and orientation, each having three degrees of freedom. For systems with more or less dimensions other coordinates systems will be used.
 
  
  
Each robot type is described with different group model. This is expressed in AMCS Basic-Moves language in two domains. One is when the group is defined, and then the different model values are used. The other issue is the use of location or joint robot-type with a dedicated token values (XYZ, XYZR, …). Each robot (group) model has different robot type depending on the number of axes and the model value:
+
== Cartesian coordinates and Euler Angles ==
  
 +
In this section a method of robot point definition is shown. The presented method is given for a six-dimensional space defining both position and orientation, each having three degrees of freedom. For systems with more or less dimensions other coordinates systems will be used.
  
 +
Each robot is defined by two properties. The first is the group model (SCARA, PUMA, DELTA, etc.). The actual robot model of a group can be queried using the [[MC-Basic:robot.TYPEOF|TYPEOF]] property. The second property is the point type. A robot of a specific model might have several available point types. For example, the SCARA robot (model = 4) has two point types: XYZ and XYZR. If the point type is not declared when the robot is defined, its default point type will be used (written in bold text in the table below). Whenever a motion is issued for a particular robot, its appropriate point type must be used.
  
{| style="border-spacing:0;"
+
The following table lists the available robot models and their point types: &nbsp; {{robot_model_table}}
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Robot:'''
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''robot-type token'''
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Model value used in group definition:'''
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Number of axes'''
 
  
|-
+
== Examples ==
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''SCARA'''
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>XYZR</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>4</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>4</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''PUMA'''
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>XYZYPR</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>2</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>6</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''DELTA'''
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>XYZR</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>6</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>4</center>
 
|}
 
 
 
==Examples:==
 
 
 
 
 
===PUMA robot is defined by:===
 
  
 +
=== PUMA robot definition ===
  
 
'''common shared ''puma'' as group axnm = a1 axnm = a2 axnm = a3 axnm = a4 axnm = a5 axnm = a6 model = 2'''
 
'''common shared ''puma'' as group axnm = a1 axnm = a2 axnm = a3 axnm = a4 axnm = a5 axnm = a6 model = 2'''
  
 +
A location of PUMA robot: '''common shared ''lct'' as location of XYZYPR'''
  
A location of PUMA robot is defined by:
 
 
 
'''common shared ''lct'' as location of XYZYPR'''
 
 
 
===DELTA robot is defined by:===
 
  
 +
=== DELTA robot definition: ===
  
 
'''common shared ''delta'' as group axnm = a1 axnm = a2 axnm = a3 axnm = a4 model = 6'''
 
'''common shared ''delta'' as group axnm = a1 axnm = a2 axnm = a3 axnm = a4 model = 6'''
  
 +
A location of DELTA robot (with default point type XYZR): '''common shared ''lct'' as location of XYZR'''
  
A location of DELTA robot is defined by:
+
&nbsp;
 
 
 
 
'''common shared ''lct'' as location of XYZR'''
 
  
 +
=== XYZYPR vs. XYZR ===
  
 
The XYZYPR token for PUMA stands for: X-Y-Z-Yaw-Pitch-Roll coordinates and the XYZR for SCARA and DELTA robots stands for X-Y-Z-Roll. In both cases the roll angle defines the same thing - it is the angle of rotation about Z-axis. This is to be remembered later when the compound operator is defined then the following relation is true:
 
The XYZYPR token for PUMA stands for: X-Y-Z-Yaw-Pitch-Roll coordinates and the XYZR for SCARA and DELTA robots stands for X-Y-Z-Roll. In both cases the roll angle defines the same thing - it is the angle of rotation about Z-axis. This is to be remembered later when the compound operator is defined then the following relation is true:
  
 +
&nbsp;
  
<center>'''X,Y,Z, ,Roll corresponds to X,Y,Z,Roll with Yaw & Pitch equals zero.'''</center>
+
'''X,Y,Z, ,Roll corresponds to X,Y,Z,Roll with <u>Yaw & Pitch equals zero.</u>'''
 
 
  
 
Cartesian coordinates describe robot locations defining position and orientation of the declared robot tool center point. A location can be expressed in at least three ways representing all 6 degrees of freedom encountered in the cartesian space:
 
Cartesian coordinates describe robot locations defining position and orientation of the declared robot tool center point. A location can be expressed in at least three ways representing all 6 degrees of freedom encountered in the cartesian space:
  
 +
&nbsp;
  
* X Y Z Yaw Pitch Roll
+
*X Y Z Yaw Pitch Roll  
* Homogenous transformation matrix  
+
*Homogenous transformation matrix  
* X Y Z Quaternion
+
*X Y Z Quaternion  
  
 
Common to all methods is the duality between location and transformation. Note that cartesian location gives coordinates of the tool center point which can be always interpreted as a transformation form the WORLD base point (space origin) to the tool center point.
 
Common to all methods is the duality between location and transformation. Note that cartesian location gives coordinates of the tool center point which can be always interpreted as a transformation form the WORLD base point (space origin) to the tool center point.
  
==XYZ Yaw Pitch Roll==
+
== XYZ Yaw Pitch Roll ==
 
 
This coordinates representation is mostly used in robotics. The AMCS system uses it for user-related inputs and outputs (constant assignments and prints).
 
 
 
 
 
* '''3''' degrees of freedom in translation (X, Y, Z) expressed in mm, defining the position of the tool center point relative to the robot base.
 
 
 
* ''' 3''' degrees of freedom in rotation (yaw, pitch and roll defined below) expressed in degrees, defining the orientation of the tool tip. Yaw, Pitch, and Roll are the modified Euler angles and correspond to the sequential rotations around Z, Y, Z axes respectively.
 
 
 
===Yaw Definition===
 
 
 
[[Image:AXY;YawDefinition.png]]''Yaw definition ''
 
 
 
 
 
Yaw is rotation around the Z-axis in relation to the previous frame. The previous frame is the starting coordinate system we are rotating. The figure illustrates a yaw rotation of 30°. Rotation about the Yaw angle yields new coordinate system (X<sub>1</sub>, Y<sub>1</sub>, Z<sub>1</sub>).
 
  
 +
This coordinates representation is mostly used in robotics. The softMC system uses it for user-related inputs and outputs (constant assignments and prints).
  
===Pitch Definition===
+
&nbsp;
  
[[Image:AXY;PitchDefinition.png]]''Pitch definition ''
+
*'''3''' degrees of freedom in translation (X, Y, Z) expressed in mm, defining the position of the tool center point relative to the robot base.
  
 +
*'''3''' degrees of freedom in rotation (yaw, pitch and roll defined below) expressed in degrees, defining the orientation of the tool tip. Yaw, Pitch, and Roll are the modified Euler angles and correspond to the sequential rotations around Z, Y, Z axes respectively.
  
Pitch is rotation around the Y-axis in relation to the previous frame '''after yaw rotation''' has been applied. It means the rotation is made around newly obtained Y<sub>1</sub> axis. The figure below illustrates a pitch rotation of 40°. Rotation about the Pitch angle yields new coordinate system (X<sub>2</sub>, Y<sub>2</sub>, Z<sub>2</sub>).
+
&nbsp;
  
 +
<gallery heights="250px" widths="250px">
 +
Image:AXY;YawDefinition.png| ''Yaw definition ''<br> Yaw is rotation around the Z-axis in relation to the previous frame. The previous frame is the starting coordinate system we are rotating. The figure illustrates a yaw rotation of 30°. Rotation about the Yaw angle yields new coordinate system (X<sub>1</sub>, Y<sub>1</sub>, Z<sub>1</sub>).
 +
Image:AXY;PitchDefinition.png|''Pitch definition ''Pitch is rotation around the Y-axis in relation to the previous frame '''after yaw rotation''' has been applied. It means the rotation is made around newly obtained Y<sub>1</sub> axis. The figure above illustrates a pitch rotation of 40°. Rotation about the Pitch angle yields new coordinate system (X<sub>2</sub>, Y<sub>2</sub>, Z<sub>2</sub>).
 +
Image:AXY;RollDefinition.png|''Roll Definition '' Roll is rotation around the Z-axis in relation to the previous frame, after the '''yaw and pitch''' rotations have been applied. It means the Roll rotation is around Z<sub>2</sub> axis. The figure above illustrates a roll rotation of 20°. Rotation about the Roll angle yields new coordinate system (X<sub>3</sub>, Y<sub>3</sub>, Z<sub>3</sub>).
 +
</gallery>
  
===''Roll definition''===
+
{{Note|Note that the order of the yaw, pitch and roll sequence is important!}}
  
[[Image:AXY;RollDefinition.png]]
+
== Homogenous Transformation Matrix: ==
  
Roll is rotation around the Z-axis in relation to the previous frame, after the '''yaw and pitch''' rotations have been applied. It means the Roll rotation is around Z<sub>2</sub> axis. The figure below illustrates a roll rotation of 20°. Rotation about the Roll angle yields new coordinate system (X<sub>3</sub>, Y<sub>3</sub>, Z<sub>3</sub>).
+
This method of location representation is not used internally or in a user interface of the softMC but it is mostly used in the robotics literature. Therefore the representation is given in this document for demonstration and explanation purposes only. Location variable is represented as a (4 X 4) matrix:
 
 
 
 
Remark: Note that the order of the yaw, pitch and roll sequence is important!
 
 
 
==Homogenous Transformation Matrix:==
 
 
 
 
 
This method of location representation is not used internally or in a user interface of the AMCS but it is mostly used in the robotics literature. Therefore the representation is given in this document for demonstration and explanation purposes only. Location variable is represented as a (4 X 4) matrix:
 
 
 
 
 
''loc'' = [[Image:AXY;HMatrix.png]]
 
  
 +
''loc'' = [[File:AXY;HMatrix.png|RTENOTITLE]]
  
 
Where: x<sub>x_axis</sub>, y<sub>x_axis</sub>, z<sub>x_axis</sub> are normalized values defining the change of the x axis in relation to its initial position, etc ...
 
Where: x<sub>x_axis</sub>, y<sub>x_axis</sub>, z<sub>x_axis</sub> are normalized values defining the change of the x axis in relation to its initial position, etc ...
Line 183: Line 125:
 
The last line (0 0 0 1) is used for normalization.
 
The last line (0 0 0 1) is used for normalization.
  
 +
&nbsp;
  
 
+
=== Example 1 ===
 
 
===Example1 :===
 
  
 
  ''if loc coordinates are ''{100, 80, 150, 45, 0, 0}
 
  ''if loc coordinates are ''{100, 80, 150, 45, 0, 0}
  
''loc'' written as a transformation matrix will be :
+
''loc'' written as a transformation matrix will be&nbsp;:
  
 +
''loc'' = [[File:AXY;HomogenousMatrix.png|RTENOTITLE]]
  
''loc'' = [[Image:AXY;HomogenousMatrix.png]]
+
as there is only 45° of yaw rotation (rotation around Z axis) as it is illustrated.
  
 +
The normal softMC system representation in programs is the {X,Y,Z, Yaw, Pitch, Roll} format. The homogenous matrix transformation is used here only for illustration purposes.
  
as there is only 45° of yaw rotation (rotation around Z axis) as it is illustrated.
+
&nbsp;
  
 +
== X Y Z Q (quaternions) ==
  
The normal AMCS system representation in programs is the {X,Y,Z, Yaw, Pitch, Roll} format. The homogenous matrix transformation is used here only for illustration purposes.
+
*<nowiki>3 degrees of freedom in translation (X, Y, Z) expressed in mm, defining the position of the tool center point relative to the robot base.</nowiki>
  
==X Y Z Q (quaternions)==
 
  
* <nowiki>3</nowiki> degrees of freedom in translation (X, Y, Z) expressed in mm, defining the position of the tool center point relative to the robot base.
+
*<nowiki>3 degrees of freedom in rotation, expressed using the normalized quaternion Q described as a rotation around vector n for the angle phi:</nowiki>
* <nowiki>3</nowiki> degrees of freedom in rotation, expressed using the normalized quaternion Q described as a rotation around vector '''''n''''' for the angle '''''phi''''': '''<nowiki>[cos(phi/2), sin(phi/2)*n]</nowiki>'''
 
  
  
The quaternion rotation presentation is used internally by the system but is not directly available for the user. However in cases of user-kinematics, this must be taken into account. The quaternions are used only for illustration purposes, the AMCS system uses Euler angles for all user inputs and outputs.
+
&nbsp;
 +
<nowiki>[cos(phi/2), sin(phi/2)*n]</nowiki>
  
==Joint coordinates==
+
The quaternion rotation presentation is used internally by the system but is not directly available for the user. However in cases of user-kinematics, this must be taken into account. The quaternions are used only for illustration purposes, the softMC system uses Euler angles for all user inputs and outputs.
  
 +
== Joint coordinates ==
  
 
For joint coordinates, a location variable is defined by '''''n''''' components representing the values in degrees (or mm) of each axis (n-number degrees of freedom according to the zero position of the kinematics model.
 
For joint coordinates, a location variable is defined by '''''n''''' components representing the values in degrees (or mm) of each axis (n-number degrees of freedom according to the zero position of the kinematics model.
 
  
 
A location in joint coordinates is an array of n joint values:
 
A location in joint coordinates is an array of n joint values:
  
 +
&nbsp;
  
''Jnt_loc'' = {jnt1, jnt2, jnt3, jnt4, jnt5, jnt6}
+
''Jnt_loc'' = {jnt1, jnt2, jnt3, jnt4, jnt5, jnt6}
 
 
 
 
Individual coordinates can be accessed via index definition in the form {i}: Jnt_loc{1}, Jnt_loc{2}, …
 
  
 +
Individual coordinates can be accessed via index definition in the form {i}: '''Jnt_loc{1}, Jnt_loc{2}, …'''
  
 
The above definition allows us to perform computation on locations in joint coordinates, for instance addition, subtraction, etc ...
 
The above definition allows us to perform computation on locations in joint coordinates, for instance addition, subtraction, etc ...
  
 +
== Cartesian coordinates ==
  
==Cartesian coordinates==
+
For cartesian coordinates, a location variable is defined by 6 components representing the values:''X, Y, Z, Yaw, Pitch, Roll.''
 
 
 
 
For cartesian coordinates, a location variable is defined by 6 components representing the values:'' X, Y, Z, Yaw, Pitch, Roll.''  
 
 
 
 
 
Cartesian system variables: '''''here, setpoint'''''
 
 
 
 
 
''loc'''''<nowiki> = <robot>.here</nowiki>''' system maintained variable which returns the current transformation of the tool tip referred to the WORLD reference frame of the arm.
 
 
 
 
 
Cartesian location definition:
 
  
The curly brackets preceded by the "#" sign are used by the system to differentiate between joint and location positions.
+
Cartesian system variables: '''''here, setpoint'''''
  
''<nowiki>#{x_value, y_value, z_value, yaw_value, pitch_value, roll_value</nowiki>''}
+
''loc''
 +
<nowiki> = <robot>.here</nowiki>
 +
system maintained variable which returns the current transformation of the tool tip referred to the WORLD reference frame of the arm. Cartesian location definition: The curly brackets preceded by the "#" sign are used by the system to differentiate between joint and location positions.
 +
&nbsp;
 +
<nowiki>#{x_value, y_value, z_value, yaw_value, pitch_value, roll_value</nowiki>
 +
} &nbsp;
 +
=== Example 1 ===
  
 +
If "''r''" is the radius of a circle and "''angle''" is the angle of rotation about the circle, then the transformation&nbsp;:
  
===Example1 :===
+
&nbsp;
  
If "''r''" is the radius of a circle and "''angle''" is the angle of rotation about the circle, then the transformation :
+
&nbsp;
 
 
'''<nowiki>#{</nowiki>'''''r''<nowiki>*COS(</nowiki>''angle''),'' r''<nowiki>*SIN(</nowiki>''angle''), 0, 0, 0, 0<nowiki>}</nowiki>
 
 
 
will yield points on that circle.
 
  
 +
&nbsp;
 +
<nowiki>#{r*COS(''angle''),'' r''*SIN(''angle''), 0, 0, 0, 0</nowiki>
 +
'''}''' will yield points on that circle.
 
== Point Manipulations ==
 
== Point Manipulations ==
  
===Compound operator===
+
=== Compound operator ===
 
 
  
 
A compound operator between two cartesian points is defined. The compound operator is defined using the '''':'''' sign.
 
A compound operator between two cartesian points is defined. The compound operator is defined using the '''':'''' sign.
Line 263: Line 199:
 
Thus, a compound transformation is written:
 
Thus, a compound transformation is written:
  
''location'' = ''loc1'' : ''loc2''
+
''location'' = ''loc1''&nbsp;: ''loc2''
  
 
which means that ''loc2'' is defined in relation to ''loc1''.
 
which means that ''loc2'' is defined in relation to ''loc1''.
  
 +
A compound transformation is the result of the multiplication of the corresponding homogeneous transformation matrix by another homogeneous transformation matrix: <!-- ''location'' = [[Image:AXY;Mcompound.png]] -->
  
A compound transformation is the result of the multiplication of the corresponding homogenous transformation matrix by another homogenous transformation matrix:
+
<math>location =
 +
\begin{bmatrix}
 +
x1 & x2 & x3 & X_{value} \\
 +
y1 & y2 & y3 & Y_{value} \\
 +
z1 & z2 & z3 & Z_{value} \\
 +
0 & 0 & 0 & 1
 +
\end{bmatrix}
 +
\cdot
 +
\begin{bmatrix}
 +
x'1 & x'2 & x'3 & X'_{value} \\
 +
y'1 & y'2 & y'3 & Y'_{value} \\
 +
z'1 & z'2 & z'3 & Z'_{value} \\
 +
0 & 0 & 0 & 1
 +
\end{bmatrix}
  
 +
</math>
  
''location'' = [[Image:AXY;Mcompound.png]]
+
Or using quaternions: <!-- [[Image:AXY;Qcompound.png]] -->
  
Or using quaternions: [[Image:AXY;Qcompound.png]]
+
<math>[(X,Y,Z) + Rot_Q1(X',Y',Z') ;Q_1 \cdot Q_2 ] = [X,Y,Z, Q_1]:[X',Y',Z', Q_2] </math>
 
 
===Example :===
 
  
 +
=== Example ===
  
 
''point_name3'' = ''point_name1:point_name2''
 
''point_name3'' = ''point_name1:point_name2''
  
 +
''point_name3'' is the compound transformation of ''point_name1'' and ''point_name2'' and is defined in the basic frame (WORLD).
  
''point_name3'' is the compound transformation of ''point_name1'' and ''point_name2'' and is defined in the basic frame (WORLD).
+
[[File:AXY;BaseFrame.png|RTENOTITLE]]
 
 
[[Image:AXY;BaseFrame.png]]
 
 
 
  
 
Note that the sequence of a compound transformation has to be respected (operator is not commutative).
 
Note that the sequence of a compound transformation has to be respected (operator is not commutative).
  
===Example: ===
+
=== Example ===
 
 
 
 
''hop'' ='''<nowiki>#{</nowiki>'''20,130,45,30,0,90}:''point_name''
 
 
 
 
 
does not define the same transformation as:
 
 
 
 
 
''hop ''<nowiki>=</nowiki>''' '''''point_name'':'''<nowiki>#{</nowiki>'''20,130,45,30,0,90}
 
 
 
 
 
===Inverse of a location===
 
  
 +
''hop'' =
 +
<nowiki>#{20,130,45,30,0,90</nowiki>
 +
''}:point_name'' does not define the same transformation as: ''hop'' <nowiki>=</nowiki>
 +
''point_name:'' <nowiki>#{20,130,45,30,0,90</nowiki>
 +
''}''
 +
=== Inverse of a location ===
  
 
Inverse transformations are of prime importance in robotics when manipulating trajectories in space. This notion is mainly used in relation to frames to move a trajectory into another place without re-teaching the points. The function which defines the inverse is called '''INVERSE'''.
 
Inverse transformations are of prime importance in robotics when manipulating trajectories in space. This notion is mainly used in relation to frames to move a trajectory into another place without re-teaching the points. The function which defines the inverse is called '''INVERSE'''.
 
  
 
The inverse of a transformation is the computation of the inverse of the transformation matrix.
 
The inverse of a transformation is the computation of the inverse of the transformation matrix.
  
 +
'''INVERSE'''''(loc)'' = [[File:AXY;InverseMatrix.png|RTENOTITLE]]
  
'''INVERSE'''''(loc)'' = [[Image:AXY;InverseMatrix.png]]
+
[[File:AXY;Inverse.png|RTENOTITLE]]
 
 
[[Image:AXY;Inverse.png]]
 
  
 
Or using quaternions:
 
Or using quaternions:
  
'''INVERSE'''(loc) = [[Image:AXY;InverseQuat.png]]
+
'''INVERSE'''(loc) = [[File:AXY;InverseQuat.png|RTENOTITLE]]
  
 
Example: benefit of inverse transformations
 
Example: benefit of inverse transformations
  
===Example2 : ===
+
=== Example 2 ===
 
 
  
 
If "''frame''" is a transformation defining the position of the center of the circle and the plane in which it lies, the following program segment will move the robot toll point around the circle in steps of 1 degree.
 
If "''frame''" is a transformation defining the position of the center of the circle and the plane in which it lies, the following program segment will move the robot toll point around the circle in steps of 1 degree.
 
  
 
'''FOR ''angle'' = 0 TO 360'''
 
'''FOR ''angle'' = 0 TO 360'''
  
'''MOVE ''frame'':#{''r''<nowiki>*COS(</nowiki>''angle''<nowiki>*pi/180), </nowiki>''r''<nowiki>*SIN(</nowiki>''angle''<nowiki>*pi/180), 0, 0, 0, 0}</nowiki>'''
+
'''MOVE ''frame'':#{''r'''''
 +
<nowiki>*COS(</nowiki>
 +
'''''angle''''' <nowiki>*pi/180), </nowiki>
 +
'''''r''''' <nowiki>*SIN(</nowiki>
 +
'''''angle''''' <nowiki>*pi/180), 0, 0, 0, 0}</nowiki>
  
 
'''END'''
 
'''END'''
  
 
+
'''MOVE #{10,0,20,0,0,0):HERE:''point'' = HERE is used as a location'''
'''MOVE #{10,0,20,0,0,0):HERE:''point'' = HERE is used as a location'''
 
 
 
  
 
Location assignments
 
Location assignments
 
  
 
''loc'' =#{0,0,0,0,0,0}
 
''loc'' =#{0,0,0,0,0,0}
 
  
 
A NULL transformation corresponds to the identity matrix.
 
A NULL transformation corresponds to the identity matrix.
  
 +
'''NULL''' = [[File:AXY;NullMatrix.png|RTENOTITLE]]
  
'''NULL''' = [[Image:AXY;NullMatrix.png]]
+
'''Example'''
 
 
 
 
Example :
 
 
 
  
 
''loc2'' = ''loc1:loc''
 
''loc2'' = ''loc1:loc''
Line 354: Line 289:
 
where ''loc'' is a NULL transformation
 
where ''loc'' is a NULL transformation
  
 +
''loc2'' = [[File:AXY;NullTrans.png|RTENOTITLE]]
  
''loc2'' = [[Image:AXY;NullTrans.png]]
+
&nbsp;
 
 
 
 
* ''loc2'' is equal to'' loc1''
 
  
 +
*''loc2'' is equal to''loc1''
  
 
Inverse transformations and NULL transformations
 
Inverse transformations and NULL transformations
  
==Direct coordinate transformation==
+
== Direct coordinate transformation ==
  
 
+
The direct coordinate transformation translates joint variables (in degrees) into location variables (in mm) of the tool point center (modal value), referenced to the robot base (modal value). The system function used in this case is:
The direct coordinate transformation translates joint variables (in degrees) into location variables (in mm) of the tool point center (modal value), referenced to the robot base (modal value). The system function used in this case is: '''<nowiki><location> = ToCart(<robot>, <joint position>) </nowiki>'''It converts a set of joint coordinates to an equivalent transformation value using the geometric data of the robot given as a function argument. The computed location represents the position and orientation of the end of the tool in the World coordinate system taking into consideration the current TOOL transformation and BASE offset.
+
<nowiki><location> = ToCart(<robot>, <joint position>) </nowiki>
 
+
It converts a set of joint coordinates to an equivalent transformation value using the geometric data of the robot given as a function argument. The computed location represents the position and orientation of the end of the tool in the World coordinate system taking into consideration the current TOOL transformation and BASE offset. Application&nbsp;: trans = '''ToCart''' (''jtloc)''  
 
+
'''input'''&nbsp;: ''jtloc '': joint
Application :
 
 
 
 
 
trans = '''ToCart''' (''jtloc)''
 
 
 
 
 
'''input''' : ''jtloc '': joint  
 
  
 
'''output''': ''trans '': computed location based on the given joint values of ''jtloc''
 
'''output''': ''trans '': computed location based on the given joint values of ''jtloc''
  
 +
See Also: [[MC-Basic:TOCART|TOCART]]
  
===Example :===
+
=== Example ===
 
 
  
 
The series of instructions below computes the position and orientation that the robot will be moved to if its current location is altered by rotating joint 1 by 10 degrees.
 
The series of instructions below computes the position and orientation that the robot will be moved to if its current location is altered by rotating joint 1 by 10 degrees.
  
 +
''jtloc = '''pfb'''''
  
''jtloc = '''pfb'''''
+
''jtloc {1}''
 
+
<nowiki>= </nowiki>
''jtloc {1} ''<nowiki>= </nowiki>''jtloc {1} ''+10
+
''jtloc {1} ''+10 ''trans = ToCart(jtloc)''  
 
+
== Inverse coordinate transformation ==
''trans = ToCart(jtloc)''
 
 
 
 
 
==Inverse coordinate transformation==
 
 
 
  
 
The inverse coordinate transformation translates robot locations into joint positions according to configuration flags and the modal tool & base values.
 
The inverse coordinate transformation translates robot locations into joint positions according to configuration flags and the modal tool & base values.
  
The system function used in this case is: '''<nowiki><joint position> = ToJoint(<robot>, <location>, <cfg. Flags>)</nowiki>'''
+
The system function used in this case is:
 
+
<nowiki><joint position> = ToJoint(<robot>, <location>, <cfg. Flags>)</nowiki>
 
+
See Also: [[MC-Basic:TOJOINT|TOJOINT]] {{Note | The conversion from cartesian into joint coordinates can result in several configuration solutions linked to a cartesian position. The desired configuration can be forced by altering configuration flags. } The number and type of configuration flags depends on each robot type. The following table defines configuration flags of each supported robot type:  
Remark: The conversion from cartesian into joint coordinates can result in several configuration solutions linked to a cartesian position. The desired configuration can be forced by altering configuration flags.  
+
&nbsp;
 
 
 
 
The number and type of configuration flags depends on each robot type. The following table defines configuration flags of each supported robot type:
 
 
 
 
 
 
 
{| style="border-spacing:0;"
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| Robot type
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| Flag
 
| colspan="2"  style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| Values
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| Bit No. (ToJoint)
 
  
 +
{| border="1" style="border-spacing:0;"
 +
|-
 +
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | Robot type
 +
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | Flag
 +
| colspan="2" style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | Values
 +
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | Bit No. (ToJoint)
 
|-
 
|-
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| 1
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | 1
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| 2
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | 2
 
 
 
|-
 
|-
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| PUMA
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | PUMA
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Arm '''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''Arm'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''lefty'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''lefty'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''righty'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''righty'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''0'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''0'''
 
 
 
|-
 
|-
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Elbow'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''Elbow'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''below'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''below'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''above'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''above'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''1'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''1'''
 
 
 
|-
 
|-
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Wrist'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''Wrist'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''noflip'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''noflip'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''flip'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''flip'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''2'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''2'''
 
 
 
|-
 
|-
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| SCARA
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | SCARA
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''Arm'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''Arm'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''lefty'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''lefty'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''righty'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''righty'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''0'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''0'''
 
 
 
|-
 
|-
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| DELTA
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | DELTA
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''-'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''-'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''-'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''-'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''-'''
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | '''-'''
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|  
+
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;" | &nbsp;
 +
|}
  
|}
 
 
The configuration flag argument of the '''tojoint''' function is defined as:
 
The configuration flag argument of the '''tojoint''' function is defined as:
  
 +
<math>cfg = \sum_{i=0,1,2} (value-1) \cdot 2^i </math>
  
[[Image:]]
+
Note! Constants '''lefty, righty, above, below, flip''' and '''noflip''' are defined as built-in constants of the MC-Basic language.
  
 +
&nbsp;
  
Note! Constants '''lefty, righty, above, below, flip''' and '''noflip''' are defined as built-in constants of the MC-BASIC language.
+
=== Example ===
  
 +
In PUMA RX90 manipulator the following joint point: '''{0 , -45 , 135 , 0 , 90 , 0}''' corresponds to the Cartesian coordinates:
  
===Example:===
+
&nbsp;
 +
<nowiki>#{768.198 , 0 , 233.198 , 0 , 180 , 0} </nowiki>
  
 
+
and the following configuration: lefty, above, noflip. Therefore the configuration flags of the ToJoint function will be expressed as: (1-0)*2<sup>0 </sup>+ (2-1)*2<sup>1 </sup>+ (1-1)*2<sup>2</sup>
In PUMA RX90 manipulator the following joint point: '''{0 , -45 , 135 , 0 , 90 , 0}''' corresponds to the Cartesian coordinates:
+
<nowiki>= 2. So the opposite direction will be:</nowiki>
 
 
'''<nowiki>#{768.198 , 0 , 233.198 , 0 , 180 , 0} </nowiki>'''
 
 
 
 
 
and the following configuration: lefty, above, noflip. Therefore the configuration flags of the ToJoint function will be expressed as: (1-0)*2<sup>0 </sup>+ (2-1)*2<sup>1 </sup>+ (1-1)*2<sup>2 </sup><nowiki>= 2. So the opposite direction will be:</nowiki>
 
  
 
'''-->?ToJoint(#{768.198 , 0 , 233.198 , 0 , 180 , 0},0b010)'''
 
'''-->?ToJoint(#{768.198 , 0 , 233.198 , 0 , 180 , 0},0b010)'''
Line 477: Line 389:
 
'''-->'''
 
'''-->'''
  
= PUMA robot model =
+
&nbsp;
  
The PUMA robot is a six – degrees of freedom articulated robot of the following joints:
+
&nbsp;
  
[[Image:AXY;Puma.png]]
+
= Trajectory Interpolation =
 
 
 
 
Coupling
 
 
 
 
 
In Staubli RX robot family there is a mechanical coupling between axes 5 and 6. The coupling matrix of the robot is defined by:
 
 
 
<center>[[Image:]]</center>
 
 
 
 
 
== RX90 Work-Space ==
 
 
 
[[Image:AXY;PumaFromAbove.png]]
 
 
 
[[Image:AXY;PumaFromSide.png]]
 
 
 
The PUMA WORLD workspace is limited by joint limits and the following auxiliary cartesian boundaries, available for the user:
 
 
 
* RMAX – maximum radius of a cartesian point ([[Image:]]), no points beyond this radius are allowed.
 
* RMIN - smallest radius of a cartesian point ([[Image:]]). No points inside this radius are allowed.
 
* ZMIN – '''z''' coordinate of the robot base plane. No points below this plane are allowed.
 
 
 
== Robot configurations ==
 
 
 
Every robot location can be achieved in at least 8 different joint positions (the number can be greater counting also different joint positions obtained by changing joint angles for full revolutions (360 degrees)). Different joint coordinates of one location are called '''robot configurations'''. The PUMA robot configurations are defined by three flags: '''arm''', '''elbow''' and '''wrist'''. Each flag has its command and feedback value: '''acmd/afbk, ecmd/efbk, wcmd/wfbk'''. Command values (acmd, ecmd, efbk) describe the given target point configuration of a movement (can be both nodal and modal). The feedback values (afbk, efbk, wfbk) represent the current robot configuration (pfb – values), and these are read-only flags.
 
 
 
 
 
===The '''arm''' flag defines LEFTY or RIGHTY configurations according:===
 
 
 
 
 
'''RIGHTY''' – positive jont-2 moves the wrist in '''''positive''''' WORLD Z direction while joint-3 is not activated
 
 
 
'''LEFTY'''– positive jont-2 moves the wrist in '''''negative''''' WORLD Z direction while joint-3 is not activated
 
 
 
 
 
The '''elbow''' flag defines ABOVE or BELOW configurations according:
 
 
 
 
 
[[Image:]]'''ABOVE''' - position of the wrist of the [[Image:]]arm with respect to the shoulder coordinate system has [[Image:]]coordinate value along the Y axis of the second segment
 
 
 
 
 
'''BELOW''' - position of the wrist of the [[Image:]]arm with respect to the shoulder coordinate system has [[Image:]]coordinate value along the Y axis of the second segment
 
 
 
 
 
[[Image:AXY;PumaLeftyRightyCfg.png]]
 
 
 
===The '''wrist''' flag defines FLIP or NOFLIP configuration according:===
 
 
 
 
 
'''FLIP''' – value of joint 5 is negative
 
 
 
'''NOFLIP''' – value of joint 5 is positive
 
 
 
 
 
Command configuration flags of PUMA robot and their influence on motion are given by:
 
 
 
 
 
 
 
{| style="border-spacing:0;"
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| Flag(shortname)
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''0 (auto)'''</center>
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''1'''</center>
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''2'''</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''ArmCmd (acmd)'''
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Keep the current configuration or choose the closest joint-target.</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint-target is LEFTY</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint-target is RIGHTY</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''ElbowCmd (ecmd)'''
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Keep the current configuration or choose the closest joint-target.</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint-target is BELOW</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint-target is ABOVE</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| '''WristCmd (wcmd)'''
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Keep the current configuration or choose the closest joint-target.</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint-target is NOFLIP</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint-target is FLIP</center>
 
 
 
|}
 
 
 
== Singular points ==
 
Singular points are joint points where robot configurations can not be determined, these are robot positions where a small difference in one of the joint angles introduce change in robot configuration.
 
 
 
Looking from the other side, from the WORLD-space coordinates. In the vicinities of these points, small changes in location coordinates can introduce big changes in joint coordinates. Therefore moving in cartesian-interpolated mode (MOVES, PASS-THROUGH, CIRCLE) through these points can result in strong increase of joint velocities.
 
 
 
 
 
== Typical RX90 poses ==
 
[[Image:AXY;RX90ready.png|thumb|Configuration of the robot at the "ready position" Joint: {0, -90, 0, 0, 0, 0} Cartesian: <nowiki>#{0 , 0 , 985 , 0 , 0 , 0}</nowiki>]]
 
 
 
 
 
[[Image:AXY;PumaNull.png|thumb|Configuration of the robot at the "zero position"Joint: {0,0,0,0,0,0}:Cartesian: <nowiki>#{450, 0 , 535, 0, 0, 0}</nowiki>]]
 
 
 
 
 
[[Image:AXY;PumaLeftyRighty.png|thumb|LEFTY and RIGHTY configurations of same point: joint: {0,45,135,0,90,0} joint: {180,135,45,0,-90,-180}cartesian: #{233,0,-768,-180,90,180} cartesian: #{233,0,-768,180,90,-180}]]
 
 
 
 
 
[[Image:AXY;PumaReady.png|thumb|joint: {0,-90, 90,0,90,0} joint: {0,-90, 90,90,90,0} cartesian: #{85, 0, 900,0, 90, 0} cartesian: #{0,85,900,90,90,0}]]
 
 
 
== Geometric, Denavit-Hartenberg (DH) parameters of the PUMA robot ==
 
Usually in robotics DH parameters are used to describe the robot geometry. We are using the following definition of DH parameters:
 
 
 
* θ<sub> i</sub> is the joint angel from the '''x'''<sub>i-1 </sub>axis to the '''x'''<sub>i</sub> axis about the '''z<sub> '''i-1</sub> axis (using the right-hand rule).
 
* α<sub> i</sub> is the offset angle from '''z<sub> '''i-1</sub> axis to the '''z<sub> '''i</sub> axis about '''x'''<sub>i</sub> axis (using the right hand rule).
 
* a<sub>i</sub> is the offset distance from the intersection of the '''z<sub> '''i-1</sub> axis with the '''x'''<sub>i</sub> axis to the origin of the ''i''th frame along '''x'''<sub>i</sub> axis (or the shortest distance between the '''z<sub> '''i-1</sub> and '''z<sub> '''I</sub> axes).
 
* d<sub>i</sub> is the distance from the origin of the ''(i-1)''th coordinate frame to the intersection of the '''z<sub> '''i-1</sub> axis with the '''x'''<sub>i</sub> axis along '''z<sub> '''i-1</sub> axis.
 
 
 
[[Image:AXY;PumaDH.png]]
 
 
 
 
 
For RX90 family of Staubli robots we have:
 
 
 
 
 
 
 
{| style="border-spacing:0;"
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>DH parameter</center>
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>MC-BASIC property name</center>
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Value in mm</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>d2</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki><robot >.link[1][1]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>a2</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[2][1]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>450</center>
 
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>a3</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[3][1]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
  
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>d4</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[4][1]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>450</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>d6</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[6][3]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>85</center>
 
 
|}
 
The above parameters of '''link''' matrix property of the robot must be filled-in in the robot’s setup file. In order that the system accepts the above setup the “'''configgroup'''” command must be executed. Note that only the above set of parameters affects the robot geometry, the rest of the '''''<nowiki>link[][]</nowiki>''''' and '''''<nowiki>axis[][] </nowiki>'''''values do not influence the robot geometry in any way and are not affected (changed) by '''configgroup''' command or any other robot command.
 
 
 
The rest of the DH parameters are predefined as follow and are automatically internally set by choosing the right group model.
 
 
 
 
{| style="border-spacing:0;"
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Joint i</center>
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>θ<sub>i</sub></center>
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>α<sub>i</sub></center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>1</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>90</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>-90</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>2</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>3</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>90</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>90</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>4</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>-90</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>5</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>90</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>6</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>0</center>
 
 
|}
 
 
== Orientation Angles ==
 
[[Image:AXY;OrientationAngels.png]]
 
 
= DELTA robot model =
 
The DELTA robot is a four – degrees of freedom parallel robot of the following configuration:
 
 
 
<center>[[Image:AXY;DeltaPatent.png]]</center>
 
 
 
The basic idea behind the Delta parallel robot design is the use of parallelograms. A parallelogram allows an output link to remain at a fixed orientation with respect to an input link. The use of three such parallelograms restrains completely the orientation of the mobile platform which remains only with three purely translational degrees of freedom. The input links of the three parallelograms are mounted on rotating levers via revolute joints. The revolute joints of the rotating levers are actuated in two different ways: with rotational motors or with linear actuators. Finally, a fourth leg is used to transmit rotary motion from the base to an end-effector mounted on the mobile platform.
 
 
 
WIPO patent issued on June 18, 1987 ([http://www.delphion.com/details?&pn10=WO08703528 WO 87/03528]):
 
 
 
''“The device comprises a base element (1) and a movable element (8). Three control arms (4) are rigidly mounted at their first extremity (15) on three shafts (2) which may be rotated. The three assemblies each formed by a shaft (2) and an arm (4) are the movable parts of three actuators (13) of which the fixed parts (3) are integral with the base element. The other extremity (16) of each control arm is made integral with the movable element through two linking bars (5a, 5b) hingedly mounted on the one hand to the second extremity (16) of the control arm and, on the other hand, to the movable element. The inclination and the orientation in the space of the movable element remain unchanged, whatever the motions of the three control arms may be. The movable element supports a working element (9) of which the rotation is controlled by a fixed motor (11) situated on the base element. A telescopic arm (14) connects the motor to the working element.”''
 
 
 
Also: ([http://www.delphion.com/details?&pn10=US04976582 US 4,976,582]), and ([http://www.delphion.com/details?pn=EP00250470B1 EP 0 250 470]).
 
 
<center>[[Image:AXY;ABBDelta.png]]</center>
 
 
<center>ABB Flexible Automation's IRB 340 FlexPicker</center>
 
 
== DELTA Work-Space ==
 
 
[[Image:AXY;DeltaWspace.png ]]
 
 
<center>'''Delta Workspace assessment'''</center>
 
 
 
The Delta kinematics works with points of the '''XYZR''' robot type(X, Y , Z and Roll) where the first three coordinates are always expressed in millimeters and the roll angle in degrees.
 
 
 
The DELTA WORLD workspace is limited by joint limits and the following auxiliary cartesian boundaries, available for the user:
 
 
* RMAX – maximum radius of a cartesian point ([[Image:]]), no points beyond this radius are allowed.
 
* RMIN - smallest radius of a cartesian point ([[Image:]]). No points inside this radius are allowed.
 
* ZMIN – '''z''' coordinate of the “lowest” robot position. No points below this plane are allowed.
 
 
[[Image:AXY;DeltaKinematics1.png]]
 
 
== Robot configurations ==
 
Delta robot has no configuration flags, there is always one unique solution of the inverse kinematics problem. This further means that the configuration arguments in inverse kinematics function '''ToJoint''' have no influence on the result. Also Cartesian movements like MOVES, CIRCLE or PASS THROUGH are not influenced by any of the command configuration flags (acmd, ecmd, wcmd), the motion will be the same independent of the value of any of these flags.
 
 
 
== Singular points ==
 
Delta robot, contrary to the open-kinematics chain robot has no singular joint positions where the joint velocities tend to infinity but there are so called “direct kinematics singularity” where the stiffness of the robot is significantly reduced.
 
 
 
[[Image:AXY;DeltaKinematics2.png]]
 
 
 
Case when the upper arm linkages are parallel to each other. At this singular configuration manipulator can not resist any force applied in the plane of moving platform.
 
 
 
Another singular position which in is more a '''theoretical''' in our case is the so called direct kinematics singular configuration, [[Image:]]in which all the upper arm linkages are in the plane of the moving platform. At such a configuration, the manipulator actuators can not resist any force applied to the moving platform in the z-direction.
 
 
 
'''This case is possible only when [[Image:AXY;DeltaSing.png]] which in our case is not fulfilled!'''
 
 
== Geometric parameters of the DELTA robot ==
 
<center>[[Image:]]</center>
 
 
 
For DELTA family of robots we have:
 
 
 
 
{| style="border-spacing:0;"
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>parameter</center>
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>MC-BASIC property name</center>
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Value in mm</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Rbig</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki><robot >.link[1][1]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>370</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>L1</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[2][3]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>300</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>L2</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[3][3]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>800</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Rsmall</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>'''<nowiki>< robot >.link[4][1]</nowiki>'''</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>50</center>
 
 
|}
 
[[Image:]]
 
 
 
The above parameters of '''link''' matrix property of the robot must be filled-in in the robot’s setup file. In order that the system accepts the above setup the “'''configgroup'''” command must be executed. The model is assuming that the three base motors are rotated for exactly 120 degrees. Also it has been assumed that all three lags are of the same dimensions. The WORLD coordinate system is based in the center of the motor plane. Note that only the above set of parameters affects the robot geometry, the rest of the '''''<nowiki>link[][]</nowiki>''''' and '''''<nowiki>axis[][] </nowiki>'''''values do not influence the robot geometry in any way and are not affected (changed) by '''configgroup''' command or any other robot command.
 
 
 
== Typical DELTA poses ==
 
[[Image:]]Farthest (highest) reachable Z coordinate and the maximum joint angle.
 
 
 
[[Image:]]
 
 
 
[[Image:]]
 
 
 
Closest (lowest) reachable Z coordinate and the maximum joint angle.
 
 
 
If [[Image:]] then the following is true '''(not applicable in our case)''':
 
 
[[Image:]]
 
 
[[Image:]]
 
 
 
[[Image:]]
 
 
 
“Zero” position, for [[Image:]]
 
 
 
[[Image:]]
 
 
 
[[Image:]]
 
 
 
Having a robot with following geometry:
 
 
 
 
{| style="border-spacing:0;"
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Parameter</center>
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Value in mm</center>
 
| style="border-top:none;border-bottom:none;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
| style="border-top:0.0069in solid #000000;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
| style="border:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Rbig</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>370</center>
 
| style="border-top:none;border-bottom:none;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Z<sub>0</sub></center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>505.56899</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>L1</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>300</center>
 
| style="border-top:none;border-bottom:none;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Zmax</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>1052.4258</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>L2</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>800</center>
 
| style="border-top:none;border-bottom:none;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Zmin</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>N/A</center>
 
 
|-
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>Rsmall</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>50</center>
 
| style="border-top:none;border-bottom:none;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"|
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>θmax</center>
 
| style="border-top:none;border-bottom:0.0069in solid #000000;border-left:0.0069in solid #000000;border-right:0.0069in solid #000000;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| <center>106.87532°</center>
 
 
|}
 
Test:
 
 
 
-->?ToCart({0,0,0,0})
 
 
<nowiki>#{-5.68434e-14 , 0 , 505.569 , 0}</nowiki>
 
 
-->?toCart({106.87,106.87,106.87,0})
 
 
<nowiki>#{-7.10543e-15 , 0 , 1052.43 , 0}</nowiki>
 
 
-->
 
 
 
== Orientation Angle ==
 
The DELTA kinematics has only one orientation angle (roll) it is directly (one-to-one) driven by the fourth motor. The value of the WORLD roll angle equals always to the fourth joint position limited (wrapped) <nowiki>to angle values between [-180, 180]. Orientation interpolation is determined by the OrientationFollwing flag. In the case of DELTA robots joint and world angles are directly related and therefore we have only two options of the OrientationFollowing flag:</nowiki>
 
 
 
* Take the longer path between initial and final roll angle: '''OrientationFollowing flag equals 2 or 3'''
 
* Take the shorter path between initial and final roll angle: '''OrientationFollowing flag equals 0 or 1'''
 
 
= Trajectory Interpolation =
 
 
Joint interpolated (natural) motion MOVE
 
Joint interpolated (natural) motion MOVE
 
  
 
The MOVE instruction causes a joint-interpolated motion. That is, intermediate command points between the initial and final robot locations are computed by interpolating linearly between the initial and final joint positions. Any changes in configuration requested by the program are executed during the motion. If the MOVE is given on joint coordinates then the command configuration (acmd, ecmd, wcmd) flags must agree (be the same or “auto”) with the configuration flags of the given target point. Joint interpolated movement is determined by the regular MC group parameters (vcruise, acc, dec, jerk).
 
The MOVE instruction causes a joint-interpolated motion. That is, intermediate command points between the initial and final robot locations are computed by interpolating linearly between the initial and final joint positions. Any changes in configuration requested by the program are executed during the motion. If the MOVE is given on joint coordinates then the command configuration (acmd, ecmd, wcmd) flags must agree (be the same or “auto”) with the configuration flags of the given target point. Joint interpolated movement is determined by the regular MC group parameters (vcruise, acc, dec, jerk).
  
 
+
== Linear interpolated motion MOVES ==
==Linear interpolated motion MOVES==
 
 
 
  
 
The MOVES instruction causes a straight-line motion. During such a motion, the tool center point is moved along a straight-line path and is smoothly rotated to its final orientation. Changes of configuration are not allowed during straight-line motions, except in cases when the commanded configuration flags are given with “auto” value and the movement allows it. Straight-line movement is determined by the pairs of translation/rotation parameters for velocity, acceleration and jerk: (vtran, atran, dtran, vrot, arot, jrot).
 
The MOVES instruction causes a straight-line motion. During such a motion, the tool center point is moved along a straight-line path and is smoothly rotated to its final orientation. Changes of configuration are not allowed during straight-line motions, except in cases when the commanded configuration flags are given with “auto” value and the movement allows it. Straight-line movement is determined by the pairs of translation/rotation parameters for velocity, acceleration and jerk: (vtran, atran, dtran, vrot, arot, jrot).
  
 +
&nbsp;
  
==Circular (arc) interpolated motion MOVES==
+
== Circular (arc) interpolated motion MOVES ==
 
 
  
The CIRCLE instruction causes a circular or arc motion. During such a motion, the tool center point is moved along a arc (or circle) path and is smoothly rotated to its final orientation. Changes of configuration are not allowed during circular-line motions, except in cases when the commanded configuration flags are given with “auto” value and the movement allows it. Note that in cases of circular interpolation tool orientation is rotated around vector normal on the circle plane from its initial to its final value. Circular movement is determined by the pairs of translation/rotation parameters for velocity, acceleration and jerk: (vtran, atran, dtran, vrot, arot, jrot).  
+
The CIRCLE instruction causes a circular or arc motion. During such a motion, the tool center point is moved along a arc (or circle) path and is smoothly rotated to its final orientation. Changes of configuration are not allowed during circular-line motions, except in cases when the commanded configuration flags are given with “auto” value and the movement allows it. Note that in cases of circular interpolation tool orientation is rotated around vector normal on the circle plane from its initial to its final value. Circular movement is determined by the pairs of translation/rotation parameters for velocity, acceleration and jerk: (vtran, atran, dtran, vrot, arot, jrot).
  
 +
&nbsp;
  
===''ORIENTATION INTERPOLATION DESCRIPTION''===
+
== ''ORIENTATION INTERPOLATION DESCRIPTION'' ==
 
 
  
 
Having the initial and final orientation expressed as quaternions (Q<sub>i</sub>, Q<sub>f</sub>) the orientation interpolation will be done according to the formula:
 
Having the initial and final orientation expressed as quaternions (Q<sub>i</sub>, Q<sub>f</sub>) the orientation interpolation will be done according to the formula:
  
[[Image:]]
+
<math>Q(t) = [cos(\phi(t)/2), sin(\phi(t)/2) \cdot n] Q_i</math>
  
 +
Where vector '''r''' and angle <math>\phi</math> are defined from:
  
Where vector '''''r''''' and angle '''''phi''''' are defined from:
+
<math>[cos(\phi(t)/2), sin(\phi(t)/2) \cdot r] =Q_f \cdot Q_i^{-1}</math>
  
[[Image:]]
+
The rate of change of angle <math>\phi</math> is proportional to the rate of change of the WORLD position (X,Y,Z) of the robot movement.
  
 +
The angle phi of the above formula can be always changed in two directions: positive & negative. One will be shorter the other longer, but this does not necessary give shorter movements in joint space. Therefore the user has the ability to influence orientation interpolation using the '''OrientationFollowing''' property of the robot. The values of the orientation-following property are:
  
The rate of change of angle phi is proportional to the rate of change of the WORLD position (X,Y,Z) of the robot movement.
+
0 – Shortest path in world coordinates ( shortest orientation path)
  
 +
1 – Shortest path in joint coordinates (shortest movement of fourth joint for SCARA).
  
The angle phi of the above formula can be always changed in two directions: positive & negative. One will be shorter the other longer, but this does not necessary give shorter movements in joint space. Therefore the user has the ability to influence orientation interpolation using the '''OrientationFollowing''' property of the robot. The values of the orientation-following property are:
+
2 - longer path in world space
  
 +
3 - longer path in joint space
  
0 shortest path in world space (smallest phi).
+
4 Positive direction in world space
  
1 shortest path in joint space (choose such phi that final change of joint angles is minimal).
+
5 Positive direction in joint space '''''- sign of last joint'''''
  
2 longer path in world space (the other solution of phi)
+
6 Negative direction in world space
  
3 longer path in joint space (the other solution of phi)
+
7 Negative direction in joint space '''''- sign of last joint'''''
  
 +
See Also:
  
==''GENERAL REMARKS ABOUT MOVEMENTS''==
+
*[[Orientation_Following_Flag|Orientation_Following_Flag]]
 +
*[[MC-Basic:robot.ORIENTATIONFOLLOWING|<robot>.ORIENTATIONFOLLOWING]]
 +
*[[MC-Basic:robot.ORIENTATIONCOMPLEMENT|<robot>.ORIENTATIONCOMPLEMENT]]
  
 +
== ''GENERAL REMARKS ABOUT MOVEMENTS'' ==
  
 
There are four different combinations of interpolation type and target points. The target point can be given in world or in joint coordinates and the interpolation can be straight-line or joint-interpolated (natural). For both cases of '''straight-line''' (cartesian interpolation) motion the following rules apply:
 
There are four different combinations of interpolation type and target points. The target point can be given in world or in joint coordinates and the interpolation can be straight-line or joint-interpolated (natural). For both cases of '''straight-line''' (cartesian interpolation) motion the following rules apply:
  
 +
&nbsp;
  
* The actual value of Arm - flag (afbk) does not change during the motion. It’s initial and final value must be the same, except the case when the motion starts form an “auto” value of the flag.
+
*The actual value of Arm - flag (afbk) does not change during the motion. It’s initial and final value must be the same, except the case when the motion starts form an “auto” value of the flag.  
* The actual value of Elbow - flag (efbk) does not change during the motion. It’s initial and final value must be the same, except the case when the motion starts form an “auto” value of the flag.
+
*The actual value of Elbow - flag (efbk) does not change during the motion. It’s initial and final value must be the same, except the case when the motion starts form an “auto” value of the flag.  
* The actual value of Wrist –flag (wfbk) does not change during the motion it’s initial and final value must be the same, except two cases: when the motion starts form an “auto” value of the flag. when the wcmd is given with an “auto” value and the motion passes through wrist singularity ('''pcmd{5} =0''') not affecting the fourth and the sixth joint.
+
*The actual value of Wrist –flag (wfbk) does not change during the motion it’s initial and final value must be the same, except two cases: when the motion starts form an “auto” value of the flag. when the wcmd is given with an “auto” value and the motion passes through wrist singularity ('''pcmd{5} =0''') not affecting the fourth and the sixth joint.  
  
 
Straight line motion with joint target ('''MOVES {…,…,…}''')movement is interpolated in Cartesian space so the changes of XYZ coordinates are linear. User can specify configuration command flags (acmd, ecmd, wcmd) but they must comply with the given target point. If from some reason (usually it is the orientation-following ) the given target point is not reached in joint space (in world space it is always reached!) an error will be generated. Typically the last three joints are reached in other values which differ for ±360 degrees, but the Cartesian point is the same.
 
Straight line motion with joint target ('''MOVES {…,…,…}''')movement is interpolated in Cartesian space so the changes of XYZ coordinates are linear. User can specify configuration command flags (acmd, ecmd, wcmd) but they must comply with the given target point. If from some reason (usually it is the orientation-following ) the given target point is not reached in joint space (in world space it is always reached!) an error will be generated. Typically the last three joints are reached in other values which differ for ±360 degrees, but the Cartesian point is the same.
 
  
 
In this case the '''OrientationFollwing''' flag is ignored and all computation will be done as the user set the value of '''1''' (closest path in joint space).
 
In this case the '''OrientationFollwing''' flag is ignored and all computation will be done as the user set the value of '''1''' (closest path in joint space).
  
Straight line motion with Cartesian target ('''MOVES #{…,…,…}''')movement is interpolated in Cartesian space so the changes of XYZ coordinates are linear. User can specify configuration command flags (acmd, ecmd, wcmd), only the proper setup will be allowed, else an error will be returned.  
+
Straight line motion with Cartesian target ('''MOVES #{…,…,…}''')movement is interpolated in Cartesian space so the changes of XYZ coordinates are linear. User can specify configuration command flags (acmd, ecmd, wcmd), only the proper setup will be allowed, else an error will be returned.
  
 
Joint –interpolated motion with joint target ('''MOVE {…,…,…}''')movement is interpolated in Cartesian space so the changes of j1,…,j6 are linear. The configuration flags are ignored.
 
Joint –interpolated motion with joint target ('''MOVE {…,…,…}''')movement is interpolated in Cartesian space so the changes of j1,…,j6 are linear. The configuration flags are ignored.
Line 937: Line 467:
 
Joint –interpolated motion with Cartesian target ('''MOVE #{…,…,…}''')movement is interpolated in Cartesian space so the changes of j1,…,j6 are linear. The configuration flags are taken into account when computing target coordinates. If “auto” configuration flag is selected the point closest to the target will be chosen.
 
Joint –interpolated motion with Cartesian target ('''MOVE #{…,…,…}''')movement is interpolated in Cartesian space so the changes of j1,…,j6 are linear. The configuration flags are taken into account when computing target coordinates. If “auto” configuration flag is selected the point closest to the target will be chosen.
  
 +
&nbsp;
  
===Case of invalid selection of configuration flags.===
+
=== Case of invalid selection of configuration flags. ===
 
 
 
 
Normally the system does not allow configuration flag change during cartesian-interpolated motions (MOVES, CIRCLE, PASSTHROUGH) if such a change is commanded an error will be returned and the motion will be not started. This occurs when the command configuration flags (acmd, ecmd, wcmd) differs from the feedback configuration flags at the start point (afbk,efbk,wfbk). However exceptions exist when the command flags are given with “'''auto(0)'''” value, depending on the specific robot model, the system chooses the same configuration as in the start position.
 
 
 
 
 
'''In PUMA kinematics''', there are special cases when the configuration flags can change during the cartesian-interpolated motion.
 
 
 
 
 
A change of the '''WRIST''' flag can be obtained when the '''wcmd''' is set to “'''auto(0)'''” and issuing one of the straight line motions. If such a motion passes thorough zero of the fifth joint angle there is a possibility that the wrist flag is changed. However, this can sometimes introduce opposite rotations of joints 4 and 6. If this rotation is too fast an error message will be returned and the motion will be canceled. In order to prevent it user can command low Cartesian speed (vrot, vtran) near these points.
 
 
 
  
A change of the '''ARM''' and '''ELBOW''' flags can be obtained in the case of straight-line motion (MOVES) going through the arm point singularity which in case of PUMA robot with d2=0 is point X = 0, Y = 0, Z =a2+d4+d6 , or in case d2≠0 (RX60) is a circle X = d2 cos α, Y = d2 sin α, Z = a2+d4+d6.  
+
Normally the system does not allow configuration flag change during cartesian-interpolated motions (MOVES, CIRCLE, PASSTHROUGH) if such a change is commanded an error will be returned and the motion will be not started. This occurs when the command configuration flags (acmd, ecmd, wcmd) differs from the feedback configuration flags at the start point (afbk,efbk,wfbk). However exceptions exist when the command flags are given with “'''auto(0)'''” value, depending on the specific robot model, the system chooses the same configuration as in the start position.
  
<center>[[Image:]]</center>
+
In '''PUMA''' kinematics, there are special cases when the configuration flags can change during the cartesian-interpolated motion.
  
 +
A change of the '''WRIST''' flag can be obtained when the '''wcmd''' is set to “'''auto(0)'''” and issuing one of the straight line motions. If such a motion passes thorough zero of the fifth joint angle there is a possibility that the wrist flag is changed. However, this can sometimes introduce opposite rotations of joints 4 and 6. If this rotation is too fast an error message will be returned and the motion will be canceled. In order to prevent it user can command low Cartesian speed (vrot, vtran) near these points.
  
 +
A change of the '''ARM''' and '''ELBOW''' flags can be obtained in the case of straight-line motion (MOVES) going through the arm point singularity which in case of PUMA robot with d2=0 is point X = 0, Y = 0, Z =a2+d4+d6 , or in case d2≠0 (RX60) is a circle X = d2 cos α, Y = d2 sin α, Z = a2+d4+d6.
 +
<center>[[File:AXY;ShoulderChange.png|RTENOTITLE]]</center>
 
Movements with the target point given in '''joint''' coordinates are treated differently. In these cases target joint coordinates and command configuration flags must comply (be the same or have auto value). If this is not the case motion will be not executed and an error will be returned.
 
Movements with the target point given in '''joint''' coordinates are treated differently. In these cases target joint coordinates and command configuration flags must comply (be the same or have auto value). If this is not the case motion will be not executed and an error will be returned.
  
 
= User Frame system =
 
= User Frame system =
The AMCS system is enriched with a set of user-definable working frames. All working frames are available both modally and nodally. All user frames must have the same location type (XYZ, XYZR, XYZYPR …) as the parent robot.  
+
 
 +
The softMC system is enriched with a set of user-definable working frames. All working frames are available both modally and nodally. All user frames must have the same location type (XYZ, XYZR, XYZYPR …) as the parent robot.
  
 
Working with robots the following user-definable frames are provided:
 
Working with robots the following user-definable frames are provided:
  
 +
&nbsp;
  
* World frame.Default Cartesian coordinate system. This frame is usually located at the robot base.
+
*World frame.Default Cartesian coordinate system. This frame is usually located at the robot base.  
* Base frame.The frame of the robot from the user-point of view. Normally used to correct rotation or inclination of robot mounting. (Usable for ceiling mounted robots).
+
*Base frame.The frame of the robot from the user-point of view. Normally used to correct rotation or inclination of robot mounting. (Usable for ceiling mounted robots).  
* Tool frame.Frame attached to the tool mounted on the robot, closely related to the tool geometry. Useful for describing tasks made by the attached tool (grinding, debarring, screwing, …)  
+
*Tool frame.Frame attached to the tool mounted on the robot, closely related to the tool geometry. Useful for describing tasks made by the attached tool (grinding, debarring, screwing, …)  
* Machine-Table Frame.Frame related to the machine robot is working with.
+
*Machine-Table Frame.Frame related to the machine robot is working with.  
* Work-Piece Frame.Frame related to the work-piece mounted on the machine robot is working with.
+
*Work-Piece Frame.Frame related to the work-piece mounted on the machine robot is working with.  
 
 
TOOL
 
 
 
 
 
BASE[[Image:]] [[Image:]]
 
 
 
WORLD
 
  
 +
[[File:USERFRAME.PNG|RTENOTITLE]]
  
 
All location properties of the robot are always expressed using the whole user-frame system, therefore always in the Work-Piece Frame defined by the whole user-frame chain. Using the previously defined compound transformation we have:
 
All location properties of the robot are always expressed using the whole user-frame system, therefore always in the Work-Piece Frame defined by the whole user-frame chain. Using the previously defined compound transformation we have:
 +
<center>'''here=MachineTable<sup>-1</sup>:WorkPiece<sup>-1</sup>:Base: here<sub>world</sub>:Tool'''</center>
 +
{{Note|Setting new values the '''tool''' property can cause a significant increase of position error ('''pe'''). The value of '''pe''' is always calculated at the tool-tip point, so increased tool length and small orientation errors can lead to an increased '''pe'''. This is obvious when putting '''pe''' into above equation: }}
 +
<center>'''pe=MachineTable<sup>-1</sup>:WorkPiece<sup>-1</sup>:Base: pe<sub>world</sub>:Tool'''</center>
 +
&nbsp;
  
<center>'''here=MachineTable<sup>-1</sup>:WorkPiece<sup>-1</sup>:Base: here<sub>world</sub>:Tool'''</center>
+
== TOOL ==
 
 
 
 
 
 
{| style="border-spacing:0;"
 
| style="border:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| [[Image:]]
 
| style="border:none;padding-top:0in;padding-bottom:0in;padding-left:0.075in;padding-right:0.075in;"| Setting new values the '''tool''' property can cause a significant increase of position error ('''pe'''). The value of '''pe''' is always calculated at the tool-tip point, so increased tool length and small orientation errors can lead to an increased '''pe'''.
 
 
 
This is obvious when putting '''pe''' into above equation:
 
 
 
'''pe=MachineTable<sup>-1</sup>:WorkPiece<sup>-1</sup>:Base: pe<sub>world</sub>:Tool'''
 
  
|}
 
== TOOL ==
 
 
Tool is a Robot property which informs the system to use the specified location as the '''tool''' transformation. It defines the position and orientation of the tool tip in relation to the center of the tool flange. The default tool transformation is the NULL transformation, which can be expressed as TOOL = #{0,0,0,0,0,0}
 
Tool is a Robot property which informs the system to use the specified location as the '''tool''' transformation. It defines the position and orientation of the tool tip in relation to the center of the tool flange. The default tool transformation is the NULL transformation, which can be expressed as TOOL = #{0,0,0,0,0,0}
  
 
+
'''Example'''
Example:
 
 
 
  
 
Puma.tool = #{25,0,100,0,45,0}
 
Puma.tool = #{25,0,100,0,45,0}
  
 +
&nbsp;
  
 
== BASE ==
 
== BASE ==
Base is a Robot property which informs the system to use the specified location as the '''base''' transformation. It defines the position and orientation of the arm in the cell according to the WORLD reference.
 
  
 +
Base is a Robot property which informs the system to use the specified location as the '''base''' transformation. It defines the position and orientation of the arm in the cell according to the WORLD reference.
  
 
The default base transformation is the NULL transformation, which can be expressed as Puma.base = #{0,0,0,0,0,0}
 
The default base transformation is the NULL transformation, which can be expressed as Puma.base = #{0,0,0,0,0,0}
  
 
== MachineTable ==
 
== MachineTable ==
'''MachineTable''' is a Robot property which informs the system to use the specified location as the '''machinetable''' transformation. It defines the position and orientation machine working frame relative to the BASE reference.
 
  
 +
'''MachineTable''' is a Robot property which informs the system to use the specified location as the '''machinetable''' transformation. It defines the position and orientation machine working frame relative to the BASE reference.
  
 
The default machinetable transformation is the NULL transformation, which can be expressed as Puma.MachineTable = #{0,0,0,0,0,0}
 
The default machinetable transformation is the NULL transformation, which can be expressed as Puma.MachineTable = #{0,0,0,0,0,0}
  
 +
&nbsp;
  
 
== WorkPiece ==
 
== WorkPiece ==
WorkPiece is a Robot property which informs the system to use the specified location as the '''workpiece''' transformation. It defines the position and orientation of work-piece relative to the MACHINE TABLE reference.
 
  
 +
WorkPiece is a Robot property which informs the system to use the specified location as the '''workpiece''' transformation. It defines the position and orientation of work-piece relative to the MACHINE TABLE reference.
  
 
The default base transformation is the NULL transformation, which can be expressed as Puma.WorkPiece = #{0,0,0,0,0,0}
 
The default base transformation is the NULL transformation, which can be expressed as Puma.WorkPiece = #{0,0,0,0,0,0}
  
 +
[[File:AXY;PumaTool.png|RTENOTITLE]]
  
[[Image:AXY;PumaTool.png]]
+
&nbsp;
  
 
+
[[File:AXY;Robot Working Farmes2.png|RTENOTITLE]]
 
 
[[Image:AXY;Robot Working Farmes.png]]  
 
  
 
So we have:
 
So we have:
  
 
+
'''P<sub>base</sub>'''
'''P<sub>base</sub><nowiki>=Base:P</nowiki><sub>world</sub>:Tool'''
+
<nowiki>=Base:P</nowiki>
 
+
'''<sub>world</sub>:Tool''' '''P<sub>base</sub>''' <nowiki>=MachineTable:WorkPiece:P</nowiki>
'''P<sub>base</sub><nowiki>=MachineTable:WorkPiece:P</nowiki><sub>WorkP'''</sub>
+
'''<sub>WorkP</sub>''' For the given setup user frames will be: '''Base = #{300,200,1000,0,180,180}''' '''Tool = #{50,0,0,90,45,0}''' '''MachineTable = #{400,100,0,0,0,0}'''  
 
 
 
 
For the given setup user frames will be:
 
 
 
'''Base = #{300,200,1000,0,180,180}'''
 
 
 
'''Tool = #{50,0,0,90,45,0}'''
 
 
 
'''MachineTable = #{400,100,0,0,0,0}'''
 
 
 
 
'''WorkPiece = #{20,70,150,0,90,-90}'''
 
'''WorkPiece = #{20,70,150,0,90,-90}'''
 
  
 
Therefore we have:
 
Therefore we have:
  
'''P<sub>WP</sub><nowiki>= WorkPiece</nowiki><sup>-1</sup>: MachineTable<sup>-1</sup>:Base:P<sub>World</sub>:Tool'''
+
'''P<sub>WP</sub>'''
 +
<nowiki>= WorkPiece</nowiki>
 +
'''<sup>-1</sup>: MachineTable<sup>-1</sup>:Base:P<sub>World</sub>:Tool'''  
 +
== Side effects ==
  
== Side effects ==
 
 
Setting the any of the user frames '''modally (tool, base, machinetable, workpiece),''' have an immediate effect on all the position computations:
 
Setting the any of the user frames '''modally (tool, base, machinetable, workpiece),''' have an immediate effect on all the position computations:
  
* Setpoint
+
*Setpoint  
* Here
+
*Here  
* Start
+
*Start  
* Dest
+
*Dest  
* ToJoint
+
*ToJoint  
  
 
but doesn’t affect the current motion.
 
but doesn’t affect the current motion.
 +
 +
[[Category:Robot Models]]

Latest revision as of 08:33, 8 April 2022

Language: English  • 中文(简体)‎

 

TOP2.png

Introduction

This document was written in accordance to the Kinematics proposal document received as an additional development request.

  • PUMA Kinematics
  • DELTA Kinematics
  • Tool, base and compound operator

New kinematics models of PUMA and DELTA robots are made always keeping what has been implemented for SCARA robots. Therefore if not explicitly stated different, all robotics features that were developed and implemented for the SCARA model will be available for the two models also. Therefore all the capabilities, methods and definitions of the features are common to all three models. The common robotics features for the above robots are:

  • Straight-line motion
  • Circular movements
  • VIA (Pass-Through) movements.
  • Continuous-Path – blending.
  • Conveyor tracking (Moving Frames).

These features are not described in this document.

 

Overview

This document describes a general kinematics implementation in the softMC system with the following kinematics models (and growing):

  • SCARA kinematics of 4 degrees of freedom.
  • PUMA kinematics of classical PUMA robots of 6 degrees of freedom.
  • DELTA kinematics of DELTA parallel robots of 4 degrees of freedom.
  • TARM kinematics of SpeedPicker robots of 4 degrees of freedom.
  • USER kinematics for general user-defined robot kinematics of up-to 6 DOF systems.


Definitions

  • DOF – “degrees of freedom” of a robot. In a serial robot it is usually the same as the number of motors in the robot.
  • DH – Denavit Hartenberg parameters of the robot describing robot geometry set of (θi, αi, ai, di) numbers for each robot segment.
  • “Tool-Center-Point (TCP)” - point on the last robot segment. By default it is in the center of the flange to which a gripper is mounted. Its coordinates can be displaced by the tool property as described below.
  • In the whole of this page we use term “point” for a vector describing the position and orientation of the robot’s TCP. The first part if this vector contains the cartesian coordinates of the TCP, while the second part describes its orientation. Depending on the robot type, the point can be an element of different vector spaces (such as two, three, six dimensional).
  • A “location” is a softMC data-type containing cartesian coordinates of a point.
  • A “joint location” or “joint” is a softMC data-type containing joint coordinates of a point.

Coordinates Systems

Cartesian coordinates and Euler Angles

In this section a method of robot point definition is shown. The presented method is given for a six-dimensional space defining both position and orientation, each having three degrees of freedom. For systems with more or less dimensions other coordinates systems will be used.

Each robot is defined by two properties. The first is the group model (SCARA, PUMA, DELTA, etc.). The actual robot model of a group can be queried using the TYPEOF property. The second property is the point type. A robot of a specific model might have several available point types. For example, the SCARA robot (model = 4) has two point types: XYZ and XYZR. If the point type is not declared when the robot is defined, its default point type will be used (written in bold text in the table below). Whenever a motion is issued for a particular robot, its appropriate point type must be used.

The following table lists the available robot models and their point types:    

softMC robot-model codes:
Description robot-model code point-type
no model -1  
Cartesian 1  
Cartesian (Pitch & Roll) 1 PR
Cartesian ( X and Y) 1 XY
Cartesian (X , Y and Roll) 1 XYR
Cartesian (X , Y and Z) 1 XYZ
Cartesian (X , Y , Z and Roll) 1 XYZR
Cartesian (X , Y , Z , Roll and Pitch) 1 XYZRP
Cartesian (X , Y , Z ,Yaw , Roll and Pitch) 1 XYZYPR
Puma 2 XYZYPR
No Coupling 3  
SCARA (X, Y, Z and Roll) 4 XYZR
SCARA (X, Y, Z ) 4 XYZ
User Defined 5  
Delta(Flex Picker) (X, Y, Z and Roll) 6 XYZR
Delta(Flex Picker) (X, Y, Z ) 6 XYZ
Traverse Arm (Speed Picker) (X, Y, Z and Roll) 7 XYZR
Traverse Arm (Speed Picker) (X, Y, Z ) 7 XYZ
Scissor Kinematics (X, Y, Z and Roll) 8 XYZR
Scissor Kinematics (X, Y, Z ) 8 XYZ
Chair Side Engine - 5ON 9 XYZAB
Chair Side Engine - 5OFF 10 XYZAB
3PPPR 11 XYR
Lab Side Engine - 5ON 12 XYZAB
Lab Side Engine - 5OFF 13 XYZAB
4 Bar linkage 14 XY
GSR 15 XYZPR
EVEREST - 5ON 16 XYZPR
EVEREST - 5OFF 17 XYZPR
PALLETIZING ROBOT 18 XYZR
Linear Delta robot 21 XYZR

Examples

PUMA robot definition

common shared puma as group axnm = a1 axnm = a2 axnm = a3 axnm = a4 axnm = a5 axnm = a6 model = 2

A location of PUMA robot: common shared lct as location of XYZYPR


DELTA robot definition:

common shared delta as group axnm = a1 axnm = a2 axnm = a3 axnm = a4 model = 6

A location of DELTA robot (with default point type XYZR): common shared lct as location of XYZR

 

XYZYPR vs. XYZR

The XYZYPR token for PUMA stands for: X-Y-Z-Yaw-Pitch-Roll coordinates and the XYZR for SCARA and DELTA robots stands for X-Y-Z-Roll. In both cases the roll angle defines the same thing - it is the angle of rotation about Z-axis. This is to be remembered later when the compound operator is defined then the following relation is true:

 

X,Y,Z, ,Roll corresponds to X,Y,Z,Roll with Yaw & Pitch equals zero.

Cartesian coordinates describe robot locations defining position and orientation of the declared robot tool center point. A location can be expressed in at least three ways representing all 6 degrees of freedom encountered in the cartesian space:

 

  • X Y Z Yaw Pitch Roll
  • Homogenous transformation matrix
  • X Y Z Quaternion

Common to all methods is the duality between location and transformation. Note that cartesian location gives coordinates of the tool center point which can be always interpreted as a transformation form the WORLD base point (space origin) to the tool center point.

XYZ Yaw Pitch Roll

This coordinates representation is mostly used in robotics. The softMC system uses it for user-related inputs and outputs (constant assignments and prints).

 

  • 3 degrees of freedom in translation (X, Y, Z) expressed in mm, defining the position of the tool center point relative to the robot base.
  • 3 degrees of freedom in rotation (yaw, pitch and roll defined below) expressed in degrees, defining the orientation of the tool tip. Yaw, Pitch, and Roll are the modified Euler angles and correspond to the sequential rotations around Z, Y, Z axes respectively.

 

NOTE-Info.svgNOTE
Note that the order of the yaw, pitch and roll sequence is important!

Homogenous Transformation Matrix:

This method of location representation is not used internally or in a user interface of the softMC but it is mostly used in the robotics literature. Therefore the representation is given in this document for demonstration and explanation purposes only. Location variable is represented as a (4 X 4) matrix:

loc = RTENOTITLE

Where: xx_axis, yx_axis, zx_axis are normalized values defining the change of the x axis in relation to its initial position, etc ...

X, Y, Z are the position values of the tool center point relative to the robot base.

The last line (0 0 0 1) is used for normalization.

 

Example 1

if loc coordinates are {100, 80, 150, 45, 0, 0}

loc written as a transformation matrix will be :

loc = RTENOTITLE

as there is only 45° of yaw rotation (rotation around Z axis) as it is illustrated.

The normal softMC system representation in programs is the {X,Y,Z, Yaw, Pitch, Roll} format. The homogenous matrix transformation is used here only for illustration purposes.

 

X Y Z Q (quaternions)

  • 3 degrees of freedom in translation (X, Y, Z) expressed in mm, defining the position of the tool center point relative to the robot base.


  • 3 degrees of freedom in rotation, expressed using the normalized quaternion Q described as a rotation around vector n for the angle phi:


  [cos(phi/2), sin(phi/2)*n]

The quaternion rotation presentation is used internally by the system but is not directly available for the user. However in cases of user-kinematics, this must be taken into account. The quaternions are used only for illustration purposes, the softMC system uses Euler angles for all user inputs and outputs.

Joint coordinates

For joint coordinates, a location variable is defined by n components representing the values in degrees (or mm) of each axis (n-number degrees of freedom according to the zero position of the kinematics model.

A location in joint coordinates is an array of n joint values:

 

Jnt_loc = {jnt1, jnt2, jnt3, jnt4, jnt5, jnt6}

Individual coordinates can be accessed via index definition in the form {i}: Jnt_loc{1}, Jnt_loc{2}, …

The above definition allows us to perform computation on locations in joint coordinates, for instance addition, subtraction, etc ...

Cartesian coordinates

For cartesian coordinates, a location variable is defined by 6 components representing the values:X, Y, Z, Yaw, Pitch, Roll.

Cartesian system variables: here, setpoint

loc = <robot>.here system maintained variable which returns the current transformation of the tool tip referred to the WORLD reference frame of the arm. Cartesian location definition: The curly brackets preceded by the "#" sign are used by the system to differentiate between joint and location positions.   #{x_value, y_value, z_value, yaw_value, pitch_value, roll_value }  

Example 1

If "r" is the radius of a circle and "angle" is the angle of rotation about the circle, then the transformation :

 

 

  #{r*COS(''angle''),'' r''*SIN(''angle''), 0, 0, 0, 0 } will yield points on that circle.

Point Manipulations

Compound operator

A compound operator between two cartesian points is defined. The compound operator is defined using the ':' sign.

Thus, a compound transformation is written:

location = loc1 : loc2

which means that loc2 is defined in relation to loc1.

A compound transformation is the result of the multiplication of the corresponding homogeneous transformation matrix by another homogeneous transformation matrix:

Or using quaternions:

Example

point_name3 = point_name1:point_name2

point_name3 is the compound transformation of point_name1 and point_name2 and is defined in the basic frame (WORLD).

RTENOTITLE

Note that the sequence of a compound transformation has to be respected (operator is not commutative).

Example

hop = #{20,130,45,30,0,90 }:point_name does not define the same transformation as: hop = point_name: #{20,130,45,30,0,90 }

Inverse of a location

Inverse transformations are of prime importance in robotics when manipulating trajectories in space. This notion is mainly used in relation to frames to move a trajectory into another place without re-teaching the points. The function which defines the inverse is called INVERSE.

The inverse of a transformation is the computation of the inverse of the transformation matrix.

INVERSE(loc) = RTENOTITLE

RTENOTITLE

Or using quaternions:

INVERSE(loc) = RTENOTITLE

Example: benefit of inverse transformations

Example 2

If "frame" is a transformation defining the position of the center of the circle and the plane in which it lies, the following program segment will move the robot toll point around the circle in steps of 1 degree.

FOR angle = 0 TO 360

MOVE frame:#{r *COS( angle *pi/180), r *SIN( angle *pi/180), 0, 0, 0, 0}

END

MOVE #{10,0,20,0,0,0):HERE:point = HERE is used as a location

Location assignments

loc =#{0,0,0,0,0,0}

A NULL transformation corresponds to the identity matrix.

NULL = RTENOTITLE

Example

loc2 = loc1:loc

where loc is a NULL transformation

loc2 = RTENOTITLE

 

  • loc2 is equal toloc1

Inverse transformations and NULL transformations

Direct coordinate transformation

The direct coordinate transformation translates joint variables (in degrees) into location variables (in mm) of the tool point center (modal value), referenced to the robot base (modal value). The system function used in this case is: <location> = ToCart(<robot>, <joint position>) It converts a set of joint coordinates to an equivalent transformation value using the geometric data of the robot given as a function argument. The computed location represents the position and orientation of the end of the tool in the World coordinate system taking into consideration the current TOOL transformation and BASE offset. Application : trans = ToCart (jtloc) input : jtloc : joint

output: trans : computed location based on the given joint values of jtloc

See Also: TOCART

Example

The series of instructions below computes the position and orientation that the robot will be moved to if its current location is altered by rotating joint 1 by 10 degrees.

jtloc = pfb

jtloc {1} = jtloc {1} +10 trans = ToCart(jtloc)

Inverse coordinate transformation

The inverse coordinate transformation translates robot locations into joint positions according to configuration flags and the modal tool & base values.

The system function used in this case is: <joint position> = ToJoint(<robot>, <location>, <cfg. Flags>) See Also: TOJOINT {{Note | The conversion from cartesian into joint coordinates can result in several configuration solutions linked to a cartesian position. The desired configuration can be forced by altering configuration flags. } The number and type of configuration flags depends on each robot type. The following table defines configuration flags of each supported robot type:  

Robot type Flag Values Bit No. (ToJoint)
1 2
PUMA Arm lefty righty 0
Elbow below above 1
Wrist noflip flip 2
SCARA Arm lefty righty 0
DELTA - - -  

The configuration flag argument of the tojoint function is defined as:

Note! Constants lefty, righty, above, below, flip and noflip are defined as built-in constants of the MC-Basic language.

 

Example

In PUMA RX90 manipulator the following joint point: {0 , -45 , 135 , 0 , 90 , 0} corresponds to the Cartesian coordinates:

  #{768.198 , 0 , 233.198 , 0 , 180 , 0}

and the following configuration: lefty, above, noflip. Therefore the configuration flags of the ToJoint function will be expressed as: (1-0)*20 + (2-1)*21 + (1-1)*22 = 2. So the opposite direction will be:

-->?ToJoint(#{768.198 , 0 , 233.198 , 0 , 180 , 0},0b010)

{0 , -45 , 135 , 0 , 90 , 0}

-->

 

 

Trajectory Interpolation

Joint interpolated (natural) motion MOVE

The MOVE instruction causes a joint-interpolated motion. That is, intermediate command points between the initial and final robot locations are computed by interpolating linearly between the initial and final joint positions. Any changes in configuration requested by the program are executed during the motion. If the MOVE is given on joint coordinates then the command configuration (acmd, ecmd, wcmd) flags must agree (be the same or “auto”) with the configuration flags of the given target point. Joint interpolated movement is determined by the regular MC group parameters (vcruise, acc, dec, jerk).

Linear interpolated motion MOVES

The MOVES instruction causes a straight-line motion. During such a motion, the tool center point is moved along a straight-line path and is smoothly rotated to its final orientation. Changes of configuration are not allowed during straight-line motions, except in cases when the commanded configuration flags are given with “auto” value and the movement allows it. Straight-line movement is determined by the pairs of translation/rotation parameters for velocity, acceleration and jerk: (vtran, atran, dtran, vrot, arot, jrot).

 

Circular (arc) interpolated motion MOVES

The CIRCLE instruction causes a circular or arc motion. During such a motion, the tool center point is moved along a arc (or circle) path and is smoothly rotated to its final orientation. Changes of configuration are not allowed during circular-line motions, except in cases when the commanded configuration flags are given with “auto” value and the movement allows it. Note that in cases of circular interpolation tool orientation is rotated around vector normal on the circle plane from its initial to its final value. Circular movement is determined by the pairs of translation/rotation parameters for velocity, acceleration and jerk: (vtran, atran, dtran, vrot, arot, jrot).

 

ORIENTATION INTERPOLATION DESCRIPTION

Having the initial and final orientation expressed as quaternions (Qi, Qf) the orientation interpolation will be done according to the formula:

Where vector r and angle are defined from:

The rate of change of angle is proportional to the rate of change of the WORLD position (X,Y,Z) of the robot movement.

The angle phi of the above formula can be always changed in two directions: positive & negative. One will be shorter the other longer, but this does not necessary give shorter movements in joint space. Therefore the user has the ability to influence orientation interpolation using the OrientationFollowing property of the robot. The values of the orientation-following property are:

0 – Shortest path in world coordinates ( shortest orientation path)

1 – Shortest path in joint coordinates (shortest movement of fourth joint for SCARA).

2 - longer path in world space

3 - longer path in joint space

4 – Positive direction in world space

5 – Positive direction in joint space - sign of last joint

6 – Negative direction in world space

7 – Negative direction in joint space - sign of last joint

See Also:

GENERAL REMARKS ABOUT MOVEMENTS

There are four different combinations of interpolation type and target points. The target point can be given in world or in joint coordinates and the interpolation can be straight-line or joint-interpolated (natural). For both cases of straight-line (cartesian interpolation) motion the following rules apply:

 

  • The actual value of Arm - flag (afbk) does not change during the motion. It’s initial and final value must be the same, except the case when the motion starts form an “auto” value of the flag.
  • The actual value of Elbow - flag (efbk) does not change during the motion. It’s initial and final value must be the same, except the case when the motion starts form an “auto” value of the flag.
  • The actual value of Wrist –flag (wfbk) does not change during the motion it’s initial and final value must be the same, except two cases: when the motion starts form an “auto” value of the flag. when the wcmd is given with an “auto” value and the motion passes through wrist singularity (pcmd{5} =0) not affecting the fourth and the sixth joint.

Straight line motion with joint target (MOVES {…,…,…})movement is interpolated in Cartesian space so the changes of XYZ coordinates are linear. User can specify configuration command flags (acmd, ecmd, wcmd) but they must comply with the given target point. If from some reason (usually it is the orientation-following ) the given target point is not reached in joint space (in world space it is always reached!) an error will be generated. Typically the last three joints are reached in other values which differ for ±360 degrees, but the Cartesian point is the same.

In this case the OrientationFollwing flag is ignored and all computation will be done as the user set the value of 1 (closest path in joint space).

Straight line motion with Cartesian target (MOVES #{…,…,…})movement is interpolated in Cartesian space so the changes of XYZ coordinates are linear. User can specify configuration command flags (acmd, ecmd, wcmd), only the proper setup will be allowed, else an error will be returned.

Joint –interpolated motion with joint target (MOVE {…,…,…})movement is interpolated in Cartesian space so the changes of j1,…,j6 are linear. The configuration flags are ignored.

Joint –interpolated motion with Cartesian target (MOVE #{…,…,…})movement is interpolated in Cartesian space so the changes of j1,…,j6 are linear. The configuration flags are taken into account when computing target coordinates. If “auto” configuration flag is selected the point closest to the target will be chosen.

 

Case of invalid selection of configuration flags.

Normally the system does not allow configuration flag change during cartesian-interpolated motions (MOVES, CIRCLE, PASSTHROUGH) if such a change is commanded an error will be returned and the motion will be not started. This occurs when the command configuration flags (acmd, ecmd, wcmd) differs from the feedback configuration flags at the start point (afbk,efbk,wfbk). However exceptions exist when the command flags are given with “auto(0)” value, depending on the specific robot model, the system chooses the same configuration as in the start position.

In PUMA kinematics, there are special cases when the configuration flags can change during the cartesian-interpolated motion.

A change of the WRIST flag can be obtained when the wcmd is set to “auto(0)” and issuing one of the straight line motions. If such a motion passes thorough zero of the fifth joint angle there is a possibility that the wrist flag is changed. However, this can sometimes introduce opposite rotations of joints 4 and 6. If this rotation is too fast an error message will be returned and the motion will be canceled. In order to prevent it user can command low Cartesian speed (vrot, vtran) near these points.

A change of the ARM and ELBOW flags can be obtained in the case of straight-line motion (MOVES) going through the arm point singularity which in case of PUMA robot with d2=0 is point X = 0, Y = 0, Z =a2+d4+d6 , or in case d2≠0 (RX60) is a circle X = d2 cos α, Y = d2 sin α, Z = a2+d4+d6.

RTENOTITLE

Movements with the target point given in joint coordinates are treated differently. In these cases target joint coordinates and command configuration flags must comply (be the same or have auto value). If this is not the case motion will be not executed and an error will be returned.

User Frame system

The softMC system is enriched with a set of user-definable working frames. All working frames are available both modally and nodally. All user frames must have the same location type (XYZ, XYZR, XYZYPR …) as the parent robot.

Working with robots the following user-definable frames are provided:

 

  • World frame.Default Cartesian coordinate system. This frame is usually located at the robot base.
  • Base frame.The frame of the robot from the user-point of view. Normally used to correct rotation or inclination of robot mounting. (Usable for ceiling mounted robots).
  • Tool frame.Frame attached to the tool mounted on the robot, closely related to the tool geometry. Useful for describing tasks made by the attached tool (grinding, debarring, screwing, …)
  • Machine-Table Frame.Frame related to the machine robot is working with.
  • Work-Piece Frame.Frame related to the work-piece mounted on the machine robot is working with.

RTENOTITLE

All location properties of the robot are always expressed using the whole user-frame system, therefore always in the Work-Piece Frame defined by the whole user-frame chain. Using the previously defined compound transformation we have:

here=MachineTable-1:WorkPiece-1:Base: hereworld:Tool
NOTE-Info.svgNOTE
Setting new values the tool property can cause a significant increase of position error (pe). The value of pe is always calculated at the tool-tip point, so increased tool length and small orientation errors can lead to an increased pe. This is obvious when putting pe into above equation:
pe=MachineTable-1:WorkPiece-1:Base: peworld:Tool

 

TOOL

Tool is a Robot property which informs the system to use the specified location as the tool transformation. It defines the position and orientation of the tool tip in relation to the center of the tool flange. The default tool transformation is the NULL transformation, which can be expressed as TOOL = #{0,0,0,0,0,0}

Example

Puma.tool = #{25,0,100,0,45,0}

 

BASE

Base is a Robot property which informs the system to use the specified location as the base transformation. It defines the position and orientation of the arm in the cell according to the WORLD reference.

The default base transformation is the NULL transformation, which can be expressed as Puma.base = #{0,0,0,0,0,0}

MachineTable

MachineTable is a Robot property which informs the system to use the specified location as the machinetable transformation. It defines the position and orientation machine working frame relative to the BASE reference.

The default machinetable transformation is the NULL transformation, which can be expressed as Puma.MachineTable = #{0,0,0,0,0,0}

 

WorkPiece

WorkPiece is a Robot property which informs the system to use the specified location as the workpiece transformation. It defines the position and orientation of work-piece relative to the MACHINE TABLE reference.

The default base transformation is the NULL transformation, which can be expressed as Puma.WorkPiece = #{0,0,0,0,0,0}

RTENOTITLE

 

RTENOTITLE

So we have:

Pbase =Base:P world:Tool Pbase =MachineTable:WorkPiece:P WorkP For the given setup user frames will be: Base = #{300,200,1000,0,180,180} Tool = #{50,0,0,90,45,0} MachineTable = #{400,100,0,0,0,0} WorkPiece = #{20,70,150,0,90,-90}

Therefore we have:

PWP = WorkPiece -1: MachineTable-1:Base:PWorld:Tool

Side effects

Setting the any of the user frames modally (tool, base, machinetable, workpiece), have an immediate effect on all the position computations:

  • Setpoint
  • Here
  • Start
  • Dest
  • ToJoint

but doesn’t affect the current motion.