zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

【IEEE2017】RL:机器人库:一种面向对象的机器人应用程序的方法

机器人方法应用程序 一种 面向对象 RL
2023-09-14 09:14:39 时间

RL:机器人库:一种面向对象的机器人应用程序的方法

摘要:

摘要:我们讨论了机器人库(RL)的架构和软件工程原理。在机器人系统、研究项目、工业应用和教育的需求的驱动下,我们确定了相关的设计需求,并提出了一种管理硬件和实时的方法,为强大的运动学和动态计算提供了一个用户友好的、面向对象的界面,并支持各种平台。从2004年开始经过十多年的开发,并评估了体系结构的许多变体,我们讨论了当前版本中库组件的设计选择。


RL官网:https://www.roboticslibrary.org/
关于RL库的使用可以参考我的专栏:https://blog.csdn.net/yohnyang/category_11950508.html

在这里插入图片描述

1.介绍

我们提出了一个纯C++库方法,涵盖从硬件抽象到运动规划的整个范围,称为机器人库(RL)。

A. 设计原则

  • 具有单个API的纯库:接口在库的整个组件中都是一致的,并且所有类都继承自已定义的基类。与许多其他机器人技术框架相反,RL不是一个中间件,而且它独立于任何可能使用的分布式通信方法。
  • 一致和完整的实现:主要机器人领域的所有重要算法,包括运动学、动力学、轨迹生成和路径规划,都是可用的,并使用相同的符号和接口。机器人的运动学和动力学支持通用的关节类型利用空间向量代数实现了一种树状结构。传感器和机器人的硬件驱动程序,以及各种类型的运动规划算法,被统一在一个类的层次结构中(第二节)。
  • 库重用:从相关领域设计良好的库,如碰撞检测或可视化,可以通过包装器提供。特别是在碰撞检测方面,已经存在一些高质量的库,它们在性能、精度和高级功能(如距离查询或光线广播)方面存在不同的妥协。RL在一个公共的场景图数据结构下提供了对它们的访问,并将它们的功能封装在一个抽象层中(第II-E节)。
  • 平台独立性:使用跨平台库的纯ISO C++实现可以在各种系统上编译,从嵌入式QNX,基于debian的树莓派,到运行窗口的PC。

除了这些软件设计原则之外,值得注意的是,RL是开源的,并在一个许可的2-条款的BSD许可下获得许可。因此,它对非商业性和商业性的应用程序都是免费的。开源支持调试整个软件堆栈,从用户界面一直调试到实时硬件控制。在[6]中给出了机器人库的早期版本的简短总结。

B.相关工作

  机器人操作系统(ROS)可能是机器人技术研究中最活跃的中间件和软件框架,通过频繁的提交、一个活跃的邮件列表和引用来表示。ROS主要是基于服务机器人系统的集成,并强烈强调许多进程(称为节点)之间的点对点拓扑结构和用于软件集成的大量通用工具集(例如作为构建系统、数据和拓扑的可视化、绘图或文档化)。在早期,ROS的设计主要由PR2移动操纵器指导。虽然这种设计获得了极大的欢迎,并成功地适应了更广泛的类人机器人、移动机器人和飞行器,但最初设计中没有涉及的一些规范——特别是实时需求——很难添加到现有的中间件概念中。出于这个原因,开发人员目前讨论在不同API版本中支持嵌入式平台和实时的计划。节点内部的核心功能依赖于许多现有的框架,如Orocos的运动学库[8]。与ROS包集合相比,RL是一个具有完全实时支持的同构库。
  开发面向对象的路径规划软件的最早方法是路径规划库的组件之一,它已经被重构为一个组件框架,但不再被维护。对于实时机器人控制,提出了面向对象、基于模型的设计和基于组件的框架。随后,提出了OpenRAVE架构,面向自主机器人运动规划和控制。与OpenRAVE相比,RL实现了机器人和传感器驱动程序。最近,提出了RobWork ,它同样提供了模拟和控制特性,以及一个可扩展的图形用户界面。与RobWork库相比,RL提供了实时支持。对于无碰撞路径规划,开放运动规划库[3]提供了大量最先进的算法,但没有办法在物理机器人上执行这些路径。进一步相关的是机器人仿真框架,如Gazebo 、V-REP 和Webots 。

