一、Aria综述Aria是一个编程库,C++程序员要访问MobileRobots或ActivMedia的平台并且访问或高或低的水平。除了给开发者提供一个完整的机器人和API配件外,Aria也可作为基础为其它库提供附加功能。Aria的程序可以用C++或Java编写,就像这些程序自身用这种语言编写一样。如果你分配任何与ARIA不谐调的工作,你必须为这个工作分配全部的源代码,包括在相同许可条件下你可能做出修改的ARIA。ARIA中个文件的功能:README.txt包括安装ARIA、重建ARIA、建立例子程序及运用开发工具平台的建议。LICENSE.txt重建ARIA或运用ARIA编程的GPL协议。Change.txt每个版本的ARIA的特色变化的总结。INSTALL.txt在不同的平台中安装ARIA的详细说明。docs.txt库的参考文档(本手册)。examples/ARIA中的例子程序。Include/ARIA的头文件。Src/ARIAC++源代码文件。Params/机器人定义文件(例如p3dx.p)Lib/Win32DELL输出文件和Linux共享文件。其它有记录的ARIA文件Aria.sln建立ARIA库和例子的MSVisualC++工作区。Aria.vcprojARIA库中用于Aria.sln的MSVC++工程文件。MakefileLinuxmakefile用于建立ARIA和例子。Makefile.depLinux文件依据的法则。Utils公用程序,用于内部的MobileRobots软件开发,再加上一些文件格式转换工具。ArNetworking/网络基础设施库,包括ARIA,而且是一个单独的库。tests/测试文件,在ARIA的开发中十分有用,也很神秘。advanced/先进的演示和例子。pythonExamples/通过python运用ARIA的信息和例子。javaExamples/通过java运用ARIA的信息和例子。python/包括ARIA的python模块和其他文件。java/包括ARIA的java包和其他文件。ARIA遵守以下编程协定:1.类名以“Ar”开头,并有混合的大小写。2.枚举和常量以大写字母开始。3.尽可能避免预处理器定义(而不是使用枚举或内联方法)。4.类中的成员变量以“my”作为前缀。5.类中的静止变量以“our”作为前缀。6.成员函数名以小写字母开始。7.变量名或方法名的第一个字母大写。8.所有的类可用于一个多线程程序中,无论是内在的线程,还是锁定互斥保护提供了一个API。1.ARIA-RobotClient-ServerRelationship移动平台的根本的客户-服务器控制架构,传感器以及配件并没有太大变化。核心移动机器人程序在Pioneer和AmigoBot(在机器人的微控制器上运行)操作系统固件上实施。这些程序管理更加严格并且对时间敏感、低水平任务的机器人进行控制和操作,包括维护要求的动作、朝向状态、估计测程位置和获取传感器的信息(声纳、指南针)并且驱动许多配件(如PTZ摄像机、TCM2罗盘/测斜仪组件,及先锋5自由度手臂)。机器人,他的微处理器,固件和集成设备(例如声纳)有时也被称为“机器人平台”。然而,机器人固件不执行任何高水平的机器人任务。相反它是一个智能用户连接到PC上运行这些应用程序级机器人控制策略和任务,如:障碍物检测和蔽障,传感器融合,定位,特征识别,映射,智能导航,PTZ摄像机控制,手臂动作等等。ARIA的角色是支持这些用户应用和它们与机器人固件的交流,以任何设备连接到计算机而不是机器人平台,通过网络控制远程软件。ARIA的核心类是ArRobot类。这个类用固件管理通信周期,接收和提供关于机器人平台的运行状态数据,该周期内触发任务并且决定并送回机器人的命令。他也可以作为一个引用到其它ARIA的对象和移动机器人相关的一般功能的工具箱的容器。通过自己的动作基础设施,ARIA提供了一个强大的机制相结合的独立的行为,以实现协调的运动控制和智能指导。以实际行动,你很容易实施指导遥操作机器人,视觉跟踪,自主导航等应用,如运动方面。其他ARIA类提供的接口来访问和控制配件的传感器和设备,包括声纳和激光测距仪,云台单位,手臂,惯性导航装置,及其他设备。2.机器人交流ARIA的重要功能之一,你的应用程序必须做的事情之一就是在ArRobot对象的实例和机器人平台操作系统(固件)之间建立联系。除了移动机器人自身,一些配件(比如声纳,先锋夹持器,PTZ摄像机,先锋手臂,指南针及其他)内在的与机器人微控制器的AUX或数字I/O排列相联系,并且使用机器人连接(因此这些对象的接口类需要一个相关的ArRobot对象,其必须为连接的设备工作)。其他的配件,如SICK激光,录像捕捉卡,等等都直接连接到车载电脑。有几种方法来连接计算机上正在运行的ARIA到机器人的微控制器或到仿真器。与机器人或仿真的连接ArRobotConnector对象用于建立和执行与机器人的连接,以机器人的参数文件为基础,并通过命令行参数运行时间配置。类似的,ArLaserConnector用于连接到激光测距装置。ArRobotConnector和ArLaserConnector在大多数例子程序中被使用。ArRobotConnector将首先试着连接到本地TCP端口上的模拟器,如果没有模拟器运行,将连接到本地串口上的机器人。ArRobotConnector还分析了一些命令行参数,可以明确指定远程主机名和通过TCP连接的端口,或指定一个备用的本地串口使用机器人连接。3.关于机器人和设备连接的具体细节任何机器人都有许多可能的硬件配件连接,及连接配件到机器人和计算机的一些选择。设备接口及连接的类需要关于连接什么设备和如何连接设备的信息。这些信息有两个来源:机器人的参数文件,和通过ArArgumentParser及ARIAARGS环境变化从程序的运行参数得到。硬件配置选择的例子可能需要指定要连接什么类型的激光测距仪,要连接哪个端口,激光链接和数据参数,要连接什么样的GPS和使用哪个端口。此外,如果你要通过机载外的TCP而不是通过机载连接到机器人,你必须提供一个运行的命令行参数给机器人网络名称。机器人参数文件机器人参数文件在机器人连接成功及机器人类型和个体名字确定后有ARIA读取。这些文件提供给ARIA机器人具体的转换因素和物理角色,及辅助设备的连接信息。程序运行时的选择参数通过ArArgumentParser对象提供给其他类。所有的ARIA程序都要创建一个ArArgumentParser,调用ArArgumentParser::loadDefaultArguments()来加载出现在/etc/Aria.args文件或ARIAARGA环境变量中的任何参数,并且提供任何基础类中的对象接受他。一旦所有的对象创建完成,你可以调用Aria::logOptions()来打印所有相关选择的总结(如假设ArArgumentParser::checkHelpAndWarnUnparsed()返回true则调用Aria::logOptions();及Aria::exit(),最后调用Aria::parseArgs()导致每个检查各自的参数中的ArArgumentParser)。4.ArRobot客户端的命令和服务器信息包ARIA和移动机器人平台或模拟器建的客户-服务器通信使用基于分组的协议。(本文中客户端软件使用ARIA操作机器人,服务器是机器人平台的硬件。)ArRobot(使用ArDeviceConnection,ArRobotPacketReceiver,ArRobotPacketSender,ArRobotPacket,ArSerialConnection类)处理建设和发送命令包给机器人及接收和解码从机器人服务端收到的数据包的细节。分组处理程序服务信息包(SIPs)被机器人服务端口传送,其中包括机器人和附件的升级信息。标准的SIP由机器人每100毫秒自动传送给相关的客户端。它包含机器人的当前位置和估计,当前的平移和旋转速度,声纳阅读更新,电涌电压,模拟和数字I/O状态及更多信息。这些数据被ArRobot状态反思存储和使用,并通过ArRobot类的方法访问。扩展的SIP使用相同的数据包格式作为标准的SIP,但用不同的数据包的“类型”代码。扩展的SIP的例子有I/O端口数据,夹持器数据,或者是像原始编码数据一样的特殊机器人数据。为了获得扩展的SIP用户端编程必须要求他们。在ARIA中这通常由设备接口类实现,当他们被初始化或当机器人连接建立时。你可以将自己的自定义数据包处理程序利用ArRobot::addPacketHandler().连接到ArRobot。你可以使用这个做自己的扩展的SIP数据的额外的处理,或如果创建一个设备接口类的替代的实现。命令包为了控制机器人平台,用户端程序通过机器人连接发送命令包。这可以通过使用ArRobot的运动命令功能,使用操作或在最基层,直接命令。命令包中这些方法的结果传送到机器人。这意味着假如动作和动作命令被使用,或假如独立的程序模块传送运动命令,它们可能会发生冲突。机器人同步周期标准的SIP以固定的周期传送,这个SIP接收触发一个ArRobot的同步任务处理周期的新的迭代。这个周期包含一系列的任务,包括SIP数据包处理,传感器的解释任务,运动处理和解决,状态反应。由于任务的周期由每个SIP(除非机器人平台开始无法发送SIP或任务周期是明确的机器人连接的dissasociated)的接收触发,每项任务是在调用可预知的顺序,采取行动的最新数据,没有任务会错过使用SIP的机会,且只要任务不会花太多的时间来执行,每个SIP在机器人发送后都会尽快处理。ArRobot任务周期综述机器人→RobotconnectionnewSIPsentevery100mspackethandler→lockrobot(lock())→sensorinterpretationtask→actiontask→statereflectiontask→usertask→unlockrobot(unlock())→packethandler程序开始调用ArRobot::run()进入周期同步,或者调用ArRobot::runAsync()在一个新的后台线程中调用周期。ArRobot::stopRunning()停止运行周期。ArRobot提供的方法来添加你自己的传感器解释和通用的用户任务回调。为了增加任务回调创建了ArFunctor对象,增加他使用ArRobot::addSensorInterpTask()或ArRobot::addUserTask()。这些任务可以通过ArRobot::remSensorInterpTask()或ArRobot::remUserTask()删除。每个任务周期的循环中ArRobot的锁定与解锁用ArRobot::lock()和ArRobot::unlock()。但是,锁必须用于安全访问任何其它线程或ArAsyncTask,例如ArAsync或者其他范围内的设备或ARNL的规划或本地的任务。互斥锁保护ArRobot数据被其他线程修改(若在访问过程中正确使用锁),和中断一系列任务。所以假如你从其他线程(包括主线程,如果你使用ArRobot::runAsync()执行任务周期)访问ArRobot,你必须使用ArRobot::lock()和ArRobot::unlock()在任何方法调用和ArRobot中任何数据使用之前或之后锁和解锁机器人。也可以在无需连接机器人时执行程序。接收数据包,这种替代的周期是不可触发的,相反它有自身的稳定性,“链式”循环周期(默认是100ms,你可以用ArRobot::getCycleTime()和ArRobot::setCycleTime()检查和复位).。你也可明确的不赞成任何时候通过传入的SIP处理程序加工ArRobot的程序周期,通过调用ArRobot::setCycleChained()实现