摘要:
摘要:我们讨论了机器人库(RL)的架构和软件工程原理。在机器人系统、研究项目、工业应用和教育的需求的驱动下,我们确定了相关的设计需求,并提出了一种管理硬件和实时的方法,为强大的运动学和动态计算提供了一个用户友好的、面向对象的界面,并支持各种平台。从2004年开始经过十多年的开发,并评估了体系结构的许多变体,我们讨论了当前版本中库组件的设计选择。
RL官网:https://www.roboticslibrary.org/
关于RL库的使用可以参考我的专栏:https://blog.csdn.net/yohnyang/category_11950508.html
我们提出了一个纯C++库方法,涵盖从硬件抽象到运动规划的整个范围,称为机器人库(RL)。
除了这些软件设计原则之外,值得注意的是,RL是开源的,并在一个许可的2-条款的BSD许可下获得许可。因此,它对非商业性和商业性的应用程序都是免费的。开源支持调试整个软件堆栈,从用户界面一直调试到实时硬件控制。在[6]中给出了机器人库的早期版本的简短总结。
机器人操作系统(ROS)可能是机器人技术研究中最活跃的中间件和软件框架,通过频繁的提交、一个活跃的邮件列表和引用来表示。ROS主要是基于服务机器人系统的集成,并强烈强调许多进程(称为节点)之间的点对点拓扑结构和用于软件集成的大量通用工具集(例如作为构建系统、数据和拓扑的可视化、绘图或文档化)。在早期,ROS的设计主要由PR2移动操纵器指导。虽然这种设计获得了极大的欢迎,并成功地适应了更广泛的类人机器人、移动机器人和飞行器,但最初设计中没有涉及的一些规范——特别是实时需求——很难添加到现有的中间件概念中。出于这个原因,开发人员目前讨论在不同API版本中支持嵌入式平台和实时的计划。节点内部的核心功能依赖于许多现有的框架,如Orocos的运动学库[8]。与ROS包集合相比,RL是一个具有完全实时支持的同构库。
开发面向对象的路径规划软件的最早方法是路径规划库的组件之一,它已经被重构为一个组件框架,但不再被维护。对于实时机器人控制,提出了面向对象、基于模型的设计和基于组件的框架。随后,提出了OpenRAVE架构,面向自主机器人运动规划和控制。与OpenRAVE相比,RL实现了机器人和传感器驱动程序。最近,提出了RobWork ,它同样提供了模拟和控制特性,以及一个可扩展的图形用户界面。与RobWork库相比,RL提供了实时支持。对于无碰撞路径规划,开放运动规划库[3]提供了大量最先进的算法,但没有办法在物理机器人上执行这些路径。进一步相关的是机器人仿真框架,如Gazebo 、V-REP 和Webots 。
在本节中,我们将讨论该库及其组件的软件设计原则。包体系结构(图1)包括几个领域独立的数学和通用特性,以及机器人特定的包,其中高级包依赖于更基本的包。我们的讨论大致是从下到上遵循了软件包架构。
一个设计良好的数值数学库对机器人库的所有其他部分都有很大的影响。在运动学、动力学、路径规划、轨迹生成和避免碰撞方面,几乎所有特定于机器人的算法都需要高效的向量和矩阵操作,以及高级矩阵和特征值分解的数值稳定计算。因此,选择强大的、数值稳定的和高效的数值例程对整个库的整体性能有很大的影响。除了效率之外,API的其他要求还包括可读性、用户友好性和一致性。
通过机器人库的版本历史,我们总共有四个数学分支,最终使用Eigen 收敛到当前的实现中。Eigen通过使用表达式模板和显式向量化(例如,SSE4,AVX512)提供了快速和可读的代码。RL对本机特征类型进行了许多扩展,并添加了额外的特性,特别是对四元数实现。这些特征包括四元数类型的功率和指数函数,以及对角速度和加速度的转换。为了实现机器人旋转的平滑插值,RL实现了由定义的slerp函数及其导数。当给出了旋转插值的切线条件时,群函数可以满足具有有效四元数的光滑插值。RL实现了由定义的小队函数和三次四元数插值。
许多类型的几何计算经常用于机器人应用,从基本的三维转换,各种类型的旋转,到轨迹插值和空间向量计算。为了有一个清晰的分离关注点,我们实现了一般的几何函数,这是独立于机器人的运动学或动态模型的数学组件,它不受任何软件依赖。
机器人库做出了两个重要的选择来描述其数学组件的设计:首先,轨迹生成采用了一种强代数的方法,其中轨迹被表示为分段代数函数,允许精确的插值和微分。其次,所有的刚体动力学函数都用空间向量表示,这允许特别简洁的公式和高效的计算。
6x6
的矩阵。当动力学算法在使用4x4
变换矩阵编写时显得相当复杂,空间向量使递归牛顿欧拉算法在所有类型的关节的单式计算中成为一个非常简洁的公式。一个关节的n
自由度由所有一般类型关节的6*n
矩阵定义[20,p. 78f],包括旋转式关节、棱柱形关节、球形关节和螺旋形关节。支持控制各种类型的硬件设备是机器人技术框架的一个主要特性。如今,机器人的设置依赖于几种类型的传感器,包括相机、距离传感器或力-扭矩传感器。在执行器方面,工业机器人和夹具器使用各种不同的协议,包括各种现场总线和定制的以太网协议。开源驱动程序的实现相当稀缺。在许多情况下,精确的协议文档不是手册的一部分,也不向公众开放。
运动学结构的建模是控制机器人系统的一个重要组成部分。结合机器人的动态特性,这包括计算基于联合值、雅可比矩阵及其导数、质量矩阵、科里奥里向量和重力补偿。
常见的算法包括逆动力学的递推牛顿-欧拉算法和前向动力学的铰接体算法。经典的德纳维特-哈滕贝格符号被用来描述具有许多旋转和棱柱形关节来移动机器人的链接的系统.每种关节类型都需要不同的公式来描述这些算法。多体系统的面向对象建模可用于将关节和其他转换组件建模为影响帧、速度、加速度或力等元素的对象。
通过结合这两种方法,空间向量代数可以用于建模关节类型,如螺旋形、圆柱形、平面形、球形或6-DOF关节。算法的建模方式是,这些转换对象修改相应的输入和输出值。主体之间的节点和固定转换可以看作是图中的边,而主体、世界参考和中间框架则表示该图中的顶点(图5).
作为一个例子,递归的牛顿-Euler算法使用了两个迭代: (i)速度和加速度的正向传播,(ii)力的反向传播。在面向对象的实现中,这由两个函数表示,逆向动力学1和逆向动力学2实现不同(图6)。
其他递归算法,如正向动力学的关节体算法也以类似的方式建模。为了计算一个给定状态的雅可比矩阵或质量矩阵,可以使用对这些算法的多个查询来创建一个状态的完整表示。树状结构很容易得到支持。
几何数据对于三维可视化(图8)、碰撞检查、距离计算和射线铸造是必要的。虽然在CAD程序中,几何图形通常被建模为一个边界表示(B-rep),但可视化和列出的查询通常需要一个多边形表示。为了交换多边形数据,机器人库使用VRML(虚拟现实建模语言),一种由许多CAD程序和3D编辑器支持的通用格式。与三角形网格一起,它提供了对基本原语的支持,如盒子、球体、圆柱体和圆锥体,可用于碰撞检测引擎。命名节点可以用来参考单个机器人模型及其各自的运动体。
一个场景表示由许多移动的物体组成,这些物体可以被分成模型,以映射到机器人和障碍物(图7)。在场景图中,这些身体并没有排列成一个树状的结构。相反,物体位于世界框架中,以支持与运动学和动力学模型、物理模拟和传感器输入的各种连接。在物理引擎中,物体是通过关节或弹簧连接的,在相互作用中可以被拆除或断裂。每个物体都由许多具有静态变换的几何形状组成。为了更新给定关节配置的机器人几何模型,通过机器人相应的运动学表示来计算单个帧。
文件导入和3D可视化是使用开放的Inventor API实现的,这是一个面向对象的场景图实现。VRML支持良好的加载性能,因为它是对本地Inventor文件格式的扩展。为了将实体分组到模型中,附加的场景描述文件指定VRML文件中单个模型和实体的名称。单独的VRML文件可以用于可视化和碰撞检测,以便建模原始形状,如盒子,球体,或凸壳,以提高性能[24]。
为了比较不同的碰撞引擎,API取消定义了用于简单的碰撞/距离/光线投射查询和穿透深度计算的接口。功能包括在形状、主体、模型或整个场景之间的查询。
机器人库的一个分支探索了用colada替换VRML,因为它提供了对单个文件中的可视化(详细图形)和物理(碰撞形状和动态属性)场景的描述。Cololada1.5.0甚至提供了对B-rep几何图形描述的支持。然而,在当前的3D软件程序中,对以这种格式导出几何图形文件的支持仍然很有限。虽然在一些程序中可以导出版本格式为1.4.0的视觉场景,但对建模和导出物理场景的支持仍然很差。此外,官方的++DOMAPI只提供了COLLADA XML模式的基本C++对象表示,并将大部分工作留给用户。RL的这个分支在[25]中模拟一个肌腱驱动的机器人。
寻找从一个机器人配置到另一个机器人配置的无碰撞路径是机器人技术中常见的任务。多年来,人们开发了各种各样的规划算法,采用了基于采样的方法,如概率路线图(PRM
)和快速探索随机树(RRT
)及其变化。在“Balancing exploration and exploitation in sampling-based motion planning,” IEEE Transactions on Robotics
中可以比较了使用RL的各种规划算法及其性能。
路径规划需要一个机器人的运动学表示、一个几何模型和一个用于碰撞检测的引擎(下图)。为了确定一个状态是否在碰撞,运动学将一个n
维关节配置映射到三维工作空间中的几何框架,然后碰撞引擎计算结果。
运动学还将度量空间定义为其各个关节的流形的组合。具有上界和下界的棱柱形或旋转关节用ℝ1表示,而一个没有限制的旋转关节用S1表示。球关节表示真实射影空间RP3 ,对自由飞行物体给出了R3 X RP3的正确流形。这些指标必须被计算全局距离函数和在配置之间进行插值时考虑。
除了几何结构的复杂性和碰撞引擎的性能外,最近邻计算是许多规划算法中最昂贵的操作。随着树或图中顶点的数量的增加,线性搜索变得越来越昂贵。像K
维树这样的结构只能扩展到大约20 DOF的运动学,需要对欧几里得距离以外的指标进行特殊调整。对于DOF的数量也有类似的限制,几何近邻访问树(GNAT)只需要一个全局距离函数,是其他指标[28]的替代方法。并行化(OpenMP)可以在某种程度上用来提高这些昂贵的查询的性能。
基于采样的规划器依赖于一个适当的伪随机数发生器[29]。除了均匀采样之外,还引入了各种其他的采样技术——特别是对于类似于prm的规划器——并且可以选择用于这种算法。同样地,也有不同的策略用于快速验证图形的边。在生成一个解决方案路径后,用户可以在许多优化方法中进行选择,以最小化路径长度。
图10显示了包含在一个基本的机器人可视化中的最简单的演示程序之一。它使用Qt框架提供了一个简单的GUI,用户可以在其中实验正向和反向运动学。
该程序可以加载以第II-E节的XML格式指定的场景定义,以及场景中包含的机器人的多个XML运动学定义。然后,它将创建一个相应的语言语言场景,用于可视化,以及用于运动学的运动学模型。在改变关节位置后,它将执行正向运动学来更新相应的链接帧,并将使用这些链接帧来更新几何场景中的匹配体。
图11
在图13所示的人机合作系统中,通过在操作任务的空空间中的距离感知和在线控制来避免碰撞。工人的运动跟踪是使用一个商业光学跟踪系统进行的,该系统提供了一个在Windows上运行的SDK。机器人的实时控制在实时Linux系统上实现单过程的实时控制(图12)。
经过十多年的发展,我们已经设计了一个适合广泛应用的机器人软件架构。与相关工作相比,我们遵循一种平台独立的纯库方法,它满足了与机器人相关的一些设计特性,如实时控制、特征丰富的几何算法和强大的机器人运动学。在未来,我们计划在基于约束的任务编程[31]领域集成我们的工作,并为其开发一个用户友好的API。