2.方法

在本节中,我们将讨论该库及其组件的软件设计原则。包体系结构(图1)包括几个领域独立的数学和通用特性,以及机器人特定的包,其中高级包依赖于更基本的包。我们的讨论大致是从下到上遵循了软件包架构。

A.数字库

  一个设计良好的数值数学库对机器人库的所有其他部分都有很大的影响。在运动学、动力学、路径规划、轨迹生成和避免碰撞方面,几乎所有特定于机器人的算法都需要高效的向量和矩阵操作,以及高级矩阵和特征值分解的数值稳定计算。因此,选择强大的、数值稳定的和高效的数值例程对整个库的整体性能有很大的影响。除了效率之外,API的其他要求还包括可读性、用户友好性和一致性。

  通过机器人库的版本历史,我们总共有四个数学分支,最终使用Eigen 收敛到当前的实现中。Eigen通过使用表达式模板和显式向量化(例如,SSE4,AVX512)提供了快速和可读的代码。RL对本机特征类型进行了许多扩展,并添加了额外的特性,特别是对四元数实现。这些特征包括四元数类型的功率和指数函数,以及对角速度和加速度的转换。为了实现机器人旋转的平滑插值,RL实现了由定义的slerp函数及其导数。当给出了旋转插值的切线条件时,群函数可以满足具有有效四元数的光滑插值。RL实现了由定义的小队函数和三次四元数插值。

B.数学函数

  许多类型的几何计算经常用于机器人应用,从基本的三维转换,各种类型的旋转,到轨迹插值和空间向量计算。为了有一个清晰的分离关注点,我们实现了一般的几何函数,这是独立于机器人的运动学或动态模型的数学组件,它不受任何软件依赖。

  机器人库做出了两个重要的选择来描述其数学组件的设计:首先,轨迹生成采用了一种强代数的方法,其中轨迹被表示为分段代数函数,允许精确的插值和微分。其次,所有的刚体动力学函数都用空间向量表示,这允许特别简洁的公式和高效的计算。

  • 代数函数公式:避免在位置、速度和加速度上的不连续是轨迹生成中的一个主要挑战。只有具有连续导数的平滑轨迹才能实现安全、快速、精确的机器人运动。然而,当在操作空间中定义路径或在联合空间或操作运动之间切换时,机器人框架通常求助于简单的采样、过滤或低水平多项式的近似。
    在这里插入图片描述  RL避免了这种近似,并提供了一个构造分段、向量值代数函数的框架,允许在代数水平上表示所有类型的轨迹。如图2所示,抽象函数类定义了从实值(通常是时间)到向量(通常但不限于联合空间或操作空间配置)的映射,其值和导数值可以有效地计算出来。具体的类适用于所有基本类型的运动:用于关节和操作空间位置的多项式,用于旋转和操作空间方向的四元数多项式,以及沿着圆段的运动。分段函数和样条曲线(分段多项式)以复合模式的形式组织起来,允许在联合空间和操作空间中构造复杂的轨迹。这种方法的好处是双重的:首先,可以保证和验证精确的连续性和光滑性,对于多阶导数,包括加速度和颠簸。第二,轨迹是在语义、抽象的层面上制定的,与典型计算机辅助的层面相同。
      在数学组件中,函数类提供了不需要任何运动学模型的通用实现。特别地,静态函数可用于构造给定边界条件下的代数函数,包括高阶(四元数)样条插值和沿圆段的运动。当这样的函数是作为一个轨迹运行一个特定的机器人,运动学包第二节将解决轨迹的逆运动学映射操作空间,检查运动学限制,并允许执行评估分段轨迹函数对机器人的控制周期。
  • 空间向量公式:刚体动力学已经被许多机器人框架实现。然而,RL选择了一个不同的公式,并使用空间向量代数,如羽毛石提出的。空间向量被定义为一个六维向量,它可以是表示速度或加速度的运动矢量,也可以是表示动量或脉冲的力向量。空间向量不是欧几里得空间的一部分,点积只定义在运动和力向量之间。在这个符号中,一个空间变换可以表示为一个6x6的矩阵。当动力学算法在使用4x4变换矩阵编写时显得相当复杂,空间向量使递归牛顿欧拉算法在所有类型的关节的单式计算中成为一个非常简洁的公式。一个关节的n自由度由所有一般类型关节的6*n矩阵定义[20,p. 78f],包括旋转式关节、棱柱形关节、球形关节和螺旋形关节。
      空间向量的实现除了具有符号的简洁性和对所有关节类型的高通用性外,还具有更高的计算效率的重要好处。《羽毛石》显示。这种实现使运动链的正向和逆动力学计算的浮点操作数量最小化。

