机器人开发工具中的可复用性软件模块
用于 Robotics Studio 的虚拟编程工具不像 LabView 环境那样成熟,但工具运行良好。当执行某些代码时,我注意到了 Robotics Studio 中的一个有趣的问题。一个教程演示了有关循环以及将文字转换为语音的方法。听到系统的计数很有意思。但是,如果我在程序执行时实现一个上下文开关,则让人不安的是程序有时会混淆编号顺序。换句话说,消息传递会表现为后进先出,这样,如果系统在接收一条消息时碰巧很忙,消息就可能丢失,而在乱序情况下,后面会死锁在前面的消息上。这种怪异现象可能是语音合成块的特性,但却是一种不希望出现的行为。如果与我使用的代码相比,乱序执行不太明显,则这种类型的行为可能影响调错阶段。
还有一个有关 Robotics Studio 开发环境接口完备性的例子,它出现在我在一个派生对话框中间向另一个程序作上下文切换时。当对话框在副窗口中时,有时候我无法回到对话框中,而副窗口也会锁死,等候着派生窗口的结束。在 Windows XP 中对话框并不出现在任务栏上,不过我终于明白可以用 Alt 和 Tab 键手工选择它。
本项目只是一系列项目中的第一步,我希望能挨个完成,逐渐增加复杂性,要实现的终极目标是用一个立体检测系统在噪声环境中辨别出一个任意声音。除了项目的目标与价值以外,开发平台的使用也提供了一个机会,能够验证开发人员现在可以使用的资源,辅助复杂机器人控制系统的开发工作。一种常被表述的目标是:开发人员应能够设计出一种公共的硬件规范,然后能够在跨多种机器人平台上通过运行时绑定使用这一规范,而无需重新设计。
我很高兴有现在这些可用产品,也期望今后几年所有这些开发平台会有一系列后续动作,它们对于新机器人项目的启动,以及使开发人员能够重用以前项目的软硬部件都做了很好的工作。我尤其高兴的是,有些开发环境正将这些系统看作一组可以互相交互的分布式系统。对于那些建立包含多机器人协同工作系统的设计者来说,这一特性将成为一个重要能力。
参考文献
1. Cravotta, Robert, “Robots on the march,” EDN, Dec 3, 2007, pg 44, www.edn.com/article/CA6505566.
自从本文第一部分印出以来,我知道了另外两个机器人开发平台:CoreWare 的 CoroBot 和 Gostai 的 URBI(通用实时行为接口),CoroBot 是一种四轮滑移转向平台,带一只彩色摄像头、IR 距离传感器和 1.2 GHz PC 级处理器,运行 Windows XP、Xubuntu Linux,也可以两者同时运行(图 A)。设计者可以在产品的塑料顶板上钻孔,作永久性固定,还可以接受多种粘接物(如 Velcro 魔术贴)作临时固定。系统为开放式,简化了对其多个部件的访问,但将其使用限制于室内环境。它的重量为 12 lbs,可以接收最多 5 lbs 的负荷。
CoroBot平台有九种型号,起价为2799美元,向开发人员供应。对于预装Windows XP的型号,软件开发可以采用微软的Robotics Studio,而对预装Xubuntu Linux的型号则使用Player。平台现可选双靴型和可选四 DOF(自由度)臂并带一个抓头传感器。带臂型号有24 个可用伺服端口,无臂型号有30个可用伺服端口。现在没有能够支持平台的C 或C++库,但该公司称它正在评审PlusPack for Microsoft Robotics Studio,以支持未来的开发。
Gostai正在将自己的产品URBI脚本接口语言定位成一种用于软件模块的通用机器人平台。它在客户/服务器结构上工作,可远程控制一台机器人或任何复杂系统。URBI给出了一种通用方法,能够控制一台机器人、通过插入软件部件而增加功能,并且以一种轻便的方式开发出完全交互的复杂机器人应用。该平台能用于多种机器人系统、操作系统和编程语言,如C++、Java和 Matlab。
Gostai 将面向对象的 URBI 基于一种原型方案,允许开发人员定义纯 URBI 的对象,或者用向核心中插入 C++ 类或“UObjects”,为语言增加类,成为原生的 URBI 类。你甚至可以从核心中拔出 UObjects,将其运行为远程自主应用,从 URBI 引擎获得 IP(互联网协议)地址作为一个参数。
URBI 语言中有一个重要考虑因素,那就是在语义的核心中集成了并行与事件。URBI 语言支持四种类型的命令间临时约束条件。一是 Task B 必须在 Task A 后面执行。第二个是 Task B 必须在 Task A 结束时开始,而第一个约束条件允许两个任务之间有一个时间间隙。第三个约束是 Task A 和 B 必须同时开始,即,如果一个任务还未准备好,则另一个要等待前一个准备好后才开始执行。第四个约束是 Task B 的开始必须同时或晚于 Task A,但其开始不得晚于 Task A 完成前。
由于 URBI 是一种并行语言,它可以用互斥(互斥-排除)技术处理并行访问,保证一个时间只有一种代码能使用某种资源。URBI 支持七个混合模式,它们设定了系统应如何处理冲突性与同步任务问题。一个混合模式的例子是加法与混合模式,它将冲突任务的计算加到或平均到结果值上。队列模式实现了一种经典的互斥机制。
为提供更好的并行支持,时间概念成为 URBI 语义中的一部分。例如,URBI 中的一个简单任务可以使一个变量在一个给定时间里或以某个给定速度达到一个值,否则就设为一个正弦振荡。这些非瞬时的任务可以与其它设定同时执行。举例来说,考虑任务 neck.val=10 time:450msleg.val= -45 speed:7.5 tail.val=14 sin:4s ampli:45;。这个任务使用 "time," "speed," "sin," 和 "ampli" 修改任务完成的方式。在本例中,"neck.val" 的值将在 450 ms内达到10。其它支持的修饰语有 "phase," "getphase," 和 "smooth."。
URBI 自身能够加快并行事件的处理速度,因为多个事件可以并行发生,并触发一些可以并行运行和重叠的代码。实际中,对 URBI 中一个事件作出反应的最简单方式是使用 “at” 命令,它看似 “if” 语句,即当检验为真时执行一条命令。不过,与 “if” 不同的是,”at” 命令会保持在后台作再次触发,而并不终止。另一种这类工具是 “whenever” 语句,它循环执行命令,直到检验为真。该语句类似于 “while” 语句,不同的是当检验为假时它保持在后台。语言还可以忽略有参数或没有参数的事件。
评论