|
|
Line 1: |
Line 1: |
− | {{Languages}} | + | {{Languages|Element_Coordination}} |
− | = 介绍 = | + | =全局坐标概念 = |
| | | |
− | 此功能的主要目标是几个机器人的空间和时间上运动同步。这将使用系统中存在的标准主 - 从关系将其扩展为通用机器人到机器人连接。将要使用的功能是'''移动坐标系特性''',通常用于'''传输带跟踪'''。移动坐标系的源将从简单的轴列表扩展到任何机器人类型的笛卡尔命令(SETPOINT,HERE)。
| + | 对于使用不同点类型的''全局坐标概念''的机器人已经被定义。 这允许以一种常见的独特格式给予机器人位置,以独立地观察机器人具有多少轴。 这里使用的关键属性是机器人的[[MC-Basic:robot.BASE|base]]变换,如[[Robot Working Frames|Robot_Working_Frames]]所述 |
| | | |
− | 主机器人是从机器人跟随的移动坐标系的主源。 将使用相同的同步算法,除了与跟踪窗口和触发相关的问题(这两个将是无关紧要的)。
| + | == 基坐标系属性 == |
| + | 机器人有两个笛卡尔坐标系:世界(机器人)坐标系和基坐标系。 |
| | | |
− | 跟踪期间从机器人的相对运动是允许的,在常规的输送机跟踪以相同的方式执行。
| + | === 世界(机器人)坐标系 === |
| | | |
− | 机器人的相互空间关系将通过新添加的基坐标系和移动坐标系的对象位置偏移来定义。 与此同时,可以实现不同点类型(世界(机器人)框架)和/或不同NDOF的机器人的相互协作。
| + | 在由''q = (q<sub>1</sub>,q<sub>2</sub>,q<sub>3</sub>, .... , q<sub>n</sub>)''定义的机器人姿势中,n是机器人的NDOF。 世界(机器人)参考坐标由下式定义: |
| | | |
| + | <center>'''''p<sub>world</sub> = DirectKinematics (q)'''''</center> |
| | | |
| + | 其中p可以是:p =(x,y,z,偏航,俯仰,滚动)取决于机器人运动学。 |
| | | |
− | {{Note/Important| 只有在机器人具有相同点类型的情况下,才能使用完整的位置(位置+姿态)。 在具有不同点类型的机器人的情况下,仅跟踪主机器人位置的位置部分(X,Y,Z)。 姿态角(Yaw,Pitch,Roll)将 '''被忽略 '''}} | + | {{Note|为了简化讨论,我们假定该'''''工具'''''包含在正运动学计算中。这里省略了工件和工作台的坐标系。}} |
| | | |
| | | |
− | {{Note/Important| 在具有相同点类型的机器人的情况下,用户能够选择是仅仅在位置或姿态坐标上进行跟踪或者在两者上进行跟踪。请参阅[[MC-Basic:movingFrame.TYPE|MovingFrame.type]]属性。}}
| + | === 基坐标系 === |
| | | |
| + | 基坐标系是由[[MC-Basic:robot.BASE|robot.base]]属性移动的世界(机器人)坐标系: |
| | | |
− | {{Note| 在跟踪期间检测(监控)轴的位置限制和加速度/速度阈值,方式与常规传送带跟踪相同。 }}
| + | p<sub>base</sub> = base:p<sub>world</sub> |
| | | |
| + | 其中''':'''是复合运算符。 |
| | | |
− | {{Note/Danger|需要重要强调的是此功能(使用基于机器人的运动坐标系的元素协作)'''不会'''阻止机器人碰撞。 机器人防碰撞完全脱离了这个主题。}}
| + | == 全局基坐标属性(全局坐标) == |
| | | |
− | = 系统设置 =
| + | 所有用户输入(目标运动指令点,运动参考坐标等)都在基座坐标系中给出。 然而,这些系统可以与机器人不同(例如,R1具有XYZR和R2具有XYZYPR)。 因此,我们假设一个共同的(全局)基坐标系,将所有机器人转换到一个系统: |
| | | |
− | == 数据创建 == | + | p<sup>1</sup><sub>global</sub> = '''R1.glbalbase''':R1.base:R1.DirectKinemaitcs(R1.pcmd) <br> |
| + | p<sup>2</sup><sub>global</sub> = '''R2.glbalbase''':R2.base:R2.DirectKinemaitcs(R2.pcmd) <br> |
| + | p<sup>3</sup><sub>global</sub> = '''R3.glbalbase''':R3.base:R3.DirectKinemaitcs(R3.pcmd) <br> |
| + | ...<br> |
| + | p<sup>m</sup><sub>global</sub> = '''Rm.glbalbase''':Rm.base:Rm.DirectKinemaitcs(Rm.pcmd) <br> |
| | | |
− | ControlStudio中有两种运动参考系(MF)对象:基于轴和基于机器人。它们都以与使用该命令的基于轴的方式以相同的方式创建:<br>
| + | 假设系统有''m''个机器人 |
| | | |
− | <center>'''COMMON SHARED <mf name> as moving frame of <mf-type>'''</center><br>
| + | 这是通过添加始终与实际机器人点类型无关的[[MC-Basic:robot.GLOBALBASE|<robot>.globalbase]]位置来实现的,在XYZYPR系统中给出 |
| | | |
− | 基于轴和基于机器人的运动参考系之间的差异在提供给 '''[[MC-Basic:movingFrame.MASTERSOURCE| MasterSource]]''' 命令的参数中。在<u>基于轴</u>的MF中,仅使用主轴作为主源。此外,在<u>基于轴</u>的MF中,所有位置MF的属性(零,此处,上行,下行)的点类型与MF的点类型(即<mf-type>)相同。<br>
| |
| | | |
− | 在<u>基于机器人</u> 的MF的主源是具有自己的点类型的机器人元素。在<u>基于机器人</u>的MF中,MF的位置和机器人的位置之间的关系将使用新引入的属性来定义。 ''(参考: Translation Transformation )''
| + | <div style="background-color:yellow;"> |
| + | '''为了使全局坐标系尽可能的使用,运动命令(MOVE,MOVES,MOVESKD,CIRCLE ...)的扩展方式除了目前仅允许的机器人点类型的位置之外,还可以接受XYZYPR点类型的位置。 |
| + | ''' |
| + | </div> |
| | | |
− | == 主源 ==
| |
| | | |
− | [[MC-Basic:movingFrame.MASTERSOURCE|<Moving Frame>.MasterSource]]属性将允许将机器人元素的命令(setpoint)或反馈(here)添加为主站,以下句法将有效:
| + | {{Note|给定的扩展适用于最多6个NDOF(不超过6个)的机器人。}} |
| | | |
− | [[MC-Basic:movingFrame.MASTERSOURCE|<Moving Frame>.MasterSource]] = <robot>.setpoint
| |
− | and
| |
− | [[MC-Basic:movingFrame.MASTERSOURCE|<Moving Frame>.MasterSource]] = <robot>.here
| |
| | | |
− | {{Note|'''master'''<robot>的点类型不必与<nowiki><moving frame></nowiki>的点类型匹配! | + | {{Note| 如果机器人点类型已经是XYZYPR,则全局和基本属性具有绝对相同的功能,可以相互添加。 他们都可以使用,但我们强烈建议只使用一个(而另一个保留为零),以减少混乱。}} |
− | 但是,<nowiki><moving frame></nowiki>和'''从'''机器人的类型必须匹配!!}}
| |
| | | |
| | | |
− | === MF.TYPE ===
| |
− | 将主机器人的位置分配给主源会自动在MF和主机器人的位置和方向之间施加一定的关系。'''下表说明了主站和从站点类型与<MF> .type值之间的关系。'''
| |
| | | |
− | → 将[[MC-Basic:movingFrame.MASTERSOURCE|MasterSource]]设置为主机器人位置之一(SetPoint或Here)将自动将Moving-Frame'''[[MC-Basic:movingFrame.TYPE|type]]'''更改为其默认值(参见表)并将其锁定。<u>锁定</u>意味着根据给定的MasterSource,只允许某些MF.type值(表中带有“?”符号)。并且如果用户尝试分配任何其他值,将返回错误。
| + | 与此同时,还有两个新的属性: |
| | | |
| + | * [[MC-Basic:robot.GLOBALSETPOINT|<robot>.globalsetpoint]]类似于常规[[MC-Basic:robot.SETPOINT|<robot>.setpoint]] |
| + | * [[MC-Basic:robot.GLOBALHERE|<robot>.globalhere]] 类似于常规[[MC-Basic:robot.HERE|<robot>.here]] |
| | | |
− | {| border = "1" valign = "top"
| + | == 例子 == |
− | |- valign="top" align = "center"
| |
− | | [[MC-Basic:movingFrame.TYPE|<mf>.'''type''']] value || '''axis-MF'''|| '''robot-MF''' <br> pointtype(position)<sub>robot</sub> = robot-MF pointtype(position)<sub>MF</sub> <br>''or:''<br> pointtype(orientation)<sub>robot</sub> = robot-MF pointtype(orientation)<sub>MF</sub>|| '''robot-MF''' <br> neither position or orientation match
| |
− | |-
| |
− | | 0 (linear) ||''' ✓'''(default) || invalid || invalid
| |
− | |-
| |
− | | 1 (rotary) || ✓ || invalid || invalid
| |
− | |-
| |
− | | 2 (rotary de-coupled) || ✓ || invalid || invalid
| |
− | |-
| |
− | | 3 (position only) || N/A || ✓ ||'''✓''' (default)
| |
− | |-
| |
− | | 4 (orientation only) || N/A || ✓ || invalid
| |
− | |-
| |
− | | 5 (both pos. and ori.) || N/A || '''✓''' (default) || invalid
| |
− | |-
| |
− | |}
| |
− | <br>
| |
| | | |
| + | 给定SCARA和PUMA机器人在同一个生产单元中,SCARA机器人在PUMA机器人的上方: |
| | | |
− | ====一些最常用的点类型的类型分配表 ====
| |
| | | |
− | {| border = "1" valign = "top"
| + | [[File:Global Frames.png]] |
− | |- valign="top" align = "center"
| |
− | | || colspan="8" |'''master-robot'''
| |
− | |-
| |
− | |rowspan="8"|'''MF''' || || '''X''' || '''XY''' || '''XYZ''' || '''XYZR''' || '''XYZYPR''' || '''YPR''' || '''YP'''
| |
− | |-
| |
− | | '''X''' || p || p || p || p || p || p || p
| |
− | |-
| |
− | | '''XY''' || p || p || p || p || p || p || p
| |
− | |-
| |
− | | '''XYZ''' || p || p || p || p || p || p || p
| |
− | |-
| |
− | | '''XYZR''' || p || p || p || p/o/po || p || p || p
| |
− | |-
| |
− | | '''XYZYPR''' || p || p || p || p || p/o/po || o || p<br>(inactive)
| |
− | |-
| |
− | | '''YPR''' || p<br>(inactive) || p<br>(inactive) || p<br>(inactive) || p<br>(inactive) || o || o || p<br>(inactive)
| |
− | |-
| |
− | | '''YP''' || p<br>(inactive) || p<br>(inactive) || p<br>(inactive) || p<br>(inactive) || p<br>(inactive) || p<br>(inactive) || o
| |
− | |-
| |
− | |}
| |
| | | |
− | * p(3) 仅位置
| |
− | * o(4) 仅姿态
| |
− | * po(5) 位置和姿态
| |
| | | |
| + | === 使用全局坐标系 === |
| | | |
− | {{Note| 在由主机器人点类型不足以驱动的纯方向运动参考系的情况下,类型将被设置为位置(3),但是运动参考系将无效(不能运动}}
| + | 执行以下运动命令: |
| | | |
| + | '''Move scara target<br> |
| + | '''Move puma target<br> |
| + | 其中目标是点类型XYZYPR的位置<br> |
| + | 将其转移到每个机器人的基本坐标系中: |
| | | |
− | [[File:AXY;MovingFrameType.png]]
| + | <u>对Scara:</u> |
| | | |
− | ====例子 1 ====
| + | target<sup>scara</sup><sub>B</sub> ← scara.gbase<sup>-1</sup>:target |
− | <pre>
| |
− | common shared MF as moving frame of XYZR
| |
− | MF.mastersource = SCARA.setpoint
| |
− | </pre>
| |
− | 将MF.type自动设置为 '''5'''(位置和姿态 - 默认值)!
| |
− | | |
− | 尝试将其更改为主机不支持的值(例如MF.type = 0)源将返回错误:
| |
− | | |
− | ====例子 2 ====
| |
− | <pre>
| |
− | common shared MF as moving frame of XYZR
| |
− | common shared gXYZ as group axnm = a1 axnm = a2 axnm = a3 model=1 of XYZ
| |
− | MF.mastersource = gXYZ.setpoint
| |
− | </pre>
| |
− | 在这种情况下,我们具有相同位置类型的情况,但是具有不同(或不存在)姿态类型的情况。 MF.type自动为'''3'''(仅位置)!
| |
− | | |
− | | |
− | ====例子 3 ====
| |
− | <pre>
| |
− | common shared MF as moving frame of XYZYPR
| |
− | common shared TILT as group axnm = a1 axnm = a2 axnm = a3 model=1 of YPR
| |
− | MF.mastersource = TILT.setpoint
| |
− | </pre>
| |
− | 在这种情况下,我们具有相同姿态类型但具有不同(或不存在)位置类型的情况。 MF.type自动为'''4'''(仅限姿态)!!
| |
− | | |
− | | |
− | | |
− | ====例子 4 ====
| |
− | <pre>
| |
− | common shared MF as moving frame of XYZ
| |
− | common shared TILT as group axnm = a1 axnm = a2 axnm = a3 model=1 of YPR
| |
− | MF.mastersource = TILT.setpoint
| |
− | </pre>
| |
− | 在这种情况下,我们有两种点类型没有任何共同之处的情况 因此,类型将自动设置为3(仅位置)。
| |
− | | |
− | = 新属性 =
| |
− | | |
− | == 运动参考系基坐标偏移 ==
| |
− | 主机和从机器人之间的相互空间关系(位置和姿态)由MF的BASE属性描述。<br>
| |
− | | |
− | * [[ MC-Basic:movingFrame.BASE| <moving-frame>.BASE]]是一个主机器人到从属的偏移量。 这是一个运动参考系的属性。
| |
− | | |
− | == 对象位置 ==
| |
− | | |
− | 由两个机器人运动的对象或两个机器人的端点的相对位置彼此描述由'''[[ MC-Basic:movingFrame.OBJECTLOC| <moving-frame>.OBJECTLOC]]''' Moving-Frame属性。它描述从实际主站的源坐标(SetPoint或Here)中从站设定点的相对位置和姿态。它与父MF(或从机器人)保持相同的点类型。
| |
− | | |
− | 参考:[[ MC-Basic:movingFrame.OBJECTLOC| Object Location Property]]
| |
− | | |
− | {{Note| [[ MC-Basic:movingFrame.OBJECTLOC| OBJECTLOC]]可用于在连续的拾取和应用中更新新的接触点位置,类似于基于轴的MF的TRIGGER命令。}}
| |
− | | |
− | = 主从关系 =
| |
− | | |
− | 一旦设置了MF参数,则主站和从站位置之间的连接由以下公式定义。
| |
− | <center>
| |
− | '''slave.robot = MS2MF( MF.base<sup>-1</sup> : MF.MSource:MF.ObjectLoc )'''
| |
− | </center> | |
− | | |
− | 其中MF.MSource是<master> .setpoint或<master> .feedback
| |
− | | |
− | === MS2MF函数定义为 ===
| |
− | | |
− | '''M'''aster '''S'''ource to '''M'''aster '''F'''rame 函数: A = MS2MF(B) 定义为:
| |
− | | |
− | A->position = '''p-projection''' (B->position)<br>
| |
− | A->orientation = B->orientation (''for MF.types: 4 and 5 only!'') <br>
| |
− | | |
− | * '''p-projection'''是简单的矩阵乘法,形式如下: '''A->position = TranslationTransformation * B->position'''
| |
− | | |
− | | |
− | <!-- this was original idea:
| |
− | | |
− | A->position = '''p-projection''' * B->position<br>
| |
− | A->orientation= '''q-projection''' * [[AXY:MC-Basic:movingFrame.SLAVEORIENTATION|MF.SLAVEORINETATION]] * B->orientation
| |
− | | |
− | | |
− | * The <nowiki>* MF.SLAVEORINETATION</nowiki> represents multiplication by rotation matrix (quaternion, orientation-vector) for additional orientation vector manipulation.
| |
− | | |
− | * '''p-projection''' is a simple projection mapping that copies (X,Y,Z) into/from (X,Y) coordinatewise (X to X, Y to Y, Z to Z).
| |
− | * '''q-projection''' is orientation vector projection, using quaternions it is easily represented by:
| |
− | <br>
| |
− | | |
− | if:
| |
− | <math> Q_{XYZ} = \begin{bmatrix}
| |
− | \varphi & , & \vec n_{xyz} \\
| |
− | \end{bmatrix}
| |
− | </math>
| |
− | and:
| |
− | <math> \vec n_{xyz} = \begin{bmatrix}
| |
− | nx & ny & nz \\
| |
− | \end{bmatrix}
| |
− | </math>
| |
− | | |
− | <br>
| |
− | Then:
| |
− | <math> Q_{XYZ} := {qprojection} (Q_{XY} ) = \begin{bmatrix}
| |
− | \varphi & , & \vec n_{xy} \\
| |
− | \end{bmatrix}
| |
− | </math>
| |
− | where <math> \vec n_{xy} </math> by projecting the unit vector <math> \vec n_{xyz} </math> tot he XY plane and normalizing it again.
| |
− | | |
− | In other words the unit vector of orientation will be immersed into other's robot work-space (keeping it normalized, i.e. ||n|| = 1) while keeping the same rotation angle <math> \varphi </math>.
| |
− | | |
− | Due to the fact that projected unit orientation vector is in the same half-space the actual rotation angel sign will be updated.
| |
− | | |
− | For example:
| |
− | | |
− | Having Yaw-Pitch-Roll space with angles: #{0, 180,90} (vector turned down with roll of 90 degrees) will be projected into Roll space as:
| |
− | | |
− | <nowiki>#{-90}</nowiki> = '''q-projection''' (#{0, 180,90}) , this due to the fact that n<sub>xyz</sub> is projected into [0,0,-1]
| |
− | | |
− | -->
| |
− | | |
− | == 点类型转换 ==
| |
− | | |
− | <u>Translation Transformation</u>
| |
− | | |
− | 与普通轴相反 - MF机器人—MF可以具有与从动机器人不同的点类型。为了将位置从MF点类型转换为从机器人点类型[[MC-Basic:movingFrame.TranslationTransformation|'''<moving-frame>.TranslationTransformation''']]定义3x3双矩阵属性。
| |
− | | |
− | * 定义了MF.MasterSource的点类型到MF的机器人类型的平移(位置)部分的变换矩阵。
| |
− | * 矩阵阶数通过MF和主机器人的位置维度自动调整。
| |
− | <br>
| |
− | | |
− | {| border = "1"
| |
− | |-
| |
− | | || Master-Source: XY ||Master-Source: XYZ
| |
− | |-
| |
− | |MF-type: XY || TranslationTransformation[1-2][1-2] || TranslationTransformation[1-2][1-3]
| |
− | |-
| |
− | |MF-type: XYZ || TranslationTransformation[1-2][1-3] || TranslationTransformation[1-3][1-3]
| |
− | |}
| |
− | | |
− | | |
− | 例如, 定义:<br>
| |
− | <pre>
| |
− | common shared MF as moving frame of XYZYPR
| |
− | MF.MasterSource = GXY
| |
− | </pre>
| |
− | 自动定义:
| |
− | | |
− | [[MC-Basic:movingFrame.TranslationTransformation|TranslationTransformation]][*][*] = <math>
| |
− | \begin{bmatrix}
| |
− | 1 & 0 \\
| |
− | 0 & 1 \\
| |
− | 0 & 0 \\
| |
− | \end{bmatrix}
| |
− | </math>
| |
− | | |
− | or: '''TranslationTransformation is 2x3 matrix!'''
| |
− | | |
− | {{Note| 在MF的位置坐标数少于MasterSource的情况下,剩余的坐标将由 '''MF.BASE''' 相应的坐标值分配。}}
| |
− | | |
− | | |
− | | |
− | <!-- This was just an idea but I want to keep it here as a reminder:
| |
− | | |
− | === Orientation Transformation ===
| |
− | | |
− | * defines a matrix for the transformation of the orientation part '''from''' MF.MasterSource's point-type '''to the''' MF's robot-type.
| |
− | * the matrix dimension is automatically adjusted by position dimension of MF and the master-source robot.
| |
− | * automatic matrix-dimension adjustment:
| |
− | | |
− | {| border = "1"
| |
− | |-
| |
− | | || Master-Source: Roll ||Master-Source: Pitch Roll || Master-Source: Yaw Pitch Roll
| |
− | |-
| |
− | |MF-type: Roll || TranslationTransformation[1][1] || TranslationTransformation[1-2][1] || TranslationTransformation[1-3][1]
| |
− | |-
| |
− | |MF-type: Pitch Roll || TranslationTransformation[1][1-2] || TranslationTransformation[1-2][1-2] || TranslationTransformation[1-3][1-2]
| |
− | |-
| |
− | |MF-type: Yaw Pitch Roll || TranslationTransformation[1][1-3] || TranslationTransformation[1-2][1-3] || TranslationTransformation[1-3][1-3]
| |
− | |}
| |
− | | |
− | | |
− | for example:<br>
| |
− | defining:
| |
− | <pre>
| |
− | common shared MF as moving frame of XYZR
| |
− | MF.MasterSource = PUMA.Setpoint
| |
− | </pre>
| |
− | automatically defines:
| |
− | | |
− | [[AXY:MC-Basic:movingFrame.OrientationTransformation|OrientationTransformation]][*][*] = <math>
| |
− | \begin{bmatrix}
| |
− | 0 & 0 & 1 \\
| |
− | \end{bmatrix}
| |
− | </math>
| |
− | | |
− | or: '''OrientationTransformationis 3x1 matrix!'''
| |
− | | |
− | == Point Type transformations ==
| |
− | | |
− | Contrary to the ordinary axes-MF robot-MF can have different point type from the slaved robot. In order to transform from MF point type into slave-robot point type new property has been defined. The transformation is looking for the closest location inside slave-robot working space.
| |
− | | |
− | | |
− | === Slave Orientation ===
| |
− | | |
− | '''[[AXY:MC-Basic:movingFrame.SLAVEORIENTATION|MF.SLAVEORIENTATION]]''' is a fixed type YPR (Yaw-Pitch-Roll, See: [[AXY:Kinematics_Package#XYZ_Yaw_Pitch_Roll|Yaw Pitch Roll]]) orientation vector used to rotate moving frame orientation vector into slave-robot orientation coordinates.
| |
− | | |
− | Let's define the product of moving frame master source as intermediate SR variable:
| |
− | | |
− | SR := ( MF.base<sup>-1</sup> : MF.MSource:MF.ObjectLoc )
| |
− | | |
− | then the SR variable will be of the same point-type as the moving frame source MF.
| |
− | in order to translate it into slave's robot command we do:
| |
− |
| |
− | slaverobot.position = '''p-projection'''(SR.position)<br>
| |
− | slaverobot.oreintation = '''q-projection'''(MF.SLAVEORINTATION*SR.orientation)
| |
− | | |
− | {{Note| In case when number of position coordinates of MF is less then of MasterSource the remaining coordinate will be assigned by the '''MF.BASE''' corresponding coordinate value.}}
| |
− | | |
− | {{Note| In case when number of position coordinates of MF is less then of MasterSource the remaining coordinate will be assigned by the MF.base corresponding coordinate value.}}
| |
− | -->
| |
− | | |
− | = 受影响(已更改)命令 =
| |
− | | |
− | == 激活(同步) ==
| |
− | | |
− | 设置'''[[MC-Basic:robot.SLAVE|<robot>.slave]] = 5'''将立即进入同步跟踪模式,不需要触发命令。由于基于机器人MF的工作窗口不存在,'''[[MC-Basic:movingFrame.ZERO|MF.ZERO]]''' 将在进入'''"slave=5"'''时返回当前的MF位置! 在此之后,从机器人将尝试与运动帧位置同步: '''MovingFrame(t) = MF(t) - MF(t0)'''<br>
| |
− | 其中t0是发出"slave=5" ''的时刻。
| |
− | ''(参考:[[Element Coordination/Absolute Movements During Conveyor Tracking|Absolute_Movements_During_Conveyor_Tracking]])''
| |
− | | |
− |
| |
− | | |
− | 其中MF(.)是:
| |
− | | |
− | '''MF(t) = MS2MF( MF.base<sup>-1</sup> : Master(t):MF.ObjectLoc ) '''
| |
− | | |
− | Master(t) - 机器人主轴在时刻t的位置。<br>
| |
− | '''MS2MF''' 在[[Element Coordination#MS2MF:|Master Source to Moving Frame function]]定义<br>
| |
− | | |
− | 与MC-Basic语言变量的关系是显而易见的:
| |
− | | |
− | <nowiki><mf>.</nowiki>'''here''' = MF(t)
| |
− | | |
− | <nowiki><mf>.</nowiki>'''zero''' = MF(0) ''(参考[[MC-Basic:movingFrame.ZERO|MovingFrame.ZERO]])''
| |
− | | |
− | | |
− | 这意味着,如果主机器人没有运动,则从机器人的全部从运动开始跟踪(slave=5, 同步或不同步)的位置与自由从机器人(slave=0)的位置是一样的。换句话说,'''如果'''您想要连接到主机器人的对象运动到某些点,只需停止主机器人,并将从站运动到对象上的所需目标点。
| |
− | | |
− | | |
− | {{Note|初始化跟踪后运动到MF.ZERO会使从机器人与主机器人的位置完全同步。}}
| |
− | | |
− | == 停用(去同步) ==
| |
− | | |
− | 设置'''[[MC-Basic:robot.SLAVE|<robot>.slave]] = 0'''将立即进入去同步模式,将跟踪速度平滑地降低到零。 (跟踪速度的不是追加运动的速度)。
| |
− | | |
− | {{Note| 在基于机器人的MF中,使用以下参数完成使用笛卡尔空间(位置,速度,加速度)中运动的初始值的去同步:<br>
| |
− | | |
− | * [[MC-Basic:robot.VELOCITYDESYNCTRAN|VELOCITYDESYNCTRAN]] , [[MC-Basic:robot.VELOCITYDESYNCROT|VELOCITYDESYNCROT]]<br>
| |
− | * [[MC-Basic:robot.ACCELERATIONDESYNCTRAN|ACCELERATIONDESYNCTRAN]] , [[MC-Basic:robot.ACCELERATIONDESYNCROT|ACCELERATIONDESYNCROT]]<br>
| |
− | * [[MC-Basic:robot.JERKDESYNCTRAN|JERKDESYNCTRAN]] , [[MC-Basic:robot.JERKDESYNCROT|JERKDESYNCROT]]<br>
| |
− | | |
− | 在同步期间,可以激活与另一个机器人的同步或者只是平面运动。 (与基于轴的MF相同)
| |
− | | |
− | }}
| |
− | | |
− | == Is Moving Frame Synchronized ==
| |
− | ''[[MC-Basic:robot.ISMOVINGFRAMESYNCHRONIZED| Is-Moving-Frame-Synchronized]]'标志将具有与基于轴的MF相同的功能。
| |
− | | |
− | | |
− | == 跟踪参数 ==
| |
− | | |
− | 参数:
| |
− | | |
− | * '''VelocityMaxTrans, VelocityMaxRot, AccelerationMaxTrans, AccelerationMaxRot, JerkMaxTrans, JerkMaxRot''' <br>
| |
− | * '''Dampingfactor, FilterFactor, MaxFlops'''<br>
| |
− | | |
− | 将会以相同的方式用于基于轴的MF中,而不是作用于主轴和跟踪变量之间的标量距离(<math>dp</math>),主机器人的位置与从机器人主跟踪变量之间的的笛卡尔距离(<math>\vec dp = \vec p_{master} - \vec p_{track}</math>)和欧拉角的距离(<math>\vec de = \vec e_{master} - \vec e_{track}</math>)用于建立同步的标准。
| |
− | | |
− | == 触发 ==
| |
− | 如在机器人的MF中,工作窗口的概念和其中的对象不存在,[[MC-Basic:TRIGGER| Trigger]]命令将对基于机器人的运动框架没有影响。 跟随的实际时刻始终始终以slave = 5的设定,独立于先前使用的触发命令。
| |
− | | |
− | == NOI ==
| |
− | 在MF机器人的情况下,'''[[MC-Basic:movingFrame.NUMBEROFITEMS|NOI]]''将始终为-1。
| |
− | | |
− | == Is In Window ==
| |
− | [[MC-Basic:movingFrame.ISINWINDOW| Is In Window]] 标志将总是返回1(true),实际上这种类型的MF中没有工作窗口的概念。
| |
− | | |
− | == 未使用的运动参考属性 ==
| |
| | | |
− | * '''Upstream, Downstream, Upmaster, Downmaster''' <br>
| + | 其中 "←" 表示仅复制X,Y,Z和旋转坐标 |
− | 由于工作窗口概念不存在于基于机器人的MF中,这些属性将对MF-机器人操作绝对没有影响。
| |
| | | |
− | ==下一个项目命令 ==
| |
| | | |
− | * [[MC-Basic:NEXTITEM|'''NEXTITEM''']]命令对MF机器人操作没有影响。
| + | <u>对Puma:</u> |
| | | |
− | = 运动参考坐标变换 = | + | target<sup>puma</sup><sub>B</sub> = puma.gbase<sup>-1</sup>:target |
| | | |
− | 从机器人连接到主轴通过运动参考系分配从站主坐标系的属性:
| + | 这里我们有"=" 符号,因为puma和全局坐标系具有相同的点类型 |
− | <pre>
| |
− | <slaverobot>.MasterFrame = <master frame>
| |
− | </pre>
| |
| | | |
− | 主参考系是从机和主机之间的链接。它包括主源的定义,可以是机器人笛卡尔指令点('''SETPOINT''')或机器人的笛卡尔反馈('''HERE'''):
| + | ==== 数字示例 ==== |
| | | |
| <pre> | | <pre> |
− | <master frame>.MasterSource = <masterrobot>.SETPOINT
| + | Move scara #{100,100,700,0,0,50} |
| + | Move puma #{100,100,700,0,0,50} |
| </pre> | | </pre> |
| | | |
− | == 基坐标变换 ==
| + | 有: |
− | | |
− | 主参考系将从机器人坐标系的空间关系(距离和旋转)定义到主坐标系: '''<Master Frame>.Base'''
| |
− | | |
− | [[File:COOP 2 ROB BASE.png|700px|border| Two robots with a defined distance between them using MF.BASE]]<br>
| |
− | | |
− | == 定义对象 ==
| |
− | | |
− | 总的来说,对象由两侧的两个机器人举起。 从主坐标系看,我们有两点(在主机器人的世界(机器人)坐标系):
| |
| | | |
− | <pre> | + | <pre>scara.gbase = #{0,100,700,0,0,0} |
− | <masterrobot>.setpoint
| + | scara.base = #{100,100,0,0} |
− | <masterrobot>.setpoint:<movingframe>.objectloc
| |
− | </pre>
| |
| | | |
− | 物体的第二点也可以通过从机器人到达(从主机器人的世界(机器人)坐标系上看):
| + | puma.gbase = #{0,0,0,0,0,0} |
− | <pre>
| + | puma.base = #{200,100,0,0,0,0} |
− | <movingframe>.base:<slaverobot>.setpoint
| |
| </pre> | | </pre> |
| | | |
− | [[File:COOP 2 ROB OBJ.png|700px|border|Usage of OBJECTLOC]]
| + | 我们获得'''SCARA'''的本地目标位置(在SCARA的基坐标系中): |
− | | |
− | <Moving Frame>.ObjectLoc 是与运动参考系相同的点类型的运动参考系数据对象的位置属性。例如,例如,这意味着如果将运动参考系声明为XYZR(''common shared MF as moving frame of XYZR''),则OBJECTLOC也将是'''XYZR'''类型的位置。
| |
− | OBJECTLOC指定从机器人的的末端执行器相对于主机器人的末端点(实际上是主坐标系)的位置和姿态。
| |
− | | |
− | == 完成从机器人命令计算示例 ==
| |
| | | |
− | [[File:COOP 2 ROB FRM.png|700px|border|Frame calculations in two-robot case.]]
| |
| | | |
| + | <nowiki>#</nowiki>{0,100,700,0,0,0}<sup>-1</sup> : #{100,100,700,0,0,50}为 #{'''100''' , '''0''' , '''0''' , 0 , 0 ,''' 50'''},可以写为:<br> |
| + | <nowiki>#</nowiki>{100,0,0,50}← #{0,100,700,0,0,0}<sup>-1</sup> : #{100,100,700,0,0,50} |
| + | 表示目标点在SCARA的基坐标系是: '''<u>#{100,0,0,50}</u>''' |
| | | |
− | mf.base = '''#{100,100,0,45}''' <br>
| + | '''PUMA'''机器人本地目标点以类似的方法计算: |
− | mf.base<sup>-1</sup> = '''#{-141,100,0,-45}'''<br>
| |
− | mf.objectloc = '''#{80,0,0,180}'''<br>
| |
− | master.setpoint = '''#{130,-72,0,0}'''<br>
| |
| | | |
− | slave.setpoint = '''mf.base<sup>-1</sup>:master.setpoint:mf.objectloc'''<br>
| + | <nowiki>#</nowiki>{200,100,0,0,0,0}<sup>-1</sup> : #{100,100,700,0,0,50}为 #{'''-100''' , '''0''' , '''700''' , 0 , 0 ,''' 50'''}, which we can write as:<br> |
− | slave.setpoint = '''#{-43 , -200 , 0 ,135 }'''<br>
| + | <nowiki>#</nowiki>{-100,0,700,0,0,50}← #{200,100,0,0,0,0}<sup>-1</sup> : #{100,100,700,0,0,50} |
| + | 表示目标点在PUMA机器人基坐标系上为: '''<u>#{-100,0,700,0,0,50}</u>''' |
| | | |
| | | |
− | * 如果两个机器人具有相同的(XYZR)点类型,并且使用默认的MF.type值(''5-位置和方向''),则上述计算为真。
| |
| | | |
− | == 工作在同一对象上的三个机器人的例子 ==
| + | {{Note| PUMA运动学中的GBASE和BASE表示相同的事情,尽管可以给出不同的值(然后使用组合gbase:base),但强烈建议仅使用一个,另一个保留为零,即:#{0,0,0,0,0,0} }} |
| | | |
− | 这是三机器人协作的一个例子。 一个机器人被定义为主机,另外两个是从机。 每个从机器人通过它的主参考系连接到主机器人,与主体机器人距对象不同的距离以及不同的夹点上。
| + | === 使用基于机器人的运动参考系 === |
| | | |
− | [[File:COOP 3 ROB.png|700px|border|Frame Calculation in three-robot case]]
| + | 可以使用基于机器人的运动参考系实现相同的功能示例。 |
| | | |
− | 在这个例子中,我们将定义两个运动参考系,每个参考系都有不同的OBJECTLOC。
| + | 我们假设PUMA机器人是主机器人: |
| | | |
− | 第一个运动参考系:
| + | common shared MF as Moving Frame of XYZR |
− | <pre>
| |
− | Common Shared MF1 As Moving Frame Of XYZR
| |
− | MF1.MasterSource = <masterrobot>.SETPOINT
| |
− | MF1.BASE = #{..., ..., ..., 0}
| |
− | MF1.OBJECTLOC = #{L,..., ..., 180}
| |
− | </pre>
| |
| | | |
− | 第二个运动参考系:
| |
| <pre> | | <pre> |
− | Common Shared MF2 As Moving Frame Of XYZR
| + | MF.MSource = puma.setppoint |
− | MF2.MasterSource = <masterrobot>.SETPOINT
| + | MF.OBJECTLOC = #{0,0,0,0} |
− | MF2.BASE = #{..., ..., ..., 0}
| + | MF.BASE = Inverse(#{0,100,700,0,0,0}) |
− | MF2.OBJECTLOC = #{SQRT(3)*L,L/2, ..., -150}
| + | scara.MasterFrame = MF |
| + | scara.slave = 5 |
| </pre> | | </pre> |
| | | |
− | * '''假设对象是边长L的双边(等边)三角形。'''
| + | 现在发行:<br> |
− | | |
− | {{Note| 第二个对象位置MF的方向部分为-150度。 第一个从机器人Xtool轴与主机机器人的Xtool轴完全相反。 而第二个从机器人的Ytool轴正好与主机器人的Ytool轴完全相反。}}
| |
− | | |
− | = 算法和软件设计 =
| |
− | | |
− | * 主从关系与基于轴的MF和基于机器人MF的原理相同。 如果MF静止或运动,底层的思想是具有相同的运动方式。主要描述如下:[[Element Coordination/Absolute Movements During Conveyor Tracking|Absolute_Movements_During_Conveyor_Tracking]]<br>
| |
− | | |
− | * 基于轴的运动参考系跟踪算法基于预测会合点并通过速度,加速度和加加速度常数来限制运动,这里描述如下:[[AXY:Element Coordination/One Dimensional Tracking Algorithm|One_Dimensional_Tracking_Algorithm]]<br>
| |
− | | |
− | * 相同的算法(跟踪)应用在3维位置矢量(欧拉角)在此说明: [[AXY:Element Coordination/Multi Dimensional Tracking Algorithm (Position)|Position_Tracking_Algorithm]]<br>
| |
− | | |
− | * 应用于三维方向矢量的相同算法(跟踪)在这里说明:[[AXY:Element Coordination/Multi Dimensional Tracking Algorithm (Orientation)|Orientation_Tracking_Algorithm]]
| |
− | <br> | |
− | | |
− | * 这里描述了用于多机器人使用的'''基坐标系'''和'''世界(机器人)坐标系'''的'''全局坐标系'''的概念[[Element Coordination/Global Coordinates|Global Coordinates]]
| |
| | | |
− | * 此处显示了基于轴的MF数据结构的扩展[[AXY:Element Coordination/Software Design| Software_Design]<br>
| + | Move puma target<br> |
| + | ''和''<br> |
| + | Moves MF.zero<br> |
| | | |
− | <!-- == Issues List: ==
| + | 将puma和scara移动到同样的位置(目标)。<br> |
− | {{Bugzilla|5954}}<br>
| |
− | {{Bugzilla|5955}}<br>
| |
− | {{Bugzilla|5957}}<br>
| |
− | {{Bugzilla|5960}}<br>
| |
− | {{Bugzilla|5963}}<br>
| |
− | {{Bugzilla|6058}}<br>
| |
− | {{Bugzilla|6075}}<br>
| |
− | -->
| |
− | | |
− | = 例子 =
| |
− | | |
− | == 例子 1. 两种不同的机器人运动学 ==
| |
− | | |
− | 两个不同类型的机器人运动学之间的协作。
| |
− | | |
− | [[File:AXY;SCARAPUMA_COO.png|700px|border|Cooperation between SCARA and PUMA robot kinematics, PUMA robot is the master frame here]]
| |
− | | |
− | | |
− | 运动参考系定义:
| |
− | <pre>
| |
− | Common Shared MF as Moving Frame of XYZR
| |
− | </pre>
| |
− | | |
− | 将其链接到源(主):
| |
− | <pre>
| |
− | MF.MasterSource = Puma.Setpoint
| |
− | </pre>
| |
− | | |
− | 主源是点式XYZYPR的机器人(PUMA),链接的(SCARA)机器人或是XYZR点类型的MF。在这种情况下,MF.type将自动设置为3(仅位置)。<u> 主机器人的方位角变化对从机器人无影响。</u> 所以我们需要定义变换矩阵:
| |
− | | |
− | | |
− | <center>
| |
− | | |
− | <math>
| |
− | | |
− | \begin{bmatrix}
| |
− | X \\
| |
− | Y \\
| |
− | Z \\
| |
− | \end{bmatrix}
| |
− | = \begin{bmatrix}
| |
− | 1 & 0 & 0 \\
| |
− | 0 & 1 & 0 \\
| |
− | 0 & 0 & 1 \\
| |
− | \end{bmatrix}
| |
− | \cdot
| |
− | \begin{bmatrix}
| |
− | X \\
| |
− | Y \\
| |
− | Z \\
| |
− | \end{bmatrix}
| |
− | </math>
| |
− | | |
− | </center>
| |
− | | |
− | | |
− | 或者是以下代码:
| |
− | | |
− | <pre>
| |
− | ' First column:
| |
− | MF.TranslationTransformation[1][1]=1
| |
− | MF.TranslationTransformation[2][1]=0
| |
− | MF.TranslationTransformation[3][1]=0
| |
− | ' Second column:
| |
− | MF.TranslationTransformation[1][2]=0
| |
− | MF.TranslationTransformation[2][2]=1
| |
− | MF.TranslationTransformation[3][2]=0
| |
− | ' Third column:
| |
− | MF.TranslationTransformation[1][3]=0
| |
− | MF.TranslationTransformation[2][3]=0
| |
− | MF.TranslationTransformation[3][3]=1
| |
− | </pre>
| |
− | | |
− | | |
− | 然后偏移定义:
| |
− | | |
− | XY坐标将偏移(10,10)mm:
| |
− | <pre>
| |
− | MF.base = #{10,10,0,0}
| |
− | </pre>
| |
− | | |
− | 两个机器人工具尖端之间的距离定义为100mm:
| |
− | <pre>
| |
− | MF.ObjectLoc = #{0,0,100,0}
| |
− | </pre>
| |
− | | |
− | | |
− | 跟踪(主 - 从)定义为:
| |
− | <pre>
| |
− | Scara.Masterframe = MF
| |
− | </pre>
| |
− | and started:
| |
− | <pre>
| |
− | Scara.slave = 5
| |
− | </pre>
| |
− | | |
− | == 例子2. SCARA和倾斜台==
| |
− | | |
− | | |
− | [[File:AXY;SCARA_TILT.png]]
| |
− | | |
− | 运动参考系定义 :
| |
− | <pre>
| |
− | Common Shared MF as Moving Frame of XYZR
| |
− | </pre>
| |
− | | |
− | | |
− | 定义倾斜台机器人(对象只有偏角和俯仰角):
| |
− | <pre>
| |
− | Common Shared TiltTable As Group Axnm = Ax5 Axnm = Ax6 Model = 1 of YP
| |
− | </pre>
| |
− | | |
− | 链接到源上(主机器人):
| |
− | <pre>
| |
− | MF.MasterSource = TilTable.Setpoint
| |
− | </pre>
| |
− | | |
− | 主源是YP点类型的倾斜台,链接的机器人或MF是XYZR点类型。 MF.type将自动设置为3(仅位置)。
| |
− | | |
− | 位置变换矩阵实际上不存在,因为倾斜表没有位置组件! 所以没有什么可以设置在这里。
| |
− | | |
− | | |
− | 然后偏移定义:
| |
− | | |
− | XY坐标将偏移200 mm:
| |
− | <pre>
| |
− | MF.base = #{-200,0,0,0}
| |
− | </pre>
| |
− | | |
− | | |
− | | |
− | 定义100mm的对象位置的'''诀窍!'''
| |
− | | |
− | mf.base = '''#{Xb,Yb,Zb,Rb}''' <br>
| |
− | mf.objectloc = '''#{Xo,Yo,Zo,0}'''<br>
| |
− | master.setpoint = '''#{yaw,pitch}'''<br>
| |
− | | |
− | slave.setpoint = '''mf.base<sup>-1</sup>:master.setpoint:mf.objectloc'''<br>
| |
− | | |
− | '''即矢量[Xo,Yo,Zo]将旋转倾斜台[yaw,pitch]角度!!!'''
| |
− | | |
− | 跟踪(主-从)定义为:
| |
− | <pre>
| |
− | Scara.Masterframe = MF
| |
− | </pre>
| |
− | and started:
| |
− | <pre>
| |
− | Scara.slave = 5
| |
− | </pre>
| |
− | | |
− | == 示例3. 两个SCARA在同一件工件上工作 ==
| |
− | | |
− | 机器人跟踪机器人示例:<br>
| |
− | 两个SCARA机器人,一个主机,另一个是从机。<br>
| |
− | [[File:COOP 2 ROB SYNC.png|700px|border|Case of tracking with two SCARA robots.]]<br><br>
| |
− | <u>Setup:</u><br>
| |
− | 设置从机器人,以100mm的距离跟踪主机器人,指向面对面的方向 (180º)
| |
− | <pre>
| |
− | Common Shared MF as Moving Frame Of XYZR
| |
− | MF.MasterSource = ScaraMaster
| |
− | MF.ObjectLoc = #{100,0,0,180}
| |
− | ScaraSlave.MovingFrame = MF
| |
− | ScaraSlave.Slave=5
| |
− | </pre>
| |
− | 在接合时(即'''Slave=5''')记录零点!<br>
| |
− | <br><br><br>
| |
− | <u>等待同步并一起到达主位置:</u> <br>
| |
− | ''系统等待直到MF同步([[MC-Basic:robot.ISMOVINGFRAMESYNCHRONIZED|Is-Moving-Frame-Synchronized]]等于1),并且零点运动完成(isMoving标志不为正)''
| |
− | <pre>
| |
− | Moves MF.Zero
| |
− | While ScaraSlave.IMFS <> 1 and ScaraSlave.Ismoving > 0
| |
− | Sleep 1
| |
− | End While
| |
− | </pre><br>
| |
− | <u>做一些事情,或者只是停留在跟踪模式。</u><br><br><br>
| |
− | <u>停止.</u>去同步: <br>
| |
− | <pre>
| |
− | slave = 0
| |
− | while ScaraSlave.IMFS <> 0
| |
− | Sleep 1
| |
− | End While
| |
− | </pre>
| |
− | 在此之后,ScaraSlave将不会完全停止在ScaraMaster的路径上 ''(偏差或多或少随机并取决于主机的机器人路径和关节的减速参数)''。<br>
| |
− | <br>
| |
− | | |
− | == 例子 4. 协作 ==
| |
− | 机器人跟踪期间的相对位置,从机器人跟踪主机100mm的距离,指向面对面方向 (180º)
| |
− | | |
− | [[File:COOP 2 ROB SYNC TOOL.png|700px|border|Coordination.]]
| |
− | zoomed detail:
| |
− | [[File:COOP 2 ROB SYNC BIG.png|400px|border|Coordination detail]]
| |
− | | |
− | [[Category:Motion:MovingFrame]]
| |
− | | |
− | | |
− | == 例子 5. PUMA和SCARA的组装作业 ==
| |
− | | |
− | | |
− | [[File:Coordination.png|700px|border|Setup.]]
| |
− | | |
− | 设置全局坐标,请参考: [[Element Coordination/Global Coordinates#Example|Global_Coordinates]]
| |
− | | |
− | [[File:Coordination detail.png|700px|border|Detail view of work-space locations]]
| |
− | | |
− | | |
− | === 几何结构 ===
| |
− | | |
− | [[File:Coordination Geometry.png|700px|border| Geometric Setup.]]
| |
− | | |
− | 参考: [[Element Coordination/Global Coordinates#numeric_example|Global_Coordinates]]
| |
− | | |
− | 给定的设置可以通过四种不同的方式来实现:
| |
− | {| border = "1" valign = "top"
| |
− | |- valign="top" align = "center"
| |
− | | World(Robot) Frame || Base Frame || Global Base || Moving Frame
| |
− | |- valign="top"
| |
− | |
| |
− | puma.base = #{0,0,0,0,0,0} <br>
| |
− | scara.base = #{0,0,0,0} <br>
| |
− | Moves puma #{50,0,600,90,90,0}<br>
| |
− | Moves scara #{-100,-100,0,0}
| |
− | ||
| |
− | puma.base = #{200,100,0,0,0,0} <br>
| |
− | scara.base = #{100,100,0,0} <br>
| |
− | Moves puma #{250,100,600,90,90,0}<br>
| |
− | Moves scara #{200,0,-100,0}
| |
− | ||
| |
− | puma.base = #{200,100,0,0,0,0} <br>
| |
− | puma.gbase = #{0,0,0,0,0,0} <br>
| |
− | scara.base = #{100,100,0,0} <br>
| |
− | scara.gbase = #{0,100,700,0} <br>
| |
− | Moves puma #{250,100,600,90,90,0}<br>
| |
− | Moves scara #{250,100,600,90,90,0}<br>
| |
− | ||
| |
− | puma.base = #{200,100,0,0,0,0} <br>
| |
− | scara.base = #{100,100,0,0} <br>
| |
− | puma.globalbase = #{0,0,0,0,0,0}<br>
| |
− | scara.globalbase = #{0,0,0,0,0,0}<br>
| |
− | Moves puma #{250,100,600,90,90,0}<br>
| |
− | MF.MasterSource = puma.setpoint<br>
| |
− | MF.Base = #{200,0,-600,0}<br>
| |
− | MF.ObjectLoc = #{0,0,50,0}<br>
| |
− | scara.MasterFrame = MF<br>
| |
− | scara.slave = 5<br>
| |
− | Moves scara MF.zero<br>
| |
− | |-
| |
− | |}
| |
− | | |
− | {{Note|'''''所有四个给定的代码示例是两个机器人相同的位置!'''''}}
| |
− | | |
− | {{Note/Important| “运动参照系”示例考虑到SCARA基坐标系,而不是全局基准坐标,因为MF被声明为XYZR点类型。}}
| |
− | | |
− | === 系统设置 ===
| |
− | | |
− | 定义:
| |
− | | |
− | <pre>
| |
− | Common Shared MF As Moving Frame Of XYZR
| |
− | Common Shared hold As Location Of XYZR
| |
− | Common Shared patch_feeder As Location Of XYZR
| |
− | </pre>
| |
− | | |
− | 初始化:
| |
− | | |
− | <pre>
| |
− | SCARA.Base = #{100,100,0,0}
| |
− | SCARA.GBASE = #{0,100,700,0,0,0}
| |
− | PUMA.Base = #{200,100,0,0}
| |
− | | |
− | | |
− | MF.MasterSource = PUMA.SETPOINT
| |
− | MF.ObjectLoc = #{0,0,50,0}
| |
− | MF.Base = #{200,0,-700,0}
| |
− | | |
− | SCARA.BlendingMethod = 2
| |
− | SCARA.BlendingFactor = 80
| |
− | SCARA.MasterFrame = MF
| |
− | </pre>
| |
− | | |
− | === 执行代码 ===
| |
− | | |
− | <pre>
| |
− | while patches()
| |
− | MoveS PUMA MoldPose((PatchNumber()))
| |
− | MoveS SCARA patch_feeder
| |
− | MoveS SCARA down
| |
− | Call TakePatch(SCARA)
| |
− | Moves SCARA up
| |
− | Moves SCARA hold
| |
− | MF.ObjectLoc = MoldProfile(PatchNumber())
| |
− | SCARA.slave = 5
| |
− | Moves SCARA MF.Zero
| |
− | Call GluePatch(SCARA)
| |
− | Moves SCARA up
| |
− | SCARA.Slave = 0
| |
− | Moves SCARA hold
| |
− | end while
| |
− | </pre>
| |
− | | |
− | === 上面程序中使用的函数和变量:===
| |
− | | |
− | <pre>
| |
− | Function MoldPose( n as long) as location of XYZYPR
| |
− | </pre>
| |
− | 在PUMA坐标系(即XYZYPR)中返回模具上的贴片位置函数
| |
− | <pre>
| |
− | Function MoldProfile( n as long) as location of XYZR
| |
− | </pre>
| |
− | 返回模具的形状轮廓在XYZ坐标函数,设置的OBJECTLOC将有效地将SCARA机器人的正确位置置于模具上。返回SCARA位置(XYZR)。
| |
− | | |
− | <pre>
| |
− | Sub TakePatch(robot as generic group)
| |
− | </pre>
| |
− | 从送料器取出(夹具操作,真空,等待等)贴片的子程序.
| |
− | | |
− | <pre>
| |
− | Sub GluePatch(robot as generic group)
| |
− | </pre>
| |
− | 将贴片放在模具上的子程序。 这里包括所有需要的同步(等待,夹持器打开,...)
| |
− | | |
− | <pre>
| |
− | MF.Base
| |
− | </pre>
| |
− | 运动参考系基点偏移,
| |
− | | |
− | <pre>
| |
− | hold
| |
− | </pre>
| |
− | 等待位置
| |
− | | |
− | <pre>
| |
− | Patch_feeder
| |
− | | |
− | </pre>
| |
− | 贴片取料的位置
| |
全局坐标概念
对于使用不同点类型的全局坐标概念的机器人已经被定义。 这允许以一种常见的独特格式给予机器人位置,以独立地观察机器人具有多少轴。 这里使用的关键属性是机器人的base变换,如Robot_Working_Frames所述
基坐标系属性
机器人有两个笛卡尔坐标系:世界(机器人)坐标系和基坐标系。
世界(机器人)坐标系
在由q = (q1,q2,q3, .... , qn)定义的机器人姿势中,n是机器人的NDOF。 世界(机器人)参考坐标由下式定义:
pworld = DirectKinematics (q)
其中p可以是:p =(x,y,z,偏航,俯仰,滚动)取决于机器人运动学。
| NOTE |
为了简化讨论,我们假定该工具包含在正运动学计算中。这里省略了工件和工作台的坐标系。 |
基坐标系
基坐标系是由robot.base属性移动的世界(机器人)坐标系:
pbase = base:pworld
其中:是复合运算符。
全局基坐标属性(全局坐标)
所有用户输入(目标运动指令点,运动参考坐标等)都在基座坐标系中给出。 然而,这些系统可以与机器人不同(例如,R1具有XYZR和R2具有XYZYPR)。 因此,我们假设一个共同的(全局)基坐标系,将所有机器人转换到一个系统:
p1global = R1.glbalbase:R1.base:R1.DirectKinemaitcs(R1.pcmd)
p2global = R2.glbalbase:R2.base:R2.DirectKinemaitcs(R2.pcmd)
p3global = R3.glbalbase:R3.base:R3.DirectKinemaitcs(R3.pcmd)
...
pmglobal = Rm.glbalbase:Rm.base:Rm.DirectKinemaitcs(Rm.pcmd)
假设系统有m个机器人
这是通过添加始终与实际机器人点类型无关的<robot>.globalbase位置来实现的,在XYZYPR系统中给出
为了使全局坐标系尽可能的使用,运动命令(MOVE,MOVES,MOVESKD,CIRCLE ...)的扩展方式除了目前仅允许的机器人点类型的位置之外,还可以接受XYZYPR点类型的位置。
| NOTE |
给定的扩展适用于最多6个NDOF(不超过6个)的机器人。 |
| NOTE |
如果机器人点类型已经是XYZYPR,则全局和基本属性具有绝对相同的功能,可以相互添加。 他们都可以使用,但我们强烈建议只使用一个(而另一个保留为零),以减少混乱。 |
与此同时,还有两个新的属性:
例子
给定SCARA和PUMA机器人在同一个生产单元中,SCARA机器人在PUMA机器人的上方:
使用全局坐标系
执行以下运动命令:
Move scara target
Move puma target
其中目标是点类型XYZYPR的位置
将其转移到每个机器人的基本坐标系中:
对Scara:
targetscaraB ← scara.gbase-1:target
其中 "←" 表示仅复制X,Y,Z和旋转坐标
对Puma:
targetpumaB = puma.gbase-1:target
这里我们有"=" 符号,因为puma和全局坐标系具有相同的点类型
数字示例
Move scara #{100,100,700,0,0,50}
Move puma #{100,100,700,0,0,50}
有:
scara.gbase = #{0,100,700,0,0,0}
scara.base = #{100,100,0,0}
puma.gbase = #{0,0,0,0,0,0}
puma.base = #{200,100,0,0,0,0}
我们获得SCARA的本地目标位置(在SCARA的基坐标系中):
#{0,100,700,0,0,0}-1 : #{100,100,700,0,0,50}为 #{100 , 0 , 0 , 0 , 0 , 50},可以写为:
#{100,0,0,50}← #{0,100,700,0,0,0}-1 : #{100,100,700,0,0,50}
表示目标点在SCARA的基坐标系是: #{100,0,0,50}
PUMA机器人本地目标点以类似的方法计算:
#{200,100,0,0,0,0}-1 : #{100,100,700,0,0,50}为 #{-100 , 0 , 700 , 0 , 0 , 50}, which we can write as:
#{-100,0,700,0,0,50}← #{200,100,0,0,0,0}-1 : #{100,100,700,0,0,50}
表示目标点在PUMA机器人基坐标系上为: #{-100,0,700,0,0,50}
| NOTE |
PUMA运动学中的GBASE和BASE表示相同的事情,尽管可以给出不同的值(然后使用组合gbase:base),但强烈建议仅使用一个,另一个保留为零,即:#{0,0,0,0,0,0} |
使用基于机器人的运动参考系
可以使用基于机器人的运动参考系实现相同的功能示例。
我们假设PUMA机器人是主机器人:
common shared MF as Moving Frame of XYZR
MF.MSource = puma.setppoint
MF.OBJECTLOC = #{0,0,0,0}
MF.BASE = Inverse(#{0,100,700,0,0,0})
scara.MasterFrame = MF
scara.slave = 5
现在发行:
Move puma target
和
Moves MF.zero
将puma和scara移动到同样的位置(目标)。