C.硬件抽象层

支持控制各种类型的硬件设备是机器人技术框架的一个主要特性。如今,机器人的设置依赖于几种类型的传感器,包括相机、距离传感器或力-扭矩传感器。在执行器方面,工业机器人和夹具器使用各种不同的协议,包括各种现场总线和定制的以太网协议。开源驱动程序的实现相当稀缺。在许多情况下,精确的协议文档不是手册的一部分,也不向公众开放。
在这里插入图片描述

  • 分层硬件驱动程序实现:硬件设备很适合用于面向对象的分层实现。虽然类似类型的设备,如执行器、力-扭矩传感器、夹钳或相机,共享一组共同的基本特性,但单个设备可能提供特定于特定制造商的额外特性[6,pp]。104f].这些公共接口被组织为一个面向对象的硬件抽象层中的类层次结构,如图3所示。
      对于具有极其多样化和细粒度的特性集的设备,将它们结构为多层总是一个选择。例如,一个类人动物可以被建模为一个可以平坦接触所有位置控制关节的设备,但也可以被设计为一个可以接触个人手臂、腿等的类。机器人机械手可以提供一个用于位置控制的接口,但也可以提供访问单个电机的接口,这些接口包括访问单个组件及其温度读数和控制值。
      在层次结构的顶部是抽象的设备类,定义了所有设备通用的方法:打开和关闭到硬件设备的连接,启动和停止操作,以及执行所有与设备之间的通信的步骤方法。
      与其他机器人技术框架相反,后者选择完全封装与硬件设备的通信,并实现异步函数调用和对数据接收的回调,RL选择避免任何类型的隐藏并发性。关于硬件组件,不创建线程或进程是库的一个重要设计选择(除了为此目的而设计的实际实时线程抽象类之外)。并发行为是连接具有实时约束的硬件的一个关键方面,因此应该掌握在程序员的手中。相反,RL要求应用程序在其控制周期内周期性地调用设备的步进法。
    在这里插入图片描述
      设备对象的状态和状态转换如图4所示。通过开放方法调用启动与新建设备的通信。对于实时设备,在实时约束条件下,连续的步进方法调用是必要的。它的操作在开始方法调用之后开始,然后以停止结束。重要的是,与设备的所有通信都通过这种方法执行,并在对象中进行缓冲。程序员通过获取器和设定器的方法访问缓存的传感器数据或执行器的目标位置。
      这种硬件接口设计允许所有类型的线程实现,包括特定于平台的实时线程。然而,设计期望程序员主动选择如何保证实时方法调用,而不隐藏这个重要的选择。程序员可以将他的应用程序设计为一个单一的进程,使用一个线程或针对每个硬件设备的不同周期时间的单个线程。他还可以为每个设备选择一个进程,以及基于他最喜欢的API的共享内存通信。为了平衡计算负载,程序员可以将执行繁重计算的设备和过程移动到单独的计算机上,并使用基本的TCP/UDP通信、现场总线或许多可用的中间软件中的一种。
  • 操作系统抽象:在引入新的C++11标准之前,RL为线程、互斥、条件变量、时钟和异步编程提供了接口,RL为通用的p线程、窗口、RTAI和Xenomai实现提供了抽象线程、互斥锁、信号量和计时器类。在最新版本中,RL建立在C++11标准之上,但提供了设置进程和线程优先级的扩展,以及RTAI和Xenomai的本地接口的标准兼容接口。
      RTAI和Xenomai是对Linux的开源内核扩展,可以处理实时调度。由于两者都来自同一个项目,RTAI的行为方式不同,因为它直接拦截中断通知,并避免了一些中断处理开销。一些本地实时操作系统,如QNX,通过p线程接口提供常规的POSIX线程。所有这些实时框架对于所有已实现的设备来说都足够快速和可靠,根据[21]的测量,TCP往返延迟远低于100µs。有了这个抽象线程类,程序员可以开发在多个实时操作系统或实时内核扩展上编译的应用程序。

