优傲机器人
URScript 编程语言
3.1 版
2015 年 3 月 26 日
1
URScript
目录 目录
本文件包含的信息是优傲机器人公司的财产,未经优傲机器人公司事先书面批准,不得全部
或部分复制。这些信息如有更改,恕不另行通知,并且不应被视为是优傲机器人公司的一个
承诺。优傲机器人公司定期对本手册进行评审和修订。
优傲机器人公司不对本文件中的任何错误或遗漏承担任何责任。
版权所有©2009-2015 优傲机器人公司
优傲机器人徽标是优傲机器人公司的注册商标。
目录
目录
1 URScript 编程语言…………………………………………………………………………….3
1.1 简介…………………………………………………………………………………………3
1.2 连接到 URControl 上……………………………………………………………………..3
1.3 数字、变量和类型…………………………………………………………………………3
1.4 控制流......................................................................................................................4
1.4.1 特别关键词......................................................................................................5
1.5 函数…………………………………………………………………………………………5
1.6 远程过程调用(RPC)……………………………………………………………………5
1.7 范围规则...................................................................................................................6
1.8 线程…………………………………………………………………………………………7
1.8.1 线程和范围……………………………………………………………………………8
1.8.2 线程调度………………………………………………………………………………9
1.9 程序标号消息………………………………………………………………………………9
2 运动模块........................................................................................................................10
2.1 函数………………………………………………………………………………………...10
2.2 变量………………………………………………………………………………………...16
3 内部模块……………………………………………………………………………………….17
3.1 函数………………………………………………………………………………………...17
3.2 变量………………………………………………………………………………………...22
4 UR 数学模块……………………………………………………………………………………23
4.1 函数………………………………………………………………………………………...23
4.2 变量………………………………………………………………………………………...30
5 界面模块……………………………………………………………………………………….31
5.1 函数………………………………………………………………………………………...31
5.2 变量………………………………………………………………………………………...44
2
URScript
URScript 编程语言
1 URScript 编程语言
1.1 简介
优傲机器人可分三个不同的级别来控制:图形用户界面级别、脚本级别和 C-API 级别。
URScript 是用于在脚本级别控制机器人的机器人编程语言。像任何其他编程语言一样,
URScript 也有变量、类型、控制流语句、函数等。此外,URScript 有许多内置变量和函数,
可监视并控制机器人的输入/输出和运动。
1.2 连接到 URControl 上
URControl 是控制柜中的低级别机器人控制器,在 Mini-ITX 计算机上运行。计算机启动时,
URControl 作为一个后台程序启动(像一个服务程序一样),并且 PolyScope 用户界面使用
本地 TCP/IP 连接作为一个客户端连接。
在脚本级别对机器人进行编程是如下所述完成的:编写一个客户端应用程序(在另一台计算
机上运行),并使用 TCP/IP 插口连接到 URControl 上。
主机名:ur-xx(或者如果机器人不在域名服务器中,则在 PolyScope 为“关于”对话
框中找到的 ip 地址)。
端口:30002
连接好时,URScript 程序或命令以清晰文本形式在每一个 socket 端口发送。每行均以“\n”
结束。
1.3 数字、变量和类型
URScript 中的算术表达式语法是非常标准的:
1+2-3
4*5/6
(1+2)*3/(4-5)
布尔表达式中拼写出了布尔运算符:
True or False and (1 == 2)
1 > 2 or 3 != 4 xor 5 < -6
not 42 >= 87 and 87 <= 42
变量赋值是使用等号“=”进行的:
foo = 42
bar = False or True and not False
baz = 87-13/3.1415
hello = \q{Hello, World!}
3
URScript
控制流 URScript 编程语言
l = [1,2,4]
target = p[0.4,0.4,0.0,0.0,3.14159,0.0]
变量的基本类型是从变量的第一个赋值推导出来的。在上述示例中,foo是一个整数,bar
是一个布尔值,target是一个姿态,是位置和方位的一个组合。
基本类型是:
无
布尔值
数字 – 整数或浮点数
姿态
字符串
如果是轴-角标记法,姿态以p[x,y,z,ax,ay,az]的形式给出,其中x,y,z是TCP的位置,ax,ay,az
是TCP的方位。
1.4 控制流
程序的控制流通过 if 语句更改:
if a > 3:
a = a + 1
elif b < 7:
b = b * a
else:
a = a + b
end
and while-loops:
l = [1,2,3,4,5]
i = 0
while i < 5:
l[i] = l[i]*2
end
如需提前停止某个循环,可使用 break 语句。同样,可使用 continue 语句将控制转到最近
封闭循环的下一个迭代。
4
URScript
1.4.1 特别关键词
中止(halt)中止程序
返回(return)从函数中返回
1.5 函数
函数声明如下:
def add(a, b):
return a+b
end
然后可像这样调用函数:
result = add(1, 4)
也可给出函数自变量默认值:
def add(a=0,b=0):
return a+b
end
URScript 也支持命名参数。此处将不对此进行描述,因为执行起来仍然有一定程度的破坏。
1.6 远程过程调用(RPC)
远程过程调用(RPC)类似于正常函数调用,除了这个函数被定义并远程执行。在远程端,
被调用的 RPC 函数必须存在,并有同样的参数代码和类型。如果这个函数没有远程定义,
它将停止执行程序。控制器用 XMLRPC 标准发一个参数到远程端并收到结果。,在 RPC 调
用时控制柜等待远程函数完成。XMLRPC 标准支持 C++、Python 和 Java。
在 UR 脚本函数中,用程序初始化相机,拍一张照片并且读取新的 pose 坐标点,看起来像
这样:
第一个 rpc.factory 创造一个 XMLRPC 连接到特定的远程服务器,远程函数处理相机变量。
用户需要初始化相机并且调用 camera.initialize(“RGB”)。这个函数返回一个布尔量表明请求
是否成功。为了发现某个目标位置点,相机首先需要拍一张照片,拍好后需要在远程端做图
像分析算出目标点位置;然后程序请求目标点位置用函数 target-camera.getTarget。目标变量
结果将要被返回。camera.initialize(“RGB”),takeSnapshot(),getTarget()函数用于 RPC 服务器,
在技术支持网站包含更多的 XMLRPC 服务器例子。
5
URScript
范围规则 URScript 编程语言
1.7 范围规则
URScript 程序是作为一个函数声明的,没有参数:
def myProg():
end
程序内声明的每个变量都存在于全局范围内,函数内声明的变量除外。在那种情况下,变量
对于函数而言是局部的。有两个限定词可用于修改这种行为。local 限定词告知将函数内的
变量视为真正的局部变量的运行时间,即使有名称相同的全局变量。global 限定词强行将函
数内声明的变量变为可全局访问的。
在以下示例中,a 是一个全局变量,因此函数内的变量是程序内声明的相同变量:
def myProg():
a = 0
def myFun():
a = 1
return a
end
r = myFun()
end
在下面这个示例中,a 在函数内声明为 local,因此两个变量是不同的,即使它们有相同的
名称:
def myProg():
6
URScript
线程 URScript 编程语言
a = 0
def myFun():
local a = 1
return a
end
r = myFun()
end
请注意,全局变量再也不可从函数内访问,因为局部变量屏蔽了名称相同的全局变量。
1.8 线程
线程由许多个特殊命令来支持。
如需声明一个新的线程,使用类似于函数声明的语法:
thread myThread():
# Do some stuff
return
end
应当注意几件事情。首先,线程不可以有任何参数,因此声明内的括号必须为空。其次,虽
然线程中可以有返回语句,但是返回值被丢弃,并且无法从线程外访问。一个线程可包含其
他线程,与一个函数可包含其他函数一样。换句话说,线程可以嵌套,从而形成线程结构。
如需运行线程,使用以下语法:
thread myThread():
# Do some stuff
return
end
thrd = run myThread()
run 命令的返回值是正在运行的线程的句柄。可使用此句柄与正在运行的线程互动。run 命
令会派生新线程,然后消失,从而执行 run 指令后的指令。
如需等待正在运行的线程完成,使用 join 命令:
7
URScript
线程 URScript 编程语言
thread myThread():
# Do some stuff
return
end
thrd = run myThread()
join thrd
这会停止调用线程执行,直至线程执行完成。如果线程已经完成,则语句无效。如需终止正
在运行的线程,使用 kill 命令:
thread myThread():
# Do some stuff
return
end
thrd = run myThread()
kill thrd
要求终止后,线程停止,并且线程句柄不再有效。如果线程有子线程,这些子线程也会被终
止。
为了防止竞态条件和其他线程相关问题,提供了临界区支持。临界区可确保其包围的代码可
在另一个线程运行之前完成。因此,临界区应尽可能地短,这一点至关重要。语法如下所述:
thread myThread():
enter_critical
# Do some stuff
exit_critical
return
end
1.8.1 线程和范围
线程的范围规则与函数的范围规则完全相同。有关这些规则的讲述,请参阅第 1.7 条。
8
URScript