优傲机器人 
 
 
 
 
 
 
 
 
 
 
 
 
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