D.运动学与动力学(Kinematics and Dynamics)

  运动学结构的建模是控制机器人系统的一个重要组成部分。结合机器人的动态特性,这包括计算基于联合值、雅可比矩阵及其导数、质量矩阵、科里奥里向量和重力补偿。
  常见的算法包括逆动力学的递推牛顿-欧拉算法和前向动力学的铰接体算法。经典的德纳维特-哈滕贝格符号被用来描述具有许多旋转和棱柱形关节来移动机器人的链接的系统.每种关节类型都需要不同的公式来描述这些算法。多体系统的面向对象建模可用于将关节和其他转换组件建模为影响帧、速度、加速度或力等元素的对象。
在这里插入图片描述
  通过结合这两种方法,空间向量代数可以用于建模关节类型,如螺旋形、圆柱形、平面形、球形或6-DOF关节。算法的建模方式是,这些转换对象修改相应的输入和输出值。主体之间的节点和固定转换可以看作是图中的边,而主体、世界参考和中间框架则表示该图中的顶点(图5).
在这里插入图片描述
  作为一个例子,递归的牛顿-Euler算法使用了两个迭代: (i)速度和加速度的正向传播,(ii)力的反向传播。在面向对象的实现中,这由两个函数表示,逆向动力学1和逆向动力学2实现不同(图6)。
  其他递归算法,如正向动力学的关节体算法也以类似的方式建模。为了计算一个给定状态的雅可比矩阵或质量矩阵,可以使用对这些算法的多个查询来创建一个状态的完整表示。树状结构很容易得到支持。

E.场景图抽象(Scene Graph Abstraction)

在这里插入图片描述

  几何数据对于三维可视化(图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]中模拟一个肌腱驱动的机器人。

F. 路径规划(Path Planning)

  寻找从一个机器人配置到另一个机器人配置的无碰撞路径是机器人技术中常见的任务。多年来,人们开发了各种各样的规划算法,采用了基于采样的方法,如概率路线图(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的规划器——并且可以选择用于这种算法。同样地,也有不同的策略用于快速验证图形的边。在生成一个解决方案路径后,用户可以在许多优化方法中进行选择,以最小化路径长度。

3.应用

在这里插入图片描述

A.运动学和几何学的基本可视化

  图10显示了包含在一个基本的机器人可视化中的最简单的演示程序之一。它使用Qt框架提供了一个简单的GUI,用户可以在其中实验正向和反向运动学。

  该程序可以加载以第II-E节的XML格式指定的场景定义,以及场景中包含的机器人的多个XML运动学定义。然后,它将创建一个相应的语言语言场景,用于可视化,以及用于运动学的运动学模型。在改变关节位置后,它将执行正向运动学来更新相应的链接帧,并将使用这些链接帧来更新几何场景中的匹配体。

B.基本路径规划程序

图11

C.基于实时任务的控制

在图13所示的人机合作系统中,通过在操作任务的空空间中的距离感知和在线控制来避免碰撞。工人的运动跟踪是使用一个商业光学跟踪系统进行的,该系统提供了一个在Windows上运行的SDK。机器人的实时控制在实时Linux系统上实现单过程的实时控制(图12)。
在这里插入图片描述
在这里插入图片描述

4.结论和未来的工作

经过十多年的发展,我们已经设计了一个适合广泛应用的机器人软件架构。与相关工作相比,我们遵循一种平台独立的纯库方法,它满足了与机器人相关的一些设计特性,如实时控制、特征丰富的几何算法和强大的机器人运动学。在未来,我们计划在基于约束的任务编程[31]领域集成我们的工作,并为其开发一个用户友好的API。