|
|
| Line 31: |
Line 31: |
| | <center>'''COMMON SHARED <mf name> as moving frame of <mf-type>'''</center><br> | | <center>'''COMMON SHARED <mf name> as moving frame of <mf-type>'''</center><br> |
| | | | |
| − | 基于轴和基于机器人的运动参考系之间的差异在提供给 '''[[MC-Basic:movingFrame.MASTERSOURCE| MasterSource]]''' 命令的参数中。在<u>基于轴<u>的MF中,仅使用主轴作为主源。此外,在<u>基于轴<u>的MF中,所有位置MF的属性(零,此处,上行,下行)的点类型与MF的点类型(即<mf-type>)相同。<br> | + | 基于轴和基于机器人的运动参考系之间的差异在提供给 '''[[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 )'' | + | 在<u>基于机器人</u> 的MF的主源是具有自己的点类型的机器人元素。在<u>基于机器人</u>的MF中,MF的位置和机器人的位置之间的关系将使用新引入的属性来定义。 ''(参考: Translation Transformation )'' |
| | | | |
| | == 主源 == | | == 主源 == |
| Line 105: |
Line 105: |
| | | | |
| | | | |
| − | [[File:AXY;MovingFrameType.png]] | + | [[Fil |
| − | | |
| − | ====例子 1 ====
| |
| − | <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>
| |
| − | 由于工作窗口概念不存在于基于机器人的MF中,这些属性将对MF-机器人操作绝对没有影响。
| |
| − | | |
| − | ==下一个项目命令 ==
| |
| − | | |
| − | * [[MC-Basic:NEXTITEM|'''NEXTITEM''']]命令对MF机器人操作没有影响。
| |
| − | | |
| − | = 运动参考坐标变换 =
| |
| − | | |
| − | 从机器人连接到主轴通过运动参考系分配从站主坐标系的属性:
| |
| − | <pre>
| |
| − | <slaverobot>.MasterFrame = <master frame>
| |
| − | </pre>
| |
| − | | |
| − | 主参考系是从机和主机之间的链接。它包括主源的定义,可以是机器人笛卡尔指令点('''SETPOINT''')或机器人的笛卡尔反馈('''HERE'''):
| |
| − | | |
| − | <pre>
| |
| − | <master frame>.MasterSource = <masterrobot>.SETPOINT
| |
| − | </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>
| |
| − | <masterrobot>.setpoint
| |
| − | <masterrobot>.setpoint:<movingframe>.objectloc
| |
| − | </pre>
| |
| − | | |
| − | 物体的第二点也可以通过从机器人到达(从主机器人的世界(机器人)坐标系上看):
| |
| − | <pre>
| |
| − | <movingframe>.base:<slaverobot>.setpoint
| |
| − | </pre>
| |
| − | | |
| − | [[File:COOP 2 ROB OBJ.png|700px|border|Usage of OBJECTLOC]]
| |
| − | | |
| − | <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.]]
| |
| − | | |
| − | | |
| − | mf.base = '''#{100,100,0,45}''' <br>
| |
| − | 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>
| |
| − | slave.setpoint = '''#{-43 , -200 , 0 ,135 }'''<br>
| |
| − | | |
| − | | |
| − | * 如果两个机器人具有相同的(XYZR)点类型,并且使用默认的MF.type值(''5-位置和方向''),则上述计算为真。
| |
| − | | |
| − | == 工作在同一对象上的三个机器人的例子 ==
| |
| − | | |
| − | 这是三机器人协作的一个例子。 一个机器人被定义为主机,另外两个是从机。 每个从机器人通过它的主参考系连接到主机器人,与主体机器人距对象不同的距离以及不同的夹点上。
| |
| − | | |
| − | [[File:COOP 3 ROB.png|700px|border|Frame Calculation in three-robot case]]
| |
| − | | |
| − | 在这个例子中,我们将定义两个运动参考系,每个参考系都有不同的OBJECTLOC。
| |
| − | | |
| − | 第一个运动参考系:
| |
| − | <pre>
| |
| − | Common Shared MF1 As Moving Frame Of XYZR
| |
| − | MF1.MasterSource = <masterrobot>.SETPOINT
| |
| − | MF1.BASE = #{..., ..., ..., 0}
| |
| − | MF1.OBJECTLOC = #{L,..., ..., 180}
| |
| − | </pre>
| |
| − | | |
| − | 第二个运动参考系:
| |
| − | <pre>
| |
| − | Common Shared MF2 As Moving Frame Of XYZR
| |
| − | MF2.MasterSource = <masterrobot>.SETPOINT
| |
| − | MF2.BASE = #{..., ..., ..., 0}
| |
| − | MF2.OBJECTLOC = #{SQRT(3)*L,L/2, ..., -150}
| |
| − | </pre>
| |
| − | | |
| − | * '''假设对象是边长L的双边(等边)三角形。'''
| |
| − | | |
| − | {{Note| 第二个对象位置MF的方向部分为-150度。 第一个从机器人Xtool轴与主机机器人的Xtool轴完全相反。 而第二个从机器人的Ytool轴正好与主机器人的Ytool轴完全相反。}}
| |
| − | | |
| − | = 算法和软件设计 =
| |
| − | | |
| − | * 主从关系与基于轴的MF和基于机器人MF的原理相同。 如果MF静止或运动,底层的思想是具有相同的运动方式。主要描述如下:[[Element Coordination/Absolute Movements During Conveyor Tracking|Absolute_Movements_During_Conveyor_Tracking]]<br>
| |
| − | | |
| − | * Axis-based moving frame tracking algorithm based on predicting the rendezvous point and limiting the motion by velocity, acceleration and jerk constant is described here: [[AXY:Element Coordination/One Dimensional Tracking Algorithm|One_Dimensional_Tracking_Algorithm]]<br>
| |
| − | | |
| − | * Same algorithm (tracking) applied on 3-dimensional position vector (Euler angles) is explained here: [[AXY:Element Coordination/Multi Dimensional Tracking Algorithm (Position)|Position_Tracking_Algorithm]]<br>
| |
| − | | |
| − | * Same algorithm (tracking) applied on 3-dimensional orientation vector is explained here: [[AXY:Element Coordination/Multi Dimensional Tracking Algorithm (Orientation)|Orientation_Tracking_Algorithm]]<br>
| |
| − | | |
| − | * Concept of '''global frame''' coordinate system as addition to '''base''' and '''world(robot)''' frames for multiple robot usage is described here:[[Element Coordination/Global Coordinates|Global Coordinates]]
| |
| − | | |
| − | * Enlargement of axis-based MF data structures is shown here: [[AXY:Element Coordination/Software Design| Software_Design]]<br>
| |
| − | | |
| − | <!-- == Issues List: ==
| |
| − | {{Bugzilla|5954}}<br>
| |
| − | {{Bugzilla|5955}}<br>
| |
| − | {{Bugzilla|5957}}<br>
| |
| − | {{Bugzilla|5960}}<br>
| |
| − | {{Bugzilla|5963}}<br>
| |
| − | {{Bugzilla|6058}}<br>
| |
| − | {{Bugzilla|6075}}<br>
| |
| − | -->
| |
| − | | |
| − | = Examples =
| |
| − | | |
| − | == Example 1. two different robot kinematics ==
| |
| − | | |
| − | Cooperation between two unequal robot kinematics.
| |
| − | | |
| − | [[File:AXY;SCARAPUMA_COO.png|700px|border|Cooperation between SCARA and PUMA robot kinematics, PUMA robot is the master frame here]]
| |
| − | | |
| − | | |
| − | Moving Frame definition:
| |
| − | <pre>
| |
| − | Common Shared MF as Moving Frame of XYZR
| |
| − | </pre>
| |
| − | | |
| − | Linking it to the source (master):
| |
| − | <pre>
| |
| − | MF.MasterSource = Puma.Setpoint
| |
| − | </pre>
| |
| − | | |
| − | The master-source is a robot(PUMA) of point-type XYZYPR and the linked robot(SCARA) or the MF is of XYZR point type. In this case the MF.type will be automatically set to 3 (position only). <u> Orientation angle changes of the master robot will have no effects on the slave.</u> So we need to define transformation matrix:
| |
| − | | |
| − | | |
| − | <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>
| |
| − | | |
| − | | |
| − | Or in the code:
| |
| − | | |
| − | <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>
| |
| − | | |
| − | | |
| − | And then the offsets definitions:
| |
| − | | |
| − | The XY coordinates will be offseted for (10,10) mm:
| |
| − | <pre>
| |
| − | MF.base = #{10,10,0,0}
| |
| − | </pre>
| |
| − | | |
| − | A distance of 100mm between the two robots tool-tips is defined as:
| |
| − | <pre>
| |
| − | MF.ObjectLoc = #{0,0,100,0}
| |
| − | </pre>
| |
| − | | |
| − | | |
| − | and the tracking (master-slave) is defined by:
| |
| − | <pre>
| |
| − | Scara.Masterframe = MF
| |
| − | </pre>
| |
| − | and started:
| |
| − | <pre>
| |
| − | Scara.slave = 5
| |
| − | </pre>
| |
| − | | |
| − | == Example 2. SCARA and a tilting table==
| |
| − | | |
| − | | |
| − | [[File:AXY;SCARA_TILT.png]]
| |
| − | | |
| − | Moving Frame definition :
| |
| − | <pre>
| |
| − | Common Shared MF as Moving Frame of XYZR
| |
| − | </pre>
| |
| − | | |
| − | | |
| − | Having a tilt table robot (Object Having only Yaw and Pitch angle):
| |
| − | <pre>
| |
| − | Common Shared TiltTable As Group Axnm = Ax5 Axnm = Ax6 Model = 1 of YP
| |
| − | </pre>
| |
| − | | |
| − | Linking it to the source (master):
| |
| − | <pre>
| |
| − | MF.MasterSource = TilTable.Setpoint
| |
| − | </pre>
| |
| − | | |
| − | The master-source is a tilt-table of point-type YP and the linked robot or the MF is of XYZR point type. The MF.type will be automatically set to 3 (position only).
| |
| − | | |
| − | Transformation matrix for position actually does not exist as the TiltTable have no position component! So there is nothing to be set here.
| |
| − | | |
| − | | |
| − | And then the offsets definitions:
| |
| − | | |
| − | The XY coordinates will be offseted for 200 mm:
| |
| − | <pre>
| |
| − | MF.base = #{-200,0,0,0}
| |
| − | </pre>
| |
| − | | |
| − | | |
| − | | |
| − | Defining the object-location of 100mm makes the '''trick!'''
| |
| − | | |
| − | 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>
| |
| − | | |
| − | '''i.e. the vector [Xo,Yo,Zo] will be rotated by the tilt-table angles [yaw,pitch]!!!'''
| |
| − | | |
| − | and the tracking (master-slave) is defined by:
| |
| − | <pre>
| |
| − | Scara.Masterframe = MF
| |
| − | </pre>
| |
| − | and started:
| |
| − | <pre>
| |
| − | Scara.slave = 5
| |
| − | </pre>
| |
| − | | |
| − | == Example 3. Two SCARA's working on a same piece ==
| |
| − | | |
| − | A robot to robot tracking example:<br>
| |
| − | Two SCARA robots, one master the other is slave.<br>
| |
| − | [[File:COOP 2 ROB SYNC.png|700px|border|Case of tracking with two SCARA robots.]]<br><br>
| |
| − | <u>Setup:</u><br>
| |
| − | set the slave robot to track the master on a distance of 100mm pointing in face-to face direction (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>
| |
| − | At the moment of engagement (i.e. '''Slave=5''') Zero point is recorded!<br>
| |
| − | <br><br><br>
| |
| − | <u>Wait to be Synchronized and arriving to master-position together:</u> <br>
| |
| − | ''System waits until MF is synchronized ([[MC-Basic:robot.ISMOVINGFRAMESYNCHRONIZED|Is-Moving-Frame-Synchronized]] equals 1)'' '''and''' ''motion towards Zero point is completed ([[MC-Basic:group.ISMOVING|isMoving]] flag is not positive)''
| |
| − | <pre>
| |
| − | Moves MF.Zero
| |
| − | While ScaraSlave.IMFS <> 1 and ScaraSlave.Ismoving > 0
| |
| − | Sleep 1
| |
| − | End While
| |
| − | </pre><br>
| |
| − | <u>Do something, or just stay in tracking mode.</u><br><br><br>
| |
| − | <u>Stopping.</u>De-Synchronize: <br>
| |
| − | <pre>
| |
| − | slave = 0
| |
| − | while ScaraSlave.IMFS <> 0
| |
| − | Sleep 1
| |
| − | End While
| |
| − | </pre>
| |
| − | After this ScaraSlave will be stopped not exactly on the ScaraMaster's path ''(deviation is more or less random and depends on the master's robot path and joints' deceleration parameters)''.<br>
| |
| − | <br>
| |
| − | | |
| − | == Example 4. Coordination ==
| |
| − | Relative position between the robots during tracking, the slave robot to track the master on a distance of 100mm pointing in face-to face direction (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]]
| |
| − | | |
| − | | |
| − | == Example 5. PUMA and SCARA on a patch placement job ==
| |
| − | | |
| − | | |
| − | [[File:Coordination.png|700px|border|Setup.]]
| |
| − | | |
| − | For setting up global; coordinates see: [[Element Coordination/Global Coordinates#Example|Global_Coordinates]]
| |
| − | | |
| − | [[File:Coordination detail.png|700px|border|Detail view of work-space locations]]
| |
| − | | |
| − | | |
| − | === Geometry ===
| |
| − | | |
| − | [[File:Coordination Geometry.png|700px|border| Geometric Setup.]]
| |
| − | | |
| − | Also see: [[Element Coordination/Global Coordinates#numeric_example|Global_Coordinates]]
| |
| − | | |
| − | the given setup can be accomplished in four different ways:
| |
| − | {| 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|'''''All four given code examples will bring the two robots to same positions!'''''}}
| |
| − | | |
| − | {{Note/Important| The "Moving Frame" example takes into account SCARA base coordinates and not the global ones as the MF is declared of XYZR point type.}}
| |
| − | | |
| − | === System setup ===
| |
| − | | |
| − | definitions:
| |
| − | | |
| − | <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>
| |
| − | | |
| − | initialization :
| |
| − | | |
| − | <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>
| |
| − | | |
| − | === Execution Code ===
| |
| − | | |
| − | <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>
| |
| − | | |
| − | === Functions and variables used in the program above:===
| |
| − | | |
| − | <pre>
| |
| − | Function MoldPose( n as long) as location of XYZYPR
| |
| − | </pre>
| |
| − | Function returning pathc position on the mold in PUMA's coordinate system (e.g. XYZYPR)
| |
| − | | |
| − | <pre>
| |
| − | Function MoldProfile( n as long) as location of XYZR
| |
| − | </pre>
| |
| − | Function returning the shape profile of the mold in XYZ coordinates , setting it into OBJECTLOC will effectively set a right position of the SCARA robot on the mold.
| |
| − | Returns SCARA locations (XYZR).
| |
| − | | |
| − | <pre>
| |
| − | Sub TakePatch(robot as generic group)
| |
| − | </pre>
| |
| − | Subroutine for taking (gripper manipulation, vacuum, waiting, etc) a patch from the feeder.
| |
| − | | |
| − | <pre>
| |
| − | Sub GluePatch(robot as generic group)
| |
| − | </pre>
| |
| − | Subroutine for placing the patch on the mold. Here included are all synchronizations needed (wait, gripper open, ...)
| |
| − | | |
| − | <pre>
| |
| − | MF.Base
| |
| − | </pre>
| |
| − | Moving Frame Base offset,
| |
| − | | |
| − | <pre>
| |
| − | hold
| |
| − | </pre>
| |
| − | Waiting position
| |
| − | | |
| − | <pre>
| |
| − | Patch_feeder
| |
| − | | |
| − | </pre>
| |
| − | Position from where the patches are taken.
| |