Difference between revisions of "Multi-Axis Kinematics/zh-hans"
(AXY: new links) |
|||
(22 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
− | {{Languages}} | + | {{Languages|Multi-Axis_Kinematics}} |
+ | <div id="BackToTop" class="noprint" style="background-color:; position:fixed; bottom:32px; left:95%; z-index:9999; padding:0; margin:0;"> | ||
+ | <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; "> | ||
+ | [[Image:TOP2.png|50px|link=#top]] </span></div> | ||
= 介绍 = | = 介绍 = | ||
− | + | 多个轴可以组合并运动。 有: | |
* 简单组((无模型,可以是相同类型或不同类型) | * 简单组((无模型,可以是相同类型或不同类型) | ||
* 笛卡尔组(每个轴的作用被严格定义,例如:XYZ,XYZR,...) | * 笛卡尔组(每个轴的作用被严格定义,例如:XYZ,XYZR,...) | ||
Line 12: | Line 15: | ||
'''Non-homogeneous groups'''由旋转轴和线性轴两种轴组成。增加了一个特征来支持非同类型组速度的定义。 在设置中,声明旋转轴和线性轴。 系统确定它是线性还是旋转主导组。例如,在SCARA机器人中,有两个旋转轴用于第一和第二个关节,另一个旋转轴用于最后一个关节(旋转)。 只有一个线性轴(Z轴)。这种系统是旋转主导的。 另一个例子是XYZ-Roll系统。 这里,只有一个旋转轴(旋转)有两个线性(X和Y)轴和另一个线性(Z轴)。 在这种情况下,系统是线性主导的。 轴设置定义组的行为。每个轴必须声明是线性轴或旋转轴,通过设置 [[MC-Basic:axis.POSITIONROLLOVERENABLE|'''POSITIONROLLOVERENABLE''']] 为线性轴(0)或旋转轴(1)。 | '''Non-homogeneous groups'''由旋转轴和线性轴两种轴组成。增加了一个特征来支持非同类型组速度的定义。 在设置中,声明旋转轴和线性轴。 系统确定它是线性还是旋转主导组。例如,在SCARA机器人中,有两个旋转轴用于第一和第二个关节,另一个旋转轴用于最后一个关节(旋转)。 只有一个线性轴(Z轴)。这种系统是旋转主导的。 另一个例子是XYZ-Roll系统。 这里,只有一个旋转轴(旋转)有两个线性(X和Y)轴和另一个线性(Z轴)。 在这种情况下,系统是线性主导的。 轴设置定义组的行为。每个轴必须声明是线性轴或旋转轴,通过设置 [[MC-Basic:axis.POSITIONROLLOVERENABLE|'''POSITIONROLLOVERENABLE''']] 为线性轴(0)或旋转轴(1)。 | ||
− | 在非同类型组中, 根据组的主导类型(参考: [[MC-Basic:group.DOMINANCEMODE|DOMINANCEMODE]])总是给出联合插补运动([[MC-Basic:MOVE|MOVE]])命令速度。如果该组是线性优势的,速度([[MC-Basic: | + | 在非同类型组中, 根据组的主导类型(参考: [[MC-Basic:group.DOMINANCEMODE|DOMINANCEMODE]])总是给出联合插补运动([[MC-Basic:MOVE|MOVE]])命令速度。如果该组是线性优势的,速度([[MC-Basic:element.VELOCITYCRUISE|'''VCRUISE''']], [[MC-Basic:element.VELOCITYFINAL|'''VFINAL''']])为线性单位(mm / sec)。 |
在运动的准备阶段检查其他非线性轴。 这些轴的速度不能超过最大值。 如果是这样,总体(组)速度就会降低。 | 在运动的准备阶段检查其他非线性轴。 这些轴的速度不能超过最大值。 如果是这样,总体(组)速度就会降低。 | ||
Line 38: | Line 41: | ||
== 点数据类型 == | == 点数据类型 == | ||
− | 关节坐标的概念是一个''n''元组数。 每个数字表示特定关节的坐标。 | + | 关节坐标的概念是一个''n''元组数。 每个数字表示特定关节的坐标。 世界坐标由描述每个不同世界空间表示的不同内置类型(XY,XYZ,XYZR)支持。 对于相同(或相同维度)的世界坐标,可以有不同的世界空间描述。 每个机器人都有其默认的世界空间类型。 不同的机器人可以具有相同的世界空间类型,只要它们具有相同数量的自由度('''NDOF''')。 例如,xy平台世界空间具有XY世界空间描述符。SCARA机器人有用于垂直运动的Z轴和用于定向的转动轴,使用由由X,Y,Z和转动或XYZR描述组成的世界坐标系。 |
− | + | 不同的坐标系被实现为不同数据类型的变量。 通常,坐标系中的一个点被定义为点数据类型。 根据是否是关节空间或世界空间,点的子类型不同。 点数据类型有两个子类型: '''JOINT'''和'''LOCATION'''。两者都有一个世界空间描述符,可以区分相同的子类型。 世界空间坐标存储在变量中,定义为: | |
<pre> | <pre> | ||
Line 46: | Line 49: | ||
</pre> | </pre> | ||
− | + | 关节空间是: | |
<pre> | <pre> | ||
DIM A AS JOINT OF XYZR | DIM A AS JOINT OF XYZR | ||
</pre> | </pre> | ||
− | + | 具有两个子类型(LOCATION和JOINT)和世界空间描述符(XY,XYZ,XYZR等)的点数据类型涵盖了所有可能的机器人空间变化。这些变量与机器人无关,可以在系统中未定义机器人的情况下使用。当它们与机器人或组的连接使用时,世界子类型必须相等。 | |
− | + | 该点可以使用所有可用的算术运算(+ - * /)作为数值数据类型进行操作。 操作被定义为逐个坐标操作。只有相同子类型和相同世界空间的点可以组合。 | |
− | + | 用于点常数的语法: 用方括号({})内的命令分隔的值列表表示点。 如果它之前是井号(#),它是一个位置: | |
<pre> | <pre> | ||
Line 65: | Line 68: | ||
</pre> | </pre> | ||
− | == | + | == 用户单位 == |
+ | softMC可以让您自由地更改和选择不同的单位。机器人模型具有较小的灵活性。由于关节和世界空间之间的紧密关系,您必须以毫米或度数定义关节位置单位,以秒为单位定义所有时间单位,以便世界空间和关节间隔都是兼容单位。世界空间的单位自动设置为毫米-度-秒。 | ||
− | + | 每个轴都有四个缩放因子: '''PFAC''','''VFAC''', '''AFAC''', and '''JFAC'''。这些将编码器计数和旋转计数转换为用户位置单位(英寸,毫米或圈)。它们还指定在位置求导中使用什么时间单位('''VEL''', '''ACC''', '''JERK''')。由于位置因子定义了计数和用户位置单位之间的比例,其余因子定义了毫秒和用户时间单位之间的比率。 | |
− | + | 通常有: | |
− | |||
<pre> | <pre> | ||
<nowiki><</nowiki>axis<nowiki>>.pfac = <</nowiki>number of counts per user position units> | <nowiki><</nowiki>axis<nowiki>>.pfac = <</nowiki>number of counts per user position units> | ||
Line 77: | Line 80: | ||
</pre> | </pre> | ||
− | + | 所有轴都设置完毕后,组包含这些轴。 所有轴上必须具有'''''相同的用户单位'''''。 设置组缩放因子 '''组没有位置因子!''' 相反, 使用每个轴的 '''PFAC'''。 | |
<pre> | <pre> | ||
MOVE g1 {1,2,3} vcruise = 10 | MOVE g1 {1,2,3} vcruise = 10 | ||
</pre> | </pre> | ||
− | + | 目标坐标被给予每个轴,并且转换成使用每个轴的'''PFAC'''编码器/解析器计数。 '''VCRUISE'''与任何轴无关。 使用组因子, '''VFAC''', '''AFAC'''和'''JFAC'''。 组速度以用户单位/秒表示。 | |
− | + | 要使系统单元正常工作, 请将每个轴的单位因子 ('''PFAC''', '''VFAC''', '''AFAC''' and '''JFAC)'''设置为毫米-度-秒并将组单位设置为秒: | |
<pre> | <pre> | ||
<nowiki><</nowiki>group>.vfac = 1/1000 | <nowiki><</nowiki>group>.vfac = 1/1000 | ||
Line 91: | Line 94: | ||
</pre> | </pre> | ||
− | = | + | = 耦合 = |
− | + | 在许多机器人应用中,机械结构引入轴之间的机械耦合。在这种情况下,两个或多个电机只移动一个关节。 因此,仅激活一个电机会导致两个轴(关节)的运动。有很多这样的机械设置的例子。通常当电机移动关节时,它们正在启动。 当电机在第一关节之前时移动第二关节时,第二关节通过第一和第二电机的运动而移动。这种应用的典型实例是移动机械手臂(PUMA)的电机通过链条或皮带移动机器人手臂。最后一个机器人部件上的差速齿轮传动从末端执行器移动最后一个电机(转动),第五和第六个电机引入第六个关节的运动(Staubli RX系列)。 | |
[[File:WRIST_CPLG.PNG |right]] | [[File:WRIST_CPLG.PNG |right]] | ||
− | Staubli RX | + | Staubli RX 手腕 – 对轴 a5 ,a6: |
<pre> | <pre> | ||
j6.pcmd = a6.pcmd – a5.pcmd | j6.pcmd = a6.pcmd – a5.pcmd | ||
</pre> | </pre> | ||
− | BOSCH – SCARA – | + | BOSCH – SCARA – 对轴 a3,a4: |
<pre> | <pre> | ||
j3.pcmd = a3.pcmd + 18.3*a4.pcmd. | j3.pcmd = a3.pcmd + 18.3*a4.pcmd. | ||
Line 111: | Line 114: | ||
</pre> | </pre> | ||
− | + | 缩放和旋转: | |
<pre> | <pre> | ||
j1 = 707.1*a1.pcmd + 707.1*a2.pcmd | j1 = 707.1*a1.pcmd + 707.1*a2.pcmd | ||
Line 117: | Line 120: | ||
</pre> | </pre> | ||
− | + | 正交校正: | |
<pre> | <pre> | ||
j1 =10000*a1.pcmd | j1 =10000*a1.pcmd | ||
j2 = 2.91*a1.pcmd + 10000*a2.pcmd | j2 = 2.91*a1.pcmd + 10000*a2.pcmd | ||
</pre> | </pre> | ||
− | + | 组关节是softMC固件的标准配置,涵盖上面给出的耦合示例。 | |
− | == | + | == 运动元素 == |
− | + | softMC是一个多轴和多组系统。在许多方面,组和轴是相同的。例如,它们都具有以下属性: '''AMAX''', '''VMAX''', '''VCRUISE'''。另一个相同的方面是两者的运动。虽然运动命令有仅组('''CIRCLE''', '''MOVES''') 或仅轴('''JOG'''),但单独移动轴时,不可能移动包含相同轴的组,反之亦然。轴在组中有效。 '''ATTACH'''''''DETACH'''的工作方式相同,当轴的组已经关联时,轴不能再关联。 因此,我们可以使用一个术语'''motion-element'''来表示轴和组。 | |
− | + | 有一些是仅属于轴或仅属于组的属性。例如'''DRIVEADDRESS'''是一个仅属于轴的属性。 | |
− | '''MOVE''' | + | '''MOVE'''包含两种不同的命令特性,Move-Group和Move-Axis。Move-Group将全部组一起移动。组内的所有轴在同一时间开始和结束运动。Move-Group保持在组和轴的运动学限制 |
+ | ('''VELOCITY''','''ACCELERATION''','''JERK''')。组的限制被执行并施加组运动上(集合,空间XY,XYZ)。轴限制仅与轴运动与整个组运动的比例成比例的执行。如果轴X向Y轴一半移动,则只能使用一半的极限值。运动的总时间是最慢轴完成运动所需的时间。这里,最慢的轴是具有最大路径/速度比的轴,并且不需要具有最小最大速度的轴(因为如果这样的轴没有运动,则不是最慢的轴)。另一方面,Move-Axis仅检查指定轴的极限,并且与使用该轴的任何组的极限无关。 | ||
− | + | 分析器的准备可以额外减少运动参数。这是典型的短暂的运动,由于'''ACCELERATION'''和'''JERK'''的现有限制,给定的巡航速度无法达到。 | |
− | == | + | == 关节 == |
− | + | 关节是虚拟轴。 无论从语言的角度看,还是耦合轴的物理运动,关节只给出一个轴的错觉,关节类似于轴,关节表示为J1,J2等 | |
− | + | 根据给定的耦合矩阵,每个关节实际上表示该组的一个或多个轴。如果组没有定义耦合矩阵,则关节是组中相同序数的轴作为关节索引的直接表示。 | |
+ | 为了引入另一个术语,关节的"影轴"是组中与关节索引具有相同序数的轴。 例如,如果一组由轴A2,A3,A4组成,则关节J1的影轴为A2。 | ||
− | + | 通常,所有关节属性都是影轴属性的直接表示(具有相同的值),与是否定义了耦合矩阵无关。唯一的例外是与关节位置相关的属性: '''PCMD''', '''PFB''', '''VCMD''', '''VFB''', '''CCMD''', '''CFB''', '''PMAX'''和'''PMIN''',这些是每个关节独有的。 | |
− | + | 根据给定的耦合矩阵获得当前位置和速度。每次发出这些值的查询('''PCMD''', '''PFB''',等)时都会计算它们。它们是只读的,不表示任何特定的内部变量。从组(?g1.PCMD)查询时,对称地具有相同的属性,根据耦合矩阵返回关节属性值的列表。 组运动的运动的目标位置('''MOVE''' or '''CIRCLE''')类似(耦合矩阵)处理。 | |
− | + | 另一方面,关节的位置限制('''PMAX'''和'''PMIN''') 被添加到关节中。 | |
+ | 关节的位置限制和影轴的位置限制不相关,与是否定义耦合矩阵无关。当定义耦合矩阵(COUPLED = 1)时,总是使用关节位置限制。 在这种情况下,不会使用影轴限制。 这只适用于关节和组运动。单轴运动(例如,MOVE A1 100)仅受轴限制的限制,与耦合无关。 | ||
− | + | 关节代表一组中的几个轴。 关节运动实际上是组运动: | |
<pre> | <pre> | ||
Move-Group = Move-Joint | Move-Group = Move-Joint | ||
</pre> | </pre> | ||
− | + | 关节运动给出移动一个物理轴(MOVE J1 100)的错觉,尽管有几台电机可以在一起移动。根据指定的关节运动参数执行运动。 例如: | |
<pre> | <pre> | ||
A1.Acc = 100 | A1.Acc = 100 | ||
Line 155: | Line 161: | ||
</pre> | </pre> | ||
− | + | 类似于: | |
<pre> | <pre> | ||
J1.Acc = 100 | J1.Acc = 100 | ||
Line 161: | Line 167: | ||
</pre> | </pre> | ||
− | Move- | + | Move-Joint模拟通过参数和物理运动移动单个关节来移动单个轴的行为。唯一的区别是几台电机正在移动而不是一个电机。关节移动时,检查每个组轴内的所有电机限位。关节运动是一组关节坐标与从影轴复制的组运动参数的组运动。下面的转换规则为真: |
<pre> | <pre> | ||
Line 167: | Line 173: | ||
</pre> | </pre> | ||
− | == | + | == 机器人模型 == |
− | + | 机器人被定义为具有特殊型号类型的组 (请参阅当前可用的机器人型号列表: [[Robot_Model_Table|'''robot_model_table''']]) | |
− | + | 例如: | |
<pre> | <pre> | ||
COMMON SHARED scara AS GROUP AxNm = a1 AxNm = a2 AxNm = a3 AxNm = a4 Model = '''4''' | COMMON SHARED scara AS GROUP AxNm = a1 AxNm = a2 AxNm = a3 AxNm = a4 Model = '''4''' | ||
</pre> | </pre> | ||
− | === | + | === 机器人设置 === |
− | + | 这将自动定义具有SCARA运动学模型的机器人。与仅需要使能轴的通用组相反,必须设置机器人参数并对其进行配置。 不同的机器人需要设置的参数不同。对SCARA机器人, 这些是: | |
− | * | + | * 使用所有标准运动学参数设置所有轴 |
− | * | + | * 定义转属性 |
− | * | + | * 设置整个组的所有用户单位因子: '''VFAC''', '''AFAC''', '''JFAC''' |
− | * | + | * 设置每个机械臂链接的连杆长度和关节角度 |
− | * | + | * 设定通用组的运动学 ('''VELOCITY''', '''ACCELERATION''', '''JERK''', etc.) |
− | * | + | * 设定笛卡尔运动的运动学 ('''VTRAN''','''VROT''', etc.) |
− | * | + | * 发布[[MC-Basic:CONFIGGROUP|'''CONFIGGROUP''']] |
− | + | 只有在设置好所有这些并且成功执行'''CONFIGGROUP'''之后,机器人才能运动。否则返回错误,表示该组未配置。常规组(默认模型值1)与机器人之间的重要区别是执行'''CONFIGGROUP'''的必要性。 在机器人组中,机器人在配置之前不允许运动。 | |
− | + | 模型值自动定义默认机器人世界空间描述符。 对于模型4(SCARA),选择XYZR(x-y-z-roll)世界空间。 | |
− | + | 在有定义的机器人模型(模型> 1)的组中,关节和世界空间之间不是简单的转换。将“关节坐标转换为世界坐标是用'''TOCART'''来实现的,它将机器人和给定的关节坐标(位置变量)同时作为输入参数。其输出是与给定关节位置对应的世界坐标。 | |
− | + | 另一个方向更复杂。 通过'''TOJOINT''' 接收三个输入参数来实现:机器人,给定的笛卡尔点和配置标志。 | |
− | + | 配置标志用于在两个翻译功能之间进行选择。在大多数机器人模型中,对于相同的世界空间位置,有多个关节坐标描述。不同的机器人配置可以产生有不同关节空间值但是有相同的世界空间位置。不同的机器人配置不同,在 在SCARA中,只有两个配置:lefty(第二个关节坐标是负的)和righty(第二个关节坐标是正的)。 | |
− | === | + | === 插补 === |
− | + | 对于有机器人型号(型号> 1)的组,还有一个额外的运动类型:[[MC-Basic:MOVES|'''MOVES''']]。运动从起始位置到世界空间中给定的目标位置是一条直线。平直度与工作空间紧密相关。 相同的路径在笛卡尔工作空间(XYZ)中可以是直的,但在关节空间中弯曲,反之亦然。 '''MOVES '''仅用于机器人类型的组,不能在通用组中使用。 | |
− | + | 直线运动是指在世界空间中是直线的运动。在没有机器人模型(模型= 1)的组中,使用'''MOVES'''生成的所有运动是关节空间中的直线运动。在通用的线性主导组中,它们的大多数轴是线性的。由于世界空间和关节空间是相同的, '''MOVES'''在关节空间和世界空间中执行一条直线。目标位置可以在世界和关节空间坐标中给出。运动与关节插值('''MOVE''')不同。 使不是用常规组中使用的关节空间运动学参数,而是使用速度,加速度和加加速度的世界空间参数。这些参数有两种形式:一种用于运动的平移部分,另一种用于旋转部分(方向)。 | |
− | + | 当世界空间具有位置和方向分量时,直线运动包括位置和方向上的插值。 因为这两个在本质上不同的对象,所以需要两个不同的参数:一个用于平移(纯位置插值): '''VELOCITYTRANS''', '''ACCELERATIONTRANS''', '''JERKTRANS'''<nowiki>; 另一个用于旋转(旋转插值): </nowiki>'''VELOCITYROT''', '''ACCLERATIONROT''', '''JERKROT'''. 这些参数仅用于笛卡尔插值('''MOVES''' and '''CIRCLE''')。这些参数对关节插值'''MOVE''')没有影响,因为它不是世界空间插值。 | |
− | + | 两组参数定义了直线运动。 哪个参数是运动的主要因素取决于运动。 如果大部分运动都处于平移位置的变化,方向的变化要小得多,则平移部分被采用。 相反,旋转参数定义直线运动。 | |
Line 215: | Line 221: | ||
|- | |- | ||
| | | | ||
− | [[Image:Axsystems;UserManual-1-Interpolation.png|caption|600px]] | + | 下图显示了在关节空间中显示的'''MOVES '''<br> |
− | + | [[Image:Axsystems;UserManual-1-Interpolation.png|caption|600px]] | |
| | | | ||
− | [[Image:Axsystems;UserManual-2-Interpolation.png|caption|600px]] | + | 下图显示了在世界空间中显示的'''MOVES '''<br> |
− | + | [[Image:Axsystems;UserManual-2-Interpolation.png|caption|600px]] | |
|- | |- | ||
| | | | ||
− | [[Image:Axsystems;UserManual-3-Interpolation.png|caption|600px]] | + | 下图显示了关节空间中显示的'''MOVES '''<br> |
− | + | [[Image:Axsystems;UserManual-3-Interpolation.png|caption|600px]] | |
| | | | ||
− | [[Image:Axsystems;UserManual-4-Interpolation.png|caption|600px]] | + | 下图显示了世界空间中显示的'''MOVES '''<br> |
− | + | [[Image:Axsystems;UserManual-4-Interpolation.png|caption|600px]] | |
|} | |} | ||
− | + | 有四个命令用于在机器人组中进行点对点移动。由两个命令用于插值运动('''MOVE'''和'''MOVES''') ,两个命令来定义目标点('''JOINT'''和 '''LOCATION'''). 它们的总体组合提供了四个选项。 | |
{| style="border-spacing:0;" | {| style="border-spacing:0;" | ||
| style="border-top:none;border-bottom:0.039cm double #000000;border-left:none;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| | | style="border-top:none;border-bottom:0.039cm double #000000;border-left:none;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| | ||
− | | style="border-top:0.039cm double #000000;border-bottom:0.039cm double #000000;border-left:0.039cm double #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ''' | + | | style="border-top:0.039cm double #000000;border-bottom:0.039cm double #000000;border-left:0.039cm double #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''位置目标''' |
− | | style="border-top:0.039cm double #000000;border-bottom:0.039cm double #000000;border-left:0.018cm solid #000000;border-right:0.039cm double #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ''' | + | | style="border-top:0.039cm double #000000;border-bottom:0.039cm double #000000;border-left:0.018cm solid #000000;border-right:0.039cm double #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''关节目标''' |
|- | |- | ||
− | | style="border-top:0.039cm double #000000;border-bottom:0.018cm solid #000000;border-left:0.039cm double #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ''' | + | | style="border-top:0.039cm double #000000;border-bottom:0.018cm solid #000000;border-left:0.039cm double #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''笛卡尔插值''' |
| style="border-top:0.039cm double #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVES #{400,400,0,0} | | style="border-top:0.039cm double #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVES #{400,400,0,0} | ||
| style="border-top:0.039cm double #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:0.039cm double #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVES {45,45,0,0} | | style="border-top:0.039cm double #000000;border-bottom:0.018cm solid #000000;border-left:0.018cm solid #000000;border-right:0.039cm double #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVES {45,45,0,0} | ||
|- | |- | ||
− | | style="border-top:0.018cm solid #000000;border-bottom:0.039cm double #000000;border-left:0.039cm double #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| ''' | + | | style="border-top:0.018cm solid #000000;border-bottom:0.039cm double #000000;border-left:0.039cm double #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| '''关节插值''' |
| style="border-top:0.018cm solid #000000;border-bottom:0.039cm double #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVE <nowiki>#{400,400,0,0}</nowiki> | | style="border-top:0.018cm solid #000000;border-bottom:0.039cm double #000000;border-left:0.018cm solid #000000;border-right:none;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVE <nowiki>#{400,400,0,0}</nowiki> | ||
| style="border-top:0.018cm solid #000000;border-bottom:0.039cm double #000000;border-left:0.018cm solid #000000;border-right:0.039cm double #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVE {45,45,0,0} | | style="border-top:0.018cm solid #000000;border-bottom:0.039cm double #000000;border-left:0.018cm solid #000000;border-right:0.039cm double #000000;padding-top:0cm;padding-bottom:0cm;padding-left:0.191cm;padding-right:0.191cm;"| MOVE {45,45,0,0} | ||
Line 250: | Line 256: | ||
− | === | + | === 等值线 === |
− | + | 轮廓通过为每个运动定义“最终速度”“来连接不同的运动。 这样,运动不会在线段停止,继续下一个运动。 该方法适用于单轴应用,但在多轴应用中具有几个缺点: | |
− | * | + | * 运动方向之间的角度必须为零。 否则,会发生速度跳跃。 |
− | * | + | * 不能在没有加速度跳跃的情况下将圆弧与线性段连接. |
− | * | + | * 您必须计算每个段上可达到的最终速度,以在最后一段之后停止. |
− | == | + | == 工作包络 == |
− | + | 机器人工作空间由每个关节的位置限制决定。工作空间(所有可达到的位置)受到机器人工作范围的限制。从外侧,受到完全伸展臂(j2.pcmd = 0)后第一关节旋转的弧限制。 这是可达点的最大半径('''RMAX''')。 它是每次配置机器人时计算的内部值 ('''CONFIGGROUP''')。在该半径之外给出的点将被错误消息拒绝, ''Point Too Far''. | |
− | + | 另一个极限是半径为('''RMIN''')的小圆。 通过以最大折叠的第二关节(不超过180度)后旋转第一关节来获得该圆。另外该半径由机器人的基座尺寸和连接的末端执行器机构进一步扩大,以防止机器人自身发生碰撞。 最小工作包络半径('''RMIN''')可供用户使用(与 '''RMAX'''相反)。建议根据机器人的物理设置为每个应用程序设置此值。如果在'''RMIN'''中给出了一个点,则返回错误信息。 例如: | |
[[Image:Axsystems;UserManual-5-WorkingEnvelope.png|caption]] | [[Image:Axsystems;UserManual-5-WorkingEnvelope.png|caption]] | ||
Line 280: | Line 286: | ||
</pre> | </pre> | ||
− | == | + | == 机器人配置 == |
− | + | 在机器人模型中,对每个位置点有几个关节点可以表示相同的机器人末端执行器位置。要在不同的关节坐标之间进行唯一选择,要有配置标志。 | |
− | + | 对SCARA机器人运动学,只有一个配置标志可用,机械臂标志。它表示lefty (1) (j2.pcmd > 0)或 righty (2) (j2.pcmd > 0)。 值为1(lefty)表示具有正值的第二关节的关节坐标被用于表示给定位置。 '''ARMFBK'''返回机器人的当前配置。该值可以是1或2 ,取决于第二关节的位置反馈值。'''ARMFBK'''决定运动的目标位置。它可以是自动(0),lefty(1)或righty(2。当给出了具有笛卡尔目标位置的运动时,根据 '''ARMFBK'''选择目标位置的关节坐标。 如果为零(自动),则使用当前的机器人配置('''ARMFBK''')。 | |
− | + | PUMA模型习惯上使用三个配置标志(手臂,肘和腕 - '''ACMD''', '''ECMD''', '''WCMD''')。 | |
− | + | 另一种使用配置标志的是转换功能'''TOJOINT'''。 该功能将给定的位置点转换为关节点。 它接收两个参数。 第一个是位置变量,第二个是配置标志。 | |
− | = | + | = 点 = |
− | + | 一个点是用于存储变量中双精度列表的数据类型。 点的主要优点是您可以直接调用整个向量,而无需访问它的每个元素。 点数据类型有两个子类型:LOCATION和JOINT。 在同一表达式中使用两个点类型会导致类型不匹配转换错误。 点类型之间的类型转换需要使用特定的系统函数'''TOJOINT''' 和'''TOCART'''。 | |
− | == | + | == 声明== |
− | + | 必须先声明点然后才能使用它。点的声明根据机器人的类型(XYZR,XYZ等)定义。softMC启用了点变量的声明,可以是标量或数组。 点数组最多可以有10个维度。点变量被设计为保存2到10个双类型坐标的列表。点变量的声明与机器人类型有关。因此,声明点变量必须包含有效的机器人类型名称。点的维数与机器人类型的维数相同。格式是: | |
<nowiki>(COMMON SHARED|DIM {SHARED}) <</nowiki>''variable_name''<nowiki>> AS JOINT OF <</nowiki>''robot_type''><nowiki>(COMMON SHARED|DIM {SHARED}) <</nowiki>''variable_name''<nowiki>> AS LOCATION OF <</nowiki>''robot_type''> | <nowiki>(COMMON SHARED|DIM {SHARED}) <</nowiki>''variable_name''<nowiki>> AS JOINT OF <</nowiki>''robot_type''><nowiki>(COMMON SHARED|DIM {SHARED}) <</nowiki>''variable_name''<nowiki>> AS LOCATION OF <</nowiki>''robot_type''> | ||
− | <nowiki><</nowiki>''robot_type''> | + | <nowiki><</nowiki>''robot_type''> 可以是: |
XYZR – Three cartesian axes + rollXY – two axes XY tableXYZ – three axes XYZ system | XYZR – Three cartesian axes + rollXY – two axes XY tableXYZ – three axes XYZ system | ||
− | + | 例子: | |
<pre> | <pre> | ||
Common Shared JointXYZ As Joint Of XYZ | Common Shared JointXYZ As Joint Of XYZ | ||
Line 310: | Line 316: | ||
</pre> | </pre> | ||
− | == | + | == 变量 == |
− | + | 在点变量的解释器中定义了两个新的变量类型: LOCATION 和JOINT。对转换,点变量仅由它的类型,不同于任何其他类型的变量(Long, Double等)。 点变量作为变量叶插入到表达式树中。变量叶保留与点变量相关的数据,包括其上下文(系统,程序或本地),其偏移(取自符号表)及其类型(LOCATION或JOINT,也取自符号表)。 | |
− | === | + | === 声明 === |
− | + | 当声明一个点变量时,对应于该变量的数据被输入到正确的符号表中(取决于它是系统变量,程序变量还是局部变量)。点变量在符号表中由其名称,其类型(LOCATION或JOINT)和数据段的偏移量定义。数据段的每个偏移对应于点变量的地址。 机器人类型字符串被发送到特殊的函数,这个函数给出机器人类型值和坐标数量。 | |
− | == | + | == 常量点 == |
− | + | 常量点是未定义机器人类型的位置或关节向量。常量点的子类型由括号的类型定义(#{}用于位置,{}用于关节)。在解释器中,这两个向量类型中的每一个被认为是一个表达式。 每个表达式相关的命令和操作(如打印命令,数学运算符等)可以应用于关节和位置向量。 | |
− | + | 在执行向量表达式时,每个向量元素作为双重表达式(通过执行JOINT或LOCATION节点的左侧)被单独地压入堆栈。在执行每个坐标节点右侧的表达式之后,Long类型向量元素将转换为double类型表达式(在坐标节点中)。 | |
− | + | 执行JOINT或LOCATION节点的右侧导致将向量元素的数量推入堆栈(作为Long型常量)。通过执行JOINT / LOCATION节点的第三侧,将点的子类型(由向量括号的类型确定)推送到堆栈(作为Long型常量)。 | |
− | == | + | == 向量 == |
− | + | 向量实际上是常数点,其中2到10个坐标的列表写在大括号{}之间。 在位置向量中,大括号前面加上#号。坐标可以是long或double类型的任何类型的表达式(常量,变量,数学表达式,函数调用等)。Long型坐标自动转换为double,与点变量不同,向量与机器人类型无关,仅由其大小(坐标数)表征。 | |
− | <nowiki>{<</nowiki>''expression_1''<nowiki>>, …, <</nowiki>''expression_n''>} ‘ | + | <nowiki>{<</nowiki>''expression_1''<nowiki>>, …, <</nowiki>''expression_n''>} ‘ 关节向量 |
− | <nowiki>#{<</nowiki>''expression_1''<nowiki>>, …, <</nowiki>''expression_n''>} | + | <nowiki>#{<</nowiki>''expression_1''<nowiki>>, …, <</nowiki>''expression_n''>} ‘位置向量 |
− | + | 出现在相同表达式中的点变量和向量必须与类型(关节或位置)和数目相匹配匹配。 | |
<pre> | <pre> | ||
Common Shared JointXYZ As Joint Of XYZ | Common Shared JointXYZ As Joint Of XYZ | ||
− | JointXYZ = #{1.5, 2.8, 3} --> | + | JointXYZ = #{1.5, 2.8, 3} --> 错误 – 类型不匹配 |
− | PRINT {20, 6.7, 23} + #{8.43, 2, 0} --> | + | PRINT {20, 6.7, 23} + #{8.43, 2, 0} --> 错误 – 类型不匹配 |
− | JointXYZ = {2, 6} --> | + | JointXYZ = {2, 6} --> 错误 – 数目不匹配 |
− | PRINT {20, 6.7, 23} - {5, 4, 22.9, 31} --> | + | PRINT {20, 6.7, 23} - {5, 4, 22.9, 31} --> 错误 – 数目不匹配 |
</pre> | </pre> | ||
− | == | + | == 属性 == |
− | + | 一些组属性是点。 有一些关节只读属性('''VELOCITYFEEDBACK''', '''POSITIONCOMMAND''', '''DEST_JOINT'''), 和位置类型('''DEST''', '''HERE''', '''SETPOIN'''T). 还有一些位置类型的读写属性,如 '''TOOL''', '''BASE'''等。 | |
− | + | 与点变量一样,机器人类型也点属性的特征。出现在表达式中,与其他点混合在一起的点属性必须在类型和机器人类型中指向属性和变量,或者与向量的类型和数目相匹配。 | |
<pre> | <pre> | ||
Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 | Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 | ||
Common Shared PointXYZR As Joint Of XYZR | Common Shared PointXYZR As Joint Of XYZR | ||
Dim Shared PointXYZ As Joint Of XYZ | Dim Shared PointXYZ As Joint Of XYZ | ||
− | PointXYZR = SCARA.SetPoint --> | + | PointXYZR = SCARA.SetPoint --> 错误 – 类型不匹配 (Setpoint returns a location) |
− | PointXYZ = SCARA.VelocityFeedback --> | + | PointXYZ = SCARA.VelocityFeedback --> 错误 – 机器人类型不匹配 |
− | SCARA.Base = #{56.5, -104.7, -90.5} --> | + | SCARA.Base = #{56.5, -104.7, -90.5} --> 错误 – 数目不匹配 |
</pre> | </pre> | ||
− | == | + | == 点维度 == |
− | + | 您在声明时未定义向量数据类型的数目,但您可以定义与该点相关的机器人的类型。 这给出了一个维度。 | |
− | == | + | == 点分配 == |
− | + | 点分配使用以下格式: | |
<nowiki><</nowiki>''variable_name''<nowiki>> = (<</nowiki>''expr1''<nowiki>>,<</nowiki>''expr2''<nowiki>>,<</nowiki>''expr3''<nowiki>>,…,<</nowiki>''expr''n>)() = #{} for location() = {} for joint | <nowiki><</nowiki>''variable_name''<nowiki>> = (<</nowiki>''expr1''<nowiki>>,<</nowiki>''expr2''<nowiki>>,<</nowiki>''expr3''<nowiki>>,…,<</nowiki>''expr''n>)() = #{} for location() = {} for joint | ||
− | + | 表达式可以是同一机器人类型的常量或其他向量变量,但表达式右侧的大小必须等于左侧。 如果您尝试使用其他机器人类型的点来分配点,则会收到错误。 | |
− | == | + | == 单个坐标点分配 == |
− | + | 分配点的单个坐标的格式: | |
<nowiki><</nowiki>''variable_name''<nowiki>>{<</nowiki>''expression''<nowiki>>} = <</nowiki>''expression''> | <nowiki><</nowiki>''variable_name''<nowiki>>{<</nowiki>''expression''<nowiki>>} = <</nowiki>''expression''> | ||
− | == | + | == 点查询 == |
− | + | 点查询的格式是: | |
<nowiki>?<</nowiki>''variable_name''> | <nowiki>?<</nowiki>''variable_name''> | ||
− | == | + | == 单坐标点查询 == |
− | + | 用于查询点的单个坐标的格式: | |
<nowiki>?<</nowiki>''variable_name''<nowiki>>{<</nowiki>''expression''>} | <nowiki>?<</nowiki>''variable_name''<nowiki>>{<</nowiki>''expression''>} | ||
− | ''' | + | '''示例 1''' |
<pre> | <pre> | ||
− | Common shared P1 as location of XYZR ' | + | Common shared P1 as location of XYZR '声明向量 (全局) |
− | P1 = #{1,2,3,4} ' | + | P1 = #{1,2,3,4} '分配整个向量 |
− | P1 = #{1,2} ' | + | P1 = #{1,2} '返回解析错误 |
− | ?P1 ' | + | ?P1 '读整个向量 |
− | ?P1{2} ' | + | ?P1{2} '读取向量的第二个坐标 |
</pre> | </pre> | ||
− | ''' | + | '''示例 2''' |
<pre> | <pre> | ||
− | <nowiki>Common shared P2[5] as location </nowiki>XYZ ' | + | <nowiki>Common shared P2[5] as location </nowiki>XYZ '声明全局数组向量 |
− | <nowiki>P2[1] = #{1,2,3} </nowiki>' | + | <nowiki>P2[1] = #{1,2,3} </nowiki>'分配整个向量 |
− | <nowiki>P2[2] = #{5,2} </nowiki>' | + | <nowiki>P2[2] = #{5,2} </nowiki>'返回解析错误 |
− | <nowiki>?P2[1] </nowiki>' | + | <nowiki>?P2[1] </nowiki>'读整个向量 |
− | <nowiki>?P2[2]{2} </nowiki>' | + | <nowiki>?P2[2]{2} </nowiki>'读取向量的第二个坐标 |
</pre> | </pre> | ||
− | == | + | == 操作 == |
− | + | 像任何其他数据类型一样,点可以使用运算符。 系统只定义相等运算符(加,减,乘除)。点之间的操作只能在相同类型和机器人类型(或大小)的点之间执行。所有操作也可以在点和long或double类型表达式之间执行。 | |
− | === | + | === 分配 === |
− | + | 点变量和读写属性可以通过类型和大小(或机器人类型)兼容的点变量,向量和点属性来分配。 | |
− | === | + | === 查询 === |
− | + | 点变量,属性和向量返回一个值,因此它们都可以通过打印或赋值到兼容点变量或读写属性来查询。 | |
<pre> | <pre> | ||
Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 | Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 | ||
Line 417: | Line 423: | ||
</pre> | </pre> | ||
− | === | + | === 加 === |
− | + | 点加运算符像任何其他数据类型一样使用。它将第一个点的每个元素与第二个点的每个元素相加。 结果是一个点。 | |
<pre> | <pre> | ||
?{1,2}+{2,4} | ?{1,2}+{2,4} | ||
Line 424: | Line 430: | ||
</pre> | </pre> | ||
− | === | + | === 减 === |
− | + | 点减运算符像任何其他数据类型一样使用。 它用第二个点的每个元素减去第一个点的每个元素。 结果是一个点。 | |
<pre> | <pre> | ||
?{1,2}-{2,4} | ?{1,2}-{2,4} | ||
Line 431: | Line 437: | ||
</pre> | </pre> | ||
− | === | + | === 乘 === |
− | + | 点乘法运算符像任何其他数据类型一样使用。 它将第一个点的每个元素与一个数字相乘。 您只能将点乘以单个数字(一维数字)。 结果是一个点。 | |
<pre> | <pre> | ||
?2*{2,4} | ?2*{2,4} | ||
Line 438: | Line 444: | ||
</pre> | </pre> | ||
− | === | + | === 除 === |
− | + | 点除运算符像任何其他数据类型一样使用。 它将第一个点的每个元素除以一个数字。 您只能用一个数字(一维数字)来划分一个点。 结果是一个点。 | |
<pre> | <pre> | ||
?{2,4}/2 | ?{2,4}/2 | ||
Line 447: | Line 453: | ||
</pre> | </pre> | ||
− | === | + | === 复合 (:) === |
− | + | 是一个特定于点的操作,它应该在相同大小的两个位置点(或机器人类型)之间操作。 | |
<pre> | <pre> | ||
? #{-56.5 , -104.7 , 89.5} : #{ 0.0, -104.7 , -0.5} | ? #{-56.5 , -104.7 , 89.5} : #{ 0.0, -104.7 , -0.5} | ||
Line 454: | Line 460: | ||
</pre> | </pre> | ||
− | === | + | === 限制 === |
− | MOD ( | + | MOD (模数), ^ (幂), 逻辑和按位运算符不能用于点。 |
− | + | 点不能用作流控制语句和事件定义中的条件。 | |
− | + | 点无法记录。 | |
− | == | + | == 函数中的点 == |
− | + | 点变量可以通过引用和值传递给函数和子程序。整个点数组也可以被传递(通过引用)到一个函数或子程序。另一方面,点属性和向量只能通过值传递。点也可以作为函数的返回值。但是,参数或返回值的点类型和大小(或机器人类型)必须与函数声明相匹配。 | |
− | === | + | === 值传递和引用 === |
− | + | 点可以像任何其他数据类型一样通过值和引用传递。 例如: | |
<pre> | <pre> | ||
Program | Program | ||
Line 477: | Line 483: | ||
</pre> | </pre> | ||
− | + | 该程序将{1,2,3,4}分配给P1并打印{1,2,3,4}作为输出。 当一个点通过引用或值传递时,您只能将相同机器人类型的点传递到''X''。否则,您会收到一个解析错误。 | |
− | ''' | + | '''示例 1''' |
<pre> | <pre> | ||
Program | Program | ||
Line 491: | Line 497: | ||
</pre> | </pre> | ||
− | ''' | + | '''示例 2''' |
<pre> | <pre> | ||
Program | Program | ||
Line 503: | Line 509: | ||
</pre> | </pre> | ||
− | === | + | === 函数返回点 === |
− | + | 函数可以像任何其他数据类型一样返回点变量。例如: | |
<pre> | <pre> | ||
Dim A as location of XYZR | Dim A as location of XYZR | ||
Program | Program | ||
Move G1 MyFunc(1) vcruise=299 | Move G1 MyFunc(1) vcruise=299 | ||
− | --> | + | --> 如果G1是XYZR机器人类型,这将是正确的 |
End Program | End Program | ||
Line 517: | Line 523: | ||
</pre> | </pre> | ||
− | == | + | == 运动命令 == |
− | + | 一些运动命令在组上应用时使用点的节点参数。例如: '''CIRCLE''', '''MOVE''' and '''MOVES'''. | |
− | + | 一些节点参数可以分配两种点类型(LOCATION and JOINT),如'''CIRCLECENTER''', '''CIRCLEPOINT'''以及'''MOVE '''和 '''MOVES'''的目标位置。其他节点参数只能接受位置点,如TOOL,BASE等。将所有节点参数与机器人类型或大小兼容的点分配给组。 | |
<pre> | <pre> | ||
Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 | Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 | ||
Common Shared JointXYZ As Joint Of XYZ | Common Shared JointXYZ As Joint Of XYZ | ||
− | MOVE SCARA JointXYZ --> | + | MOVE SCARA JointXYZ --> 错误 – 机器人类型不匹配 |
CIRCLE SCARA Angle = 180 CircleCenter = #{350, 500, -80} | CIRCLE SCARA Angle = 180 CircleCenter = #{350, 500, -80} | ||
− | --> | + | --> 错误 – 数目不匹配 |
MOVES SCARA #{-22, 503.8, -8.3, 149} Base = SCARA.Dest_Joint | MOVES SCARA #{-22, 503.8, -8.3, 149} Base = SCARA.Dest_Joint | ||
− | --> | + | --> 错误 –类型不匹配 |
</pre> | </pre> | ||
− | == | + | == 点作为表达式 == |
− | + | 点属性可以存储为一个点或者作为一个点进行比较。 例如: | |
<pre> | <pre> | ||
Dim A as Joint of XYZR | Dim A as Joint of XYZR | ||
A = {1,2,3,4} | A = {1,2,3,4} | ||
A = G1.Pcmd | A = G1.Pcmd | ||
− | A = G2.Pcmd --> | + | A = G2.Pcmd --> 如果G2不是XYZR类型,则返回翻译错误。 |
</pre> | </pre> | ||
− | === | + | === 函数 === |
− | + | 定义了以下函数: | |
<pre> | <pre> | ||
<nowiki><</nowiki>XYZR location<nowiki>> = TOCart (<</nowiki>group<nowiki>>, <</nowiki>XYZR JOINT>) | <nowiki><</nowiki>XYZR location<nowiki>> = TOCart (<</nowiki>group<nowiki>>, <</nowiki>XYZR JOINT>) | ||
Line 550: | Line 556: | ||
</pre> | </pre> | ||
− | + | 在TOJOINT指令中,配置标志的数量和类型取决于每种机器人类型。注意,机器人属性ARMCMD,ECMD,WCMD都有三个值(0,1,2),其中0被保留用于AUTO选项。但是配置位只有两个值(0,1)。 | |
− | + | 对SCARA机器人: Arm ( Bit 0): value = 0 - Lefty(armcd = 1)value = 1- Righty(armcmd = 2) | |
− | + | 对PUMA机器人: Arm ( Bit 0): value = 0 - Lefty(armcd = 1) value = 1 - Righty(armcmd = 2) | |
Elbow ( Bit 1):value = 0 - Below(ecmd = 1) value = 1 - Above(ecmd = 2) | Elbow ( Bit 1):value = 0 - Below(ecmd = 1) value = 1 - Above(ecmd = 2) | ||
Line 560: | Line 566: | ||
Wrist ( Bit 2): value = 0 - Noflip (wcmd = 1) value = 1 - Flip (wcmd = 2) | Wrist ( Bit 2): value = 0 - Noflip (wcmd = 1) value = 1 - Flip (wcmd = 2) | ||
− | + | 对TRAVERSE-ARM机器人: Arm ( Bit 0): value = 0 - Lefty(armcd = 1)value = 1 - Righty(armcmd = 2) | |
− | + | 对于没有配置标志的DELTA,SCISSORS,...和其他机器人,这些字段不被使用。 | |
− | + | tojoint的配置标志参数定义为: | |
<math>\mathit{cfg}=\sum_{i=0,1,2} \left (value_{i} - 1 \right )\cdot 2^{i}</math> | <math>\mathit{cfg}=\sum_{i=0,1,2} \left (value_{i} - 1 \right )\cdot 2^{i}</math> | ||
− | === | + | === 加载/保存 === |
− | + | 每个全局变量都可以存储在一个文件中。变量及其值与程序中定义的格式相同。 您可以选择要存储的数据类型。 如果选择了数据类型,则SAVE命令仅存储该数据类型的全局变量。如果具有相同名称的文件已存在,则其扩展名将重命名为* .bak,并创建新文件。加载文件将覆盖保存的全局变量的值。 您可以保存与某些类型的机器人相关的所有点。例如: | |
<pre> | <pre> | ||
SAVE file = "Myfile.prg" type = location robottype = xyzr | SAVE file = "Myfile.prg" type = location robottype = xyzr | ||
Line 576: | Line 582: | ||
</pre> | </pre> | ||
− | = | + | = 参考 = |
* [[PUMA THETA Parameters|PUMA DH Parameters]] | * [[PUMA THETA Parameters|PUMA DH Parameters]] | ||
* [[SCARA J1 range|SCARA J1 Range]] | * [[SCARA J1 range|SCARA J1 Range]] |
Latest revision as of 13:06, 13 September 2017
语言: | English • 中文(简体) |
---|
介绍
多个轴可以组合并运动。 有:
- 简单组((无模型,可以是相同类型或不同类型)
- 笛卡尔组(每个轴的作用被严格定义,例如:XYZ,XYZR,...)
- 机器人(应用特定机器人模型(SCARA,PUMA,...)
组是数据对象(运动元素),使我们能够将其轴同步移动。如果所有的轴都是相同类型(全部是线性轴或全部旋转轴),它们的速度,加速度和加加速度值可以组合起来(使用平方和的平方根),运动参数将具有物理意义。 我们称这些类型的组为homogeneous groups。
Non-homogeneous groups由旋转轴和线性轴两种轴组成。增加了一个特征来支持非同类型组速度的定义。 在设置中,声明旋转轴和线性轴。 系统确定它是线性还是旋转主导组。例如,在SCARA机器人中,有两个旋转轴用于第一和第二个关节,另一个旋转轴用于最后一个关节(旋转)。 只有一个线性轴(Z轴)。这种系统是旋转主导的。 另一个例子是XYZ-Roll系统。 这里,只有一个旋转轴(旋转)有两个线性(X和Y)轴和另一个线性(Z轴)。 在这种情况下,系统是线性主导的。 轴设置定义组的行为。每个轴必须声明是线性轴或旋转轴,通过设置 POSITIONROLLOVERENABLE 为线性轴(0)或旋转轴(1)。
在非同类型组中, 根据组的主导类型(参考: DOMINANCEMODE)总是给出联合插补运动(MOVE)命令速度。如果该组是线性优势的,速度(VCRUISE, VFINAL)为线性单位(mm / sec)。 在运动的准备阶段检查其他非线性轴。 这些轴的速度不能超过最大值。 如果是这样,总体(组)速度就会降低。
这个规则只有一个例外。这是当一个组运动只发出一个运动轴并且其他轴停止时。然后,给定速度的单位直接取决于该轴的单位。 例如,SCARA机器人的第三轴上具有运动,速度值以mm / sec为单位。
对于组内插补运动的加速度和加加速度值也是如此。
如果非同类型组中的设置不正确,即有不同类型的轴但是但所有轴的POSITIONROLLOVERENABLE都设置为相同的值。运动组仍然会运动,但是组中速度/加速度/加加速度值将不再具有物理意义。如果轴之间的数值显着不同,则系统可能有线。?
NOTE | |
上述讨论仅适用于组的简单联合插值运动(请参阅Move or Circle)。 笛卡尔组中Moves和Circle使用Vtran和Vrot参数。 |
坐标系
世界坐标系
具有不同的世界和关节坐标使机器人运动学独一无二 。世界坐标通常被认为是应用程序的工作坐标。通常基于机器人基座的笛卡尔坐标系有一些其他的形式。
另外一种是在终端执行器(比如夹爪等)的方向添加另一组坐标。刚体在空间中的方位通常用三个角度描述。根据自由度的数量(电机用来驱动关节角度),它们可能不相等。在大多数情况下,世界空间坐标由其位置部分(X,XY或XYZ元组)给出。 一般来说,它可以是从球坐标到圆柱坐标的任何东西。 方向组件可以使用许多形式来描述方向。大多数使用的方向角坐标系是欧拉角:偏航,俯仰和滚转。理论上,欧拉角有12种不同的表现形式,根据大多数机器人模型中使用Z-Y-Z顺序的方向顺序。
关节坐标系
机器人的关节空间是一个相对简单的概念。关节坐标是唯一描述机器人相对于先前的位置的数字。 如果连接节段的关节是旋转的,则关节坐标为旋转角度。 如果是线性的,则关节坐标是线性位移(毫米)。
点数据类型
关节坐标的概念是一个n元组数。 每个数字表示特定关节的坐标。 世界坐标由描述每个不同世界空间表示的不同内置类型(XY,XYZ,XYZR)支持。 对于相同(或相同维度)的世界坐标,可以有不同的世界空间描述。 每个机器人都有其默认的世界空间类型。 不同的机器人可以具有相同的世界空间类型,只要它们具有相同数量的自由度(NDOF)。 例如,xy平台世界空间具有XY世界空间描述符。SCARA机器人有用于垂直运动的Z轴和用于定向的转动轴,使用由由X,Y,Z和转动或XYZR描述组成的世界坐标系。
不同的坐标系被实现为不同数据类型的变量。 通常,坐标系中的一个点被定义为点数据类型。 根据是否是关节空间或世界空间,点的子类型不同。 点数据类型有两个子类型: JOINT和LOCATION。两者都有一个世界空间描述符,可以区分相同的子类型。 世界空间坐标存储在变量中,定义为:
DIM A AS LOCATION OF XYZR
关节空间是:
DIM A AS JOINT OF XYZR
具有两个子类型(LOCATION和JOINT)和世界空间描述符(XY,XYZ,XYZR等)的点数据类型涵盖了所有可能的机器人空间变化。这些变量与机器人无关,可以在系统中未定义机器人的情况下使用。当它们与机器人或组的连接使用时,世界子类型必须相等。
该点可以使用所有可用的算术运算(+ - * /)作为数值数据类型进行操作。 操作被定义为逐个坐标操作。只有相同子类型和相同世界空间的点可以组合。
用于点常数的语法: 用方括号({})内的命令分隔的值列表表示点。 如果它之前是井号(#),它是一个位置:
DIM C AS LOCATION OF XYZR C = #{0,0,0,0} DIM I AS JOINT OF XYZR I = {0,0,0,0}
用户单位
softMC可以让您自由地更改和选择不同的单位。机器人模型具有较小的灵活性。由于关节和世界空间之间的紧密关系,您必须以毫米或度数定义关节位置单位,以秒为单位定义所有时间单位,以便世界空间和关节间隔都是兼容单位。世界空间的单位自动设置为毫米-度-秒。
每个轴都有四个缩放因子: PFAC,VFAC, AFAC, and JFAC。这些将编码器计数和旋转计数转换为用户位置单位(英寸,毫米或圈)。它们还指定在位置求导中使用什么时间单位(VEL, ACC, JERK)。由于位置因子定义了计数和用户位置单位之间的比例,其余因子定义了毫秒和用户时间单位之间的比率。 通常有:
<axis>.pfac = <number of counts per user position units> <axis>.vfac = pfac/1000 (if in seconds) <axis>.afac = vfac/1000 (if in seconds) <axis>.jfac = afac/1000 (if in seconds)
所有轴都设置完毕后,组包含这些轴。 所有轴上必须具有相同的用户单位。 设置组缩放因子 组没有位置因子! 相反, 使用每个轴的 PFAC。
MOVE g1 {1,2,3} vcruise = 10
目标坐标被给予每个轴,并且转换成使用每个轴的PFAC编码器/解析器计数。 VCRUISE与任何轴无关。 使用组因子, VFAC, AFAC和JFAC。 组速度以用户单位/秒表示。
要使系统单元正常工作, 请将每个轴的单位因子 (PFAC, VFAC, AFAC and JFAC)设置为毫米-度-秒并将组单位设置为秒:
<group>.vfac = 1/1000 <group>.afac = vfac/1000 <group>.jfac = afac/1000
耦合
在许多机器人应用中,机械结构引入轴之间的机械耦合。在这种情况下,两个或多个电机只移动一个关节。 因此,仅激活一个电机会导致两个轴(关节)的运动。有很多这样的机械设置的例子。通常当电机移动关节时,它们正在启动。 当电机在第一关节之前时移动第二关节时,第二关节通过第一和第二电机的运动而移动。这种应用的典型实例是移动机械手臂(PUMA)的电机通过链条或皮带移动机器人手臂。最后一个机器人部件上的差速齿轮传动从末端执行器移动最后一个电机(转动),第五和第六个电机引入第六个关节的运动(Staubli RX系列)。
Staubli RX 手腕 – 对轴 a5 ,a6:
j6.pcmd = a6.pcmd – a5.pcmd
BOSCH – SCARA – 对轴 a3,a4:
j3.pcmd = a3.pcmd + 18.3*a4.pcmd.
PUMA – a2,a3 and a4:
j4.pcmd=a2.pcmd+a3.pcmd+a4.pcmd.
缩放和旋转:
j1 = 707.1*a1.pcmd + 707.1*a2.pcmd j2 = 707.1*a1.pcmd + 707.1*a2.pcmd
正交校正:
j1 =10000*a1.pcmd j2 = 2.91*a1.pcmd + 10000*a2.pcmd
组关节是softMC固件的标准配置,涵盖上面给出的耦合示例。
运动元素
softMC是一个多轴和多组系统。在许多方面,组和轴是相同的。例如,它们都具有以下属性: AMAX', VMAX, VCRUISE。另一个相同的方面是两者的运动。虽然运动命令有仅组(CIRCLE, MOVES) 或仅轴(JOG),但单独移动轴时,不可能移动包含相同轴的组,反之亦然。轴在组中有效。 ATTACH''DETACH的工作方式相同,当轴的组已经关联时,轴不能再关联。 因此,我们可以使用一个术语motion-element来表示轴和组。
有一些是仅属于轴或仅属于组的属性。例如DRIVEADDRESS是一个仅属于轴的属性。
MOVE包含两种不同的命令特性,Move-Group和Move-Axis。Move-Group将全部组一起移动。组内的所有轴在同一时间开始和结束运动。Move-Group保持在组和轴的运动学限制 (VELOCITY,ACCELERATION,JERK)。组的限制被执行并施加组运动上(集合,空间XY,XYZ)。轴限制仅与轴运动与整个组运动的比例成比例的执行。如果轴X向Y轴一半移动,则只能使用一半的极限值。运动的总时间是最慢轴完成运动所需的时间。这里,最慢的轴是具有最大路径/速度比的轴,并且不需要具有最小最大速度的轴(因为如果这样的轴没有运动,则不是最慢的轴)。另一方面,Move-Axis仅检查指定轴的极限,并且与使用该轴的任何组的极限无关。
分析器的准备可以额外减少运动参数。这是典型的短暂的运动,由于ACCELERATION和JERK的现有限制,给定的巡航速度无法达到。
关节
关节是虚拟轴。 无论从语言的角度看,还是耦合轴的物理运动,关节只给出一个轴的错觉,关节类似于轴,关节表示为J1,J2等
根据给定的耦合矩阵,每个关节实际上表示该组的一个或多个轴。如果组没有定义耦合矩阵,则关节是组中相同序数的轴作为关节索引的直接表示。 为了引入另一个术语,关节的"影轴"是组中与关节索引具有相同序数的轴。 例如,如果一组由轴A2,A3,A4组成,则关节J1的影轴为A2。
通常,所有关节属性都是影轴属性的直接表示(具有相同的值),与是否定义了耦合矩阵无关。唯一的例外是与关节位置相关的属性: PCMD, PFB, VCMD, VFB, CCMD, CFB, PMAX和PMIN,这些是每个关节独有的。
根据给定的耦合矩阵获得当前位置和速度。每次发出这些值的查询(PCMD, PFB,等)时都会计算它们。它们是只读的,不表示任何特定的内部变量。从组(?g1.PCMD)查询时,对称地具有相同的属性,根据耦合矩阵返回关节属性值的列表。 组运动的运动的目标位置(MOVE or CIRCLE)类似(耦合矩阵)处理。
另一方面,关节的位置限制(PMAX和PMIN) 被添加到关节中。 关节的位置限制和影轴的位置限制不相关,与是否定义耦合矩阵无关。当定义耦合矩阵(COUPLED = 1)时,总是使用关节位置限制。 在这种情况下,不会使用影轴限制。 这只适用于关节和组运动。单轴运动(例如,MOVE A1 100)仅受轴限制的限制,与耦合无关。
关节代表一组中的几个轴。 关节运动实际上是组运动:
Move-Group = Move-Joint
关节运动给出移动一个物理轴(MOVE J1 100)的错觉,尽管有几台电机可以在一起移动。根据指定的关节运动参数执行运动。 例如:
A1.Acc = 100 MOVE A1 50
类似于:
J1.Acc = 100 MOVE J1 50
Move-Joint模拟通过参数和物理运动移动单个关节来移动单个轴的行为。唯一的区别是几台电机正在移动而不是一个电机。关节移动时,检查每个组轴内的所有电机限位。关节运动是一组关节坐标与从影轴复制的组运动参数的组运动。下面的转换规则为真:
MOVE J1 10 <=> MOVE {10,0,0,0} abs = J1.abs vcruise = J1.vcruise acc = J1.acc
机器人模型
机器人被定义为具有特殊型号类型的组 (请参阅当前可用的机器人型号列表: robot_model_table)
例如:
COMMON SHARED scara AS GROUP AxNm = a1 AxNm = a2 AxNm = a3 AxNm = a4 Model = '''4'''
机器人设置
这将自动定义具有SCARA运动学模型的机器人。与仅需要使能轴的通用组相反,必须设置机器人参数并对其进行配置。 不同的机器人需要设置的参数不同。对SCARA机器人, 这些是:
- 使用所有标准运动学参数设置所有轴
- 定义转属性
- 设置整个组的所有用户单位因子: VFAC, AFAC, JFAC
- 设置每个机械臂链接的连杆长度和关节角度
- 设定通用组的运动学 (VELOCITY, ACCELERATION, JERK, etc.)
- 设定笛卡尔运动的运动学 (VTRAN,VROT, etc.)
只有在设置好所有这些并且成功执行CONFIGGROUP之后,机器人才能运动。否则返回错误,表示该组未配置。常规组(默认模型值1)与机器人之间的重要区别是执行CONFIGGROUP的必要性。 在机器人组中,机器人在配置之前不允许运动。
模型值自动定义默认机器人世界空间描述符。 对于模型4(SCARA),选择XYZR(x-y-z-roll)世界空间。
在有定义的机器人模型(模型> 1)的组中,关节和世界空间之间不是简单的转换。将“关节坐标转换为世界坐标是用TOCART来实现的,它将机器人和给定的关节坐标(位置变量)同时作为输入参数。其输出是与给定关节位置对应的世界坐标。
另一个方向更复杂。 通过TOJOINT 接收三个输入参数来实现:机器人,给定的笛卡尔点和配置标志。
配置标志用于在两个翻译功能之间进行选择。在大多数机器人模型中,对于相同的世界空间位置,有多个关节坐标描述。不同的机器人配置可以产生有不同关节空间值但是有相同的世界空间位置。不同的机器人配置不同,在 在SCARA中,只有两个配置:lefty(第二个关节坐标是负的)和righty(第二个关节坐标是正的)。
插补
对于有机器人型号(型号> 1)的组,还有一个额外的运动类型:MOVES。运动从起始位置到世界空间中给定的目标位置是一条直线。平直度与工作空间紧密相关。 相同的路径在笛卡尔工作空间(XYZ)中可以是直的,但在关节空间中弯曲,反之亦然。 MOVES 仅用于机器人类型的组,不能在通用组中使用。
直线运动是指在世界空间中是直线的运动。在没有机器人模型(模型= 1)的组中,使用MOVES生成的所有运动是关节空间中的直线运动。在通用的线性主导组中,它们的大多数轴是线性的。由于世界空间和关节空间是相同的, MOVES在关节空间和世界空间中执行一条直线。目标位置可以在世界和关节空间坐标中给出。运动与关节插值(MOVE)不同。 使不是用常规组中使用的关节空间运动学参数,而是使用速度,加速度和加加速度的世界空间参数。这些参数有两种形式:一种用于运动的平移部分,另一种用于旋转部分(方向)。
当世界空间具有位置和方向分量时,直线运动包括位置和方向上的插值。 因为这两个在本质上不同的对象,所以需要两个不同的参数:一个用于平移(纯位置插值): VELOCITYTRANS, ACCELERATIONTRANS, JERKTRANS; 另一个用于旋转(旋转插值): VELOCITYROT, ACCLERATIONROT, JERKROT. 这些参数仅用于笛卡尔插值(MOVES and CIRCLE)。这些参数对关节插值MOVE)没有影响,因为它不是世界空间插值。
两组参数定义了直线运动。 哪个参数是运动的主要因素取决于运动。 如果大部分运动都处于平移位置的变化,方向的变化要小得多,则平移部分被采用。 相反,旋转参数定义直线运动。
有四个命令用于在机器人组中进行点对点移动。由两个命令用于插值运动(MOVE和MOVES) ,两个命令来定义目标点(JOINT和 LOCATION). 它们的总体组合提供了四个选项。
位置目标 | 关节目标 | |
笛卡尔插值 | MOVES #{400,400,0,0} | MOVES {45,45,0,0} |
关节插值 | MOVE #{400,400,0,0} | MOVE {45,45,0,0} |
等值线
轮廓通过为每个运动定义“最终速度”“来连接不同的运动。 这样,运动不会在线段停止,继续下一个运动。 该方法适用于单轴应用,但在多轴应用中具有几个缺点:
- 运动方向之间的角度必须为零。 否则,会发生速度跳跃。
- 不能在没有加速度跳跃的情况下将圆弧与线性段连接.
- 您必须计算每个段上可达到的最终速度,以在最后一段之后停止.
工作包络
机器人工作空间由每个关节的位置限制决定。工作空间(所有可达到的位置)受到机器人工作范围的限制。从外侧,受到完全伸展臂(j2.pcmd = 0)后第一关节旋转的弧限制。 这是可达点的最大半径(RMAX)。 它是每次配置机器人时计算的内部值 (CONFIGGROUP)。在该半径之外给出的点将被错误消息拒绝, Point Too Far.
另一个极限是半径为(RMIN)的小圆。 通过以最大折叠的第二关节(不超过180度)后旋转第一关节来获得该圆。另外该半径由机器人的基座尺寸和连接的末端执行器机构进一步扩大,以防止机器人自身发生碰撞。 最小工作包络半径(RMIN)可供用户使用(与 RMAX相反)。建议根据机器人的物理设置为每个应用程序设置此值。如果在RMIN中给出了一个点,则返回错误信息。 例如:
Program attach move {j1.pmin,j2.pmin,0,0} while ismoving sleep 1 End While Print "Plotting the workspace" move {j1.pmin,0,0,0} move {j1.pmax,0,0,0} move {j1.pmax,j2.pmax,0,0} detach End Program
机器人配置
在机器人模型中,对每个位置点有几个关节点可以表示相同的机器人末端执行器位置。要在不同的关节坐标之间进行唯一选择,要有配置标志。
对SCARA机器人运动学,只有一个配置标志可用,机械臂标志。它表示lefty (1) (j2.pcmd > 0)或 righty (2) (j2.pcmd > 0)。 值为1(lefty)表示具有正值的第二关节的关节坐标被用于表示给定位置。 ARMFBK返回机器人的当前配置。该值可以是1或2 ,取决于第二关节的位置反馈值。ARMFBK决定运动的目标位置。它可以是自动(0),lefty(1)或righty(2。当给出了具有笛卡尔目标位置的运动时,根据 ARMFBK选择目标位置的关节坐标。 如果为零(自动),则使用当前的机器人配置(ARMFBK)。
PUMA模型习惯上使用三个配置标志(手臂,肘和腕 - ACMD, ECMD, WCMD)。
另一种使用配置标志的是转换功能TOJOINT。 该功能将给定的位置点转换为关节点。 它接收两个参数。 第一个是位置变量,第二个是配置标志。
点
一个点是用于存储变量中双精度列表的数据类型。 点的主要优点是您可以直接调用整个向量,而无需访问它的每个元素。 点数据类型有两个子类型:LOCATION和JOINT。 在同一表达式中使用两个点类型会导致类型不匹配转换错误。 点类型之间的类型转换需要使用特定的系统函数TOJOINT 和TOCART。
声明
必须先声明点然后才能使用它。点的声明根据机器人的类型(XYZR,XYZ等)定义。softMC启用了点变量的声明,可以是标量或数组。 点数组最多可以有10个维度。点变量被设计为保存2到10个双类型坐标的列表。点变量的声明与机器人类型有关。因此,声明点变量必须包含有效的机器人类型名称。点的维数与机器人类型的维数相同。格式是:
(COMMON SHARED|DIM {SHARED}) <variable_name> AS JOINT OF <robot_type>(COMMON SHARED|DIM {SHARED}) <variable_name> AS LOCATION OF <robot_type>
<robot_type> 可以是:
XYZR – Three cartesian axes + rollXY – two axes XY tableXYZ – three axes XYZ system
例子:
Common Shared JointXYZ As Joint Of XYZ Common Shared JointXYZR As Joint Of XYZR Common Shared LocXYZ As Location Of XYZ JointXYZ = LocXYZ --> Error – type mismatch
变量
在点变量的解释器中定义了两个新的变量类型: LOCATION 和JOINT。对转换,点变量仅由它的类型,不同于任何其他类型的变量(Long, Double等)。 点变量作为变量叶插入到表达式树中。变量叶保留与点变量相关的数据,包括其上下文(系统,程序或本地),其偏移(取自符号表)及其类型(LOCATION或JOINT,也取自符号表)。
声明
当声明一个点变量时,对应于该变量的数据被输入到正确的符号表中(取决于它是系统变量,程序变量还是局部变量)。点变量在符号表中由其名称,其类型(LOCATION或JOINT)和数据段的偏移量定义。数据段的每个偏移对应于点变量的地址。 机器人类型字符串被发送到特殊的函数,这个函数给出机器人类型值和坐标数量。
常量点
常量点是未定义机器人类型的位置或关节向量。常量点的子类型由括号的类型定义(#{}用于位置,{}用于关节)。在解释器中,这两个向量类型中的每一个被认为是一个表达式。 每个表达式相关的命令和操作(如打印命令,数学运算符等)可以应用于关节和位置向量。
在执行向量表达式时,每个向量元素作为双重表达式(通过执行JOINT或LOCATION节点的左侧)被单独地压入堆栈。在执行每个坐标节点右侧的表达式之后,Long类型向量元素将转换为double类型表达式(在坐标节点中)。
执行JOINT或LOCATION节点的右侧导致将向量元素的数量推入堆栈(作为Long型常量)。通过执行JOINT / LOCATION节点的第三侧,将点的子类型(由向量括号的类型确定)推送到堆栈(作为Long型常量)。
向量
向量实际上是常数点,其中2到10个坐标的列表写在大括号{}之间。 在位置向量中,大括号前面加上#号。坐标可以是long或double类型的任何类型的表达式(常量,变量,数学表达式,函数调用等)。Long型坐标自动转换为double,与点变量不同,向量与机器人类型无关,仅由其大小(坐标数)表征。
{<expression_1>, …, <expression_n>} ‘ 关节向量
#{<expression_1>, …, <expression_n>} ‘位置向量
出现在相同表达式中的点变量和向量必须与类型(关节或位置)和数目相匹配匹配。
Common Shared JointXYZ As Joint Of XYZ JointXYZ = #{1.5, 2.8, 3} --> 错误 – 类型不匹配 PRINT {20, 6.7, 23} + #{8.43, 2, 0} --> 错误 – 类型不匹配 JointXYZ = {2, 6} --> 错误 – 数目不匹配 PRINT {20, 6.7, 23} - {5, 4, 22.9, 31} --> 错误 – 数目不匹配
属性
一些组属性是点。 有一些关节只读属性(VELOCITYFEEDBACK, POSITIONCOMMAND, DEST_JOINT), 和位置类型(DEST, HERE, SETPOINT). 还有一些位置类型的读写属性,如 TOOL, BASE等。
与点变量一样,机器人类型也点属性的特征。出现在表达式中,与其他点混合在一起的点属性必须在类型和机器人类型中指向属性和变量,或者与向量的类型和数目相匹配。
Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 Common Shared PointXYZR As Joint Of XYZR Dim Shared PointXYZ As Joint Of XYZ PointXYZR = SCARA.SetPoint --> 错误 – 类型不匹配 (Setpoint returns a location) PointXYZ = SCARA.VelocityFeedback --> 错误 – 机器人类型不匹配 SCARA.Base = #{56.5, -104.7, -90.5} --> 错误 – 数目不匹配
点维度
您在声明时未定义向量数据类型的数目,但您可以定义与该点相关的机器人的类型。 这给出了一个维度。
点分配
点分配使用以下格式:
<variable_name> = (<expr1>,<expr2>,<expr3>,…,<exprn>)() = #{} for location() = {} for joint
表达式可以是同一机器人类型的常量或其他向量变量,但表达式右侧的大小必须等于左侧。 如果您尝试使用其他机器人类型的点来分配点,则会收到错误。
单个坐标点分配
分配点的单个坐标的格式:
<variable_name>{<expression>} = <expression>
点查询
点查询的格式是:
?<variable_name>
单坐标点查询
用于查询点的单个坐标的格式:
?<variable_name>{<expression>}
示例 1
Common shared P1 as location of XYZR '声明向量 (全局) P1 = #{1,2,3,4} '分配整个向量 P1 = #{1,2} '返回解析错误 ?P1 '读整个向量 ?P1{2} '读取向量的第二个坐标
示例 2
Common shared P2[5] as location XYZ '声明全局数组向量 P2[1] = #{1,2,3} '分配整个向量 P2[2] = #{5,2} '返回解析错误 ?P2[1] '读整个向量 ?P2[2]{2} '读取向量的第二个坐标
操作
像任何其他数据类型一样,点可以使用运算符。 系统只定义相等运算符(加,减,乘除)。点之间的操作只能在相同类型和机器人类型(或大小)的点之间执行。所有操作也可以在点和long或double类型表达式之间执行。
分配
点变量和读写属性可以通过类型和大小(或机器人类型)兼容的点变量,向量和点属性来分配。
查询
点变量,属性和向量返回一个值,因此它们都可以通过打印或赋值到兼容点变量或读写属性来查询。
Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 Common Shared PointVar1 As Joint Of XYZR Dim Shared PointVar2 As Joint Of XYZ Dim PointArr[4] As Joint Of XYZR PointVar1 = PointArr[2] PointVar2 = {23.4, 60, 42} PointArr[1] = SCARA.PositionCommand SCARA.Tool = #{10, 20,30, 0} PRINT PointVar2, SCARA.Tool, {100.3, 20} --> {23.4 , 60 , 42} #{10 , 20 , 30 , 0} {100.3 , 20}
加
点加运算符像任何其他数据类型一样使用。它将第一个点的每个元素与第二个点的每个元素相加。 结果是一个点。
?{1,2}+{2,4} --> {3,6}
减
点减运算符像任何其他数据类型一样使用。 它用第二个点的每个元素减去第一个点的每个元素。 结果是一个点。
?{1,2}-{2,4} --> {-1,-2}
乘
点乘法运算符像任何其他数据类型一样使用。 它将第一个点的每个元素与一个数字相乘。 您只能将点乘以单个数字(一维数字)。 结果是一个点。
?2*{2,4} --> {4,8}
除
点除运算符像任何其他数据类型一样使用。 它将第一个点的每个元素除以一个数字。 您只能用一个数字(一维数字)来划分一个点。 结果是一个点。
?{2,4}/2 --> {1,2} ?2/{2,4} --> {1,0,5}
复合 (:)
是一个特定于点的操作,它应该在相同大小的两个位置点(或机器人类型)之间操作。
? #{-56.5 , -104.7 , 89.5} : #{ 0.0, -104.7 , -0.5} --> #{-56.5 , -209.4 , 89}
限制
MOD (模数), ^ (幂), 逻辑和按位运算符不能用于点。
点不能用作流控制语句和事件定义中的条件。
点无法记录。
函数中的点
点变量可以通过引用和值传递给函数和子程序。整个点数组也可以被传递(通过引用)到一个函数或子程序。另一方面,点属性和向量只能通过值传递。点也可以作为函数的返回值。但是,参数或返回值的点类型和大小(或机器人类型)必须与函数声明相匹配。
值传递和引用
点可以像任何其他数据类型一样通过值和引用传递。 例如:
Program Dim p1 as joint of XYZR Call Sub1(P1) ?p1 End program Sub Sub1(X as joint of XYZR) X = {1,2,3,4} End Sub
该程序将{1,2,3,4}分配给P1并打印{1,2,3,4}作为输出。 当一个点通过引用或值传递时,您只能将相同机器人类型的点传递到X。否则,您会收到一个解析错误。
示例 1
Program Dim p1 as location of XYZR Call Sub1(P1 --> TRANSLATION ERROR !!! ?p1 End program Sub Sub1(X as location of XYZ) X = #{1,2,3,4} End Sub
示例 2
Program Dim p1 as joint of XYZR Call Sub1(P1) --> TRANSLATION ERROR !!! ?p1 End program Sub Sub1 (ByVal X as joint of XYZ) X = {1,2,3,4} End Sub
函数返回点
函数可以像任何其他数据类型一样返回点变量。例如:
Dim A as location of XYZR Program Move G1 MyFunc(1) vcruise=299 --> 如果G1是XYZR机器人类型,这将是正确的 End Program Function MyFunc(i1 as long) as location of XYZR MyFunc = #{1,2,3,4} End Function
运动命令
一些运动命令在组上应用时使用点的节点参数。例如: CIRCLE, MOVE and MOVES.
一些节点参数可以分配两种点类型(LOCATION and JOINT),如CIRCLECENTER, CIRCLEPOINT以及MOVE 和 MOVES的目标位置。其他节点参数只能接受位置点,如TOOL,BASE等。将所有节点参数与机器人类型或大小兼容的点分配给组。
Common Shared SCARA As Group Axnm = A1 Axnm = A2 Axnm = A3 Axnm = A4 Model = 4 Common Shared JointXYZ As Joint Of XYZ MOVE SCARA JointXYZ --> 错误 – 机器人类型不匹配 CIRCLE SCARA Angle = 180 CircleCenter = #{350, 500, -80} --> 错误 – 数目不匹配 MOVES SCARA #{-22, 503.8, -8.3, 149} Base = SCARA.Dest_Joint --> 错误 –类型不匹配
点作为表达式
点属性可以存储为一个点或者作为一个点进行比较。 例如:
Dim A as Joint of XYZR A = {1,2,3,4} A = G1.Pcmd A = G2.Pcmd --> 如果G2不是XYZR类型,则返回翻译错误。
函数
定义了以下函数:
<XYZR location> = TOCart (<group>, <XYZR JOINT>) <XYZR Joint> = ToJoint(<group>,<XYZR LOCATION>,<configuration-flag:integer>) <double> distl(<location>,<location>) Distance between points (length). <double> distr(<location>,<location>) Distance between points (angle).
在TOJOINT指令中,配置标志的数量和类型取决于每种机器人类型。注意,机器人属性ARMCMD,ECMD,WCMD都有三个值(0,1,2),其中0被保留用于AUTO选项。但是配置位只有两个值(0,1)。
对SCARA机器人: Arm ( Bit 0): value = 0 - Lefty(armcd = 1)value = 1- Righty(armcmd = 2)
对PUMA机器人: Arm ( Bit 0): value = 0 - Lefty(armcd = 1) value = 1 - Righty(armcmd = 2)
Elbow ( Bit 1):value = 0 - Below(ecmd = 1) value = 1 - Above(ecmd = 2)
Wrist ( Bit 2): value = 0 - Noflip (wcmd = 1) value = 1 - Flip (wcmd = 2)
对TRAVERSE-ARM机器人: Arm ( Bit 0): value = 0 - Lefty(armcd = 1)value = 1 - Righty(armcmd = 2)
对于没有配置标志的DELTA,SCISSORS,...和其他机器人,这些字段不被使用。
tojoint的配置标志参数定义为:
加载/保存
每个全局变量都可以存储在一个文件中。变量及其值与程序中定义的格式相同。 您可以选择要存储的数据类型。 如果选择了数据类型,则SAVE命令仅存储该数据类型的全局变量。如果具有相同名称的文件已存在,则其扩展名将重命名为* .bak,并创建新文件。加载文件将覆盖保存的全局变量的值。 您可以保存与某些类型的机器人相关的所有点。例如:
SAVE file = "Myfile.prg" type = location robottype = xyzr SAVE file = "Myfile.prg" type = all LOAD Myfile.prg