基于Lua的工业机器人解释器实现的研究
【摘 要】针对机器人编程语言和控制程序模块化的发展需求,提出一种基于Lua脚本语言的机器人语言解释器的实现方法。用Lua作为整个系统的构建者,对机器人语言进行词法、语法分析,调用控制代码完成对机器人的控制,具有扩充性和维护性强,系统开发效率高,解释效率高的特点。该解释器结合vs2008运行,利用robotic toolbox for matlab仿真验证,证明该解释器可以很好地解释工业机器人语言,为解释器的构建提供了一种新的模式。
关键词 Lua;机器人语言;解释器;模块化
lua字符串转数组0 引言
工业机器人的快速发展,逐渐使人类从繁重、单调或是危险的工作中解放出来。为了缩短机器人的开发周期,需要一种简单易懂的语言对机器人进行编程,这就是机器人语言产生的初衷[1],它更符合人的语言习惯和思维方式,即使不懂编程语言的工作人员也能够很快的理解和运用。这就需要把这种类人思维的指令语言解析成为C/C++能够理解和运用的语言。机器人语言解释器的主要功能就是将文本形式的简单的机器人语言,也就是指令代码转换为程序需要的数
据结构或格式,以控制机器人的运行,所以解释器在机器人软件系统中起到非常重要的作用,其解释效率将直接影响工业机器人的工作效率。
Lua的设计目的就是为了嵌入到应用程序中,从而为应用程序提供灵活的扩展和定制功能。轻量级Lua语言的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快,在目前所有脚本引擎中,Lua的速度是最快的[2]。这一切都决定了Lua是作为嵌入式脚本的最佳选择。因此选用Lua脚本语言构建解释器。
与文[3][4]中的解释器不同的是Lua不仅仅是把参数传递给主程序。基于Lua的解释器用Lua整合现有资源,构造整个系统的框架,调用控制模块来实现具体功能,降低模块之间耦合程度,其优势在于扩展性、复用性较强,并且方便实现更复杂的结构和逻辑,为将来更高级的机器人语言解析提供了可能。脚本语言无需编译,在解释器的开发阶段可以实现快速、实时的修改调试,缩短开发周期。
1 工业机器人控制系统及编程语言设计
1.1 工业机器人控制系统
操作者在界面利用规定的机器人语言指令编写程序,用解释器对机器人语言进行解析,调用相应的控制模块,控制模块包括路径规划模块、速度规划模块、运动学模块和动力学模块,
Lua的设计目的就是为了嵌入到应用程序中,从而为应用程序提供灵活的扩展和定制功能。轻量级Lua语言的官方版本只包括一个精简的核心和最基本的库。这使得Lua体积小、启动速度快,在目前所有脚本引擎中,Lua的速度是最快的[2]。这一切都决定了Lua是作为嵌入式脚本的最佳选择。因此选用Lua脚本语言构建解释器。
与文[3][4]中的解释器不同的是Lua不仅仅是把参数传递给主程序。基于Lua的解释器用Lua整合现有资源,构造整个系统的框架,调用控制模块来实现具体功能,降低模块之间耦合程度,其优势在于扩展性、复用性较强,并且方便实现更复杂的结构和逻辑,为将来更高级的机器人语言解析提供了可能。脚本语言无需编译,在解释器的开发阶段可以实现快速、实时的修改调试,缩短开发周期。
1 工业机器人控制系统及编程语言设计
1.1 工业机器人控制系统
操作者在界面利用规定的机器人语言指令编写程序,用解释器对机器人语言进行解析,调用相应的控制模块,控制模块包括路径规划模块、速度规划模块、运动学模块和动力学模块,
完成轨迹规划、插补、逆运动学等运算,最后Lua把伺服电机需要的关节角度、关节角速度和加速度参数传递给运动控制器,实现对机器人的控制。
1.2 工业机器人编程语言设计
机器人编程语言需要运动指令和流程控制指令,解释器的任务是要对指令进行解析,控制机器人完成指令动作。
2 基于Lua的解释器设计
2.1 Lua简介
Lua是一种嵌入式语言,Lua具有与C/C++良好的交互能力,十分简洁的API,可以说是目前脚本语言中做的最好的[1]。我们可以把Lua作为C/C++的一个库,同样也可以把C/C++作为Lua的一个库。Lua与C/C++可以通过一个虚拟栈来进行数据交互,十分简洁,这一点对实现工程的模块化非常重要。解释器将C++作为 Lua的一个库来使用;
Lua提供了丰富的字符串处理函数;
灵活的table和function,table是Lua中一种特别的结构,类似数组,但它其中的元素可以是任意类型的,甚至可以是一个函数。Function具有参数变长机制,这些为解析工作提供了极大的方便;
1.2 工业机器人编程语言设计
机器人编程语言需要运动指令和流程控制指令,解释器的任务是要对指令进行解析,控制机器人完成指令动作。
2 基于Lua的解释器设计
2.1 Lua简介
Lua是一种嵌入式语言,Lua具有与C/C++良好的交互能力,十分简洁的API,可以说是目前脚本语言中做的最好的[1]。我们可以把Lua作为C/C++的一个库,同样也可以把C/C++作为Lua的一个库。Lua与C/C++可以通过一个虚拟栈来进行数据交互,十分简洁,这一点对实现工程的模块化非常重要。解释器将C++作为 Lua的一个库来使用;
Lua提供了丰富的字符串处理函数;
灵活的table和function,table是Lua中一种特别的结构,类似数组,但它其中的元素可以是任意类型的,甚至可以是一个函数。Function具有参数变长机制,这些为解析工作提供了极大的方便;
Lua具有可移植性,Lua可以运行在任何平台上,包括:PlayStation、Xbox等等。
由于Lua具有的这些特点,它可以作为一种高效便捷的解析工具。
2.2 基于Lua解释器的体系结构
首先编辑机器人程序,编辑完成后,调用Lua读取文本中的机器人程序,解析每一句代码,检测词法语法错误,有错误时抛出错误类型,无错误时分解成指令和参数,根据不同的指令调用不同的控制模块:把示教点位置姿态信息传递给路径规划模块,得到路径参数,把速度参数和路径参数传递给速度规划模块,把速度规划参数和路径参数传递给插补模块,得到笛卡尔空间末端执行器插补状态参数,最后调用逆运动学求解模块,推出六个关节运行时间对应的位置、速度、加速度信息,传递给伺服驱动控制器完成动作。在这里Lua不仅是传统解释器的作用,而是整个系统的调度者,有利于机器人控制系统的模块化,这样一来,假如速度规划模块需要优化,我们可以直接把这个模块替换成优化后的模块。
例如解释器对下面一段机器人语言进行解析:
MOVC P002 P003 P004 V010 Z0
MOVL P005 V010 Z0
MOVC P005 P006 P007 V010 Z0
由于Lua具有的这些特点,它可以作为一种高效便捷的解析工具。
2.2 基于Lua解释器的体系结构
首先编辑机器人程序,编辑完成后,调用Lua读取文本中的机器人程序,解析每一句代码,检测词法语法错误,有错误时抛出错误类型,无错误时分解成指令和参数,根据不同的指令调用不同的控制模块:把示教点位置姿态信息传递给路径规划模块,得到路径参数,把速度参数和路径参数传递给速度规划模块,把速度规划参数和路径参数传递给插补模块,得到笛卡尔空间末端执行器插补状态参数,最后调用逆运动学求解模块,推出六个关节运行时间对应的位置、速度、加速度信息,传递给伺服驱动控制器完成动作。在这里Lua不仅是传统解释器的作用,而是整个系统的调度者,有利于机器人控制系统的模块化,这样一来,假如速度规划模块需要优化,我们可以直接把这个模块替换成优化后的模块。
例如解释器对下面一段机器人语言进行解析:
MOVC P002 P003 P004 V010 Z0
MOVL P005 V010 Z0
MOVC P005 P006 P007 V010 Z0
MOVC P007 P006 P005 V010 Z0
需要注意的是圆弧运动(MOVC)至少要给出三个点,解释器把这三个点传递给控制模块,控制模块按照圆弧规划的方式进行插补;直线运动(MOVJ)需给出目标点,控制模块根据传感器得出的机器人此刻所处位置信息,根据两点间直线进行插补;采用样条插补(MOCS)时需要说明是使用三次样条、五次样条或B样条方式进行插补。
解释器读取机器人语言存入字符串a。Lua分析程序,把每一句指令存入table b[i]。通过string.find()函数查换行符的位置,然后用string.sub()函数提取中间字符串,从而分割出每一句代码。把每一句代码存入b[i],b为一个table类型。再把b[i]分解成单个关键字存入c[j],c[1]存放指令字符串,c[2],c[3]等存放参数。
在此定义了一个存放指令的table cmd[]
cmd={
MOVJ={“P”, “V”,“Z”,cfunc=cmovj},
MOVL={“P”, “V”,“Z”,cfunc=cmovl},
……
}
需要注意的是圆弧运动(MOVC)至少要给出三个点,解释器把这三个点传递给控制模块,控制模块按照圆弧规划的方式进行插补;直线运动(MOVJ)需给出目标点,控制模块根据传感器得出的机器人此刻所处位置信息,根据两点间直线进行插补;采用样条插补(MOCS)时需要说明是使用三次样条、五次样条或B样条方式进行插补。
解释器读取机器人语言存入字符串a。Lua分析程序,把每一句指令存入table b[i]。通过string.find()函数查换行符的位置,然后用string.sub()函数提取中间字符串,从而分割出每一句代码。把每一句代码存入b[i],b为一个table类型。再把b[i]分解成单个关键字存入c[j],c[1]存放指令字符串,c[2],c[3]等存放参数。
在此定义了一个存放指令的table cmd[]
cmd={
MOVJ={“P”, “V”,“Z”,cfunc=cmovj},
MOVL={“P”, “V”,“Z”,cfunc=cmovl},
……
}
这里table的使用体现了Lua的灵活之处,用指令直接作为table的索引,使用cmd[c[1]]可以直接索引到相应指令对应的参数和控制函数,进而进行参数检测和函数调用。这个技巧使得逻辑简单清晰,类似数组的索引方式提高了解析效率,并且在进行增加或更改指令等后期维护时,只需在cmd[]中添加或更改就可以了,具有很好的可维护性。
用cmd[c[1]][j]匹配参数,检测参数格式是否正确,格式错误时,输出错误类型。
在C++代码中使用注册函数Lua_register(L,“lname”,cname),便可以在Lua中直接使用cmd[c[1]].cfunc(c[2],c[3],c[4])用来调用不同的控制模块并传递参数,控制模块中通过Lua_tostring(),Lua_tonumber()等来得到传递的参数。
2.3 基于Lua的解释器界面实现
常用的界面实现形式是Qt,基于Lua的解释器研究采用一种新颖的实现形式——Qtlua,Qtlua库旨在用Lua脚本语言使Qt应用程序可脚本化,为QtScript模式提供一种新的选择,因此它具有脚本的特点[2]。很多脚本语言都可以实现对Qt的封装,之所以选择Lua是因为Lua的小巧,可以将解释器模块式的嵌入到其他机器人平台中,并且可以方便的进行在线维护和升级。
Qtlua中的部分函数介绍:
用cmd[c[1]][j]匹配参数,检测参数格式是否正确,格式错误时,输出错误类型。
在C++代码中使用注册函数Lua_register(L,“lname”,cname),便可以在Lua中直接使用cmd[c[1]].cfunc(c[2],c[3],c[4])用来调用不同的控制模块并传递参数,控制模块中通过Lua_tostring(),Lua_tonumber()等来得到传递的参数。
2.3 基于Lua的解释器界面实现
常用的界面实现形式是Qt,基于Lua的解释器研究采用一种新颖的实现形式——Qtlua,Qtlua库旨在用Lua脚本语言使Qt应用程序可脚本化,为QtScript模式提供一种新的选择,因此它具有脚本的特点[2]。很多脚本语言都可以实现对Qt的封装,之所以选择Lua是因为Lua的小巧,可以将解释器模块式的嵌入到其他机器人平台中,并且可以方便的进行在线维护和升级。
Qtlua中的部分函数介绍:
信号与槽
——connect signal and slot of given Qt objects
qt.connect(qobject1, “qt_signal_signature()”, qobject2, “qt_slot_sign
ature()”)
——connect slot to given lua function
qt.connect(qobject, “qt_signal_signature()”, lua_function)
……
文件操作函数
filename=_open_filename( [ “caption”, “directory”, |“filter”, QFileDialog::Option ] )
filename=_save_filename( [ “caption”, “directory”, “filter”, QFileDialog::Option ] )
……
标准消息框(关于,警告,错误等等)
qt.dialog.msg_about( “text” [ , “title” ] )
——connect signal and slot of given Qt objects
qt.connect(qobject1, “qt_signal_signature()”, qobject2, “qt_slot_sign
ature()”)
——connect slot to given lua function
qt.connect(qobject, “qt_signal_signature()”, lua_function)
……
文件操作函数
filename=_open_filename( [ “caption”, “directory”, |“filter”, QFileDialog::Option ] )
filename=_save_filename( [ “caption”, “directory”, “filter”, QFileDialog::Option ] )
……
标准消息框(关于,警告,错误等等)
qt.dialog.msg_about( “text” [ , “title” ] )
button = qt.dialog.msg_critical( “text” [ , “title”, QMessageBox::StandardButtons,
QMessageBox::StandardButton ] )
button= qt.dialog.msg_information( “text” [ , “title”, QMessageBox::StandardButtons,
QMessageBox::StandardButton ] )
……
Qtlua利用Qt designer可视化的构建界面,用Lua实现具体的功能。这种嵌入式的界面模块可以方便的扩展原有应用程序的功能。编译器可以实现打开、新建、保存程序文件;单步、全速、终止运行等操作。
3 实验及结果
用自己开发的解释器软件RLI(Robot Language Interpreter)结合vs2008来解析文本,调用控制模块生成数据,利用robotic toolbox for matlab进行仿真验证。在编辑时加入一些不必要的空格和换行、替换控制模块,以测试解释解析的正确性。大量的测试表明,解释器能够正确的解析机器人语言,调用相应函数,执行循环结构,控制机器人执行相应动作等。当机器人程序编写有错误时,可以对其中的错误进行提示。图1中的程序描述了工作流程:机器人从位置点P001移动到位置点P002,然后按照弧线-直线-弧线对工件喷涂,等待工件底座旋转,
QMessageBox::StandardButton ] )
button= qt.dialog.msg_information( “text” [ , “title”, QMessageBox::StandardButtons,
QMessageBox::StandardButton ] )
……
Qtlua利用Qt designer可视化的构建界面,用Lua实现具体的功能。这种嵌入式的界面模块可以方便的扩展原有应用程序的功能。编译器可以实现打开、新建、保存程序文件;单步、全速、终止运行等操作。
3 实验及结果
用自己开发的解释器软件RLI(Robot Language Interpreter)结合vs2008来解析文本,调用控制模块生成数据,利用robotic toolbox for matlab进行仿真验证。在编辑时加入一些不必要的空格和换行、替换控制模块,以测试解释解析的正确性。大量的测试表明,解释器能够正确的解析机器人语言,调用相应函数,执行循环结构,控制机器人执行相应动作等。当机器人程序编写有错误时,可以对其中的错误进行提示。图1中的程序描述了工作流程:机器人从位置点P001移动到位置点P002,然后按照弧线-直线-弧线对工件喷涂,等待工件底座旋转,
再次喷涂,反复几次后停止于位置点P007,移动到位置点P008待命。运行仿真结果如图2所示。
4 结论
通过Lua脚本语言,可以准确、快速的解析机器人语言,可以使机器人语言的编写简单化,使非专业人员也可以对机器人进行编程。Lua脚本语言在机器人中的运用可以实现机器人控制程序的模块化,降低模块间的耦合度,方便实现模块的替换、升级和扩充;可以的大大缩短机器人解释器开发时调试的时间;解释器可以便捷的添加或删除指令,简化了后期的升级维护,实现了解释器的开放性;Lua具有良好的可移植性,根据不同平台修改cmd中的内容后就可以在其他机器人控制平台运行,具有广泛的应用范围。
参考文献
[1]John J.Craig. 机器人学导论[M].3版.贠超,等,译.北京:机械工业出版社,2006.
[2]Roberto Ierusalimschy. Programming in Lua[M]. , 2013.
[3]曾国.利用LEX与YACC实现数控线切割的加工程序编译器[J].机电工程,2004(1):58-6
4 结论
通过Lua脚本语言,可以准确、快速的解析机器人语言,可以使机器人语言的编写简单化,使非专业人员也可以对机器人进行编程。Lua脚本语言在机器人中的运用可以实现机器人控制程序的模块化,降低模块间的耦合度,方便实现模块的替换、升级和扩充;可以的大大缩短机器人解释器开发时调试的时间;解释器可以便捷的添加或删除指令,简化了后期的升级维护,实现了解释器的开放性;Lua具有良好的可移植性,根据不同平台修改cmd中的内容后就可以在其他机器人控制平台运行,具有广泛的应用范围。
参考文献
[1]John J.Craig. 机器人学导论[M].3版.贠超,等,译.北京:机械工业出版社,2006.
[2]Roberto Ierusalimschy. Programming in Lua[M]. , 2013.
[3]曾国.利用LEX与YACC实现数控线切割的加工程序编译器[J].机电工程,2004(1):58-6
1.
[4]王浩,谢存禧.工业机器人解释器的研究[J].机械设计与制造,2010(3):146-149.
[4]王浩,谢存禧.工业机器人解释器的研究[J].机械设计与制造,2010(3):146-149.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论