一、仿真必要性
为什么需要仿真?这可能是绝大部分初学者的第一个疑问。传统的产品开发流程往往需要经过产品定义—>概念设计—>方案评审—>详细设计—>样机试制—>测试—>方案优化等流程。但是随着产品复杂度的增大,尤其对于机器人这种多自由度复杂系统,直接采用上述流程的弊端越来越大。图1 传统的开发流程
其次,在没有仿真的情况下,软件开发工作很容易滞后。虽然在等待硬件定型的过程中依然可以进行软件结构的设计,但是由于缺乏有效的反馈,这个过程中开发的东西很容易跟实际系统产生脱节,等到在实际系统上做测试的时候,部分组件甚至会需要推倒重来,之前的部分工作量一定程度上就浪费了。二、仿真简介
仿真是指通过计算机对实际的物理系统进行模拟的技术。对于机器人而言,机器人仿真是基于交互式计算机图形技术和机器人学理论,生成机器人的几何图形,并对其进行三维显示,用来描述机器人及工作环境的动态变化过程。目前业界主要使用URDF(Unified Robot Description Format)和SDF(Simulation Description Format)文件来描述机器人模型,他们都是XML语法框架下用来描述机器人的语言格式。虽然URDF是ROS中的标准格式,但它缺乏许多功能来描述更复杂的场景。例如,URDF只能指定单个机器人的运动学和动力学特性,它无法指定摩擦特性和处理闭链结构。此外,它不能指定环境信息,例如灯光、高度图等。SDF的提出就是为了解决URDF的缺点,它可以实现对机器人所有内容的完整描述,其可扩展性更适合于复杂的仿真。
图4 物理引擎工作流程
三、仿真评价指标
为了客观评价仿真软件的优劣,需要制定统一的标准。早期的研究学者确定了评估机器人仿真平台的通常标准:逼真度、可扩展性、开发简易性和成本。这四个标准可以用来判断任何一款机器人仿真软件。但随着仿真软件的发展以及应用场景的丰富,在不同开发环境下对仿真软件的评价标准也稍有不同。四、物理引擎介绍
物理引擎有两种常见的类型:高精度物理引擎和实时物理引擎。 介绍:Bullet[2]物理引擎是开源的、专业的,集刚体、软体和碰撞检测于一身的动力学类库。由Erwin Coumans开发。它最初是为游戏开发而设计的,但现在已经广泛用于机器人学、虚拟现实、计算机图形学等领域。Bullet3支持多种物理模拟,包括刚体、软体、车辆、水、气体等。
特点:开源霸主,具有离散和连续碰撞检测的刚体和柔体仿真;碰撞形状包括:球体、长方体、圆柱体、圆锥体、使用GJK的凸包、非凸网格和三角形网格;支持柔体仿真:布料、绳索和可变形物体;提供丰富的刚体和柔体约束;具有速度级MLCP和简化坐标Featherstone ABA算法;丰富的插件:支持Maya、Softimage的插件,可集成到Houdini、Cinema 4D、LightWave 3D、Blender、Godot和Poser中;Collada 1.4物理内容导入;针对PlayStation 3 Cell SPU、CUDA和OpenCL的定向优化。
>>>> Open Dynamics Engine (ODE)
介绍:ODE[3](Open Dynamics Engine,开源动力学引擎)是一个著名免费的具有工业品质的用于模拟关节连接的刚体动力学的库,由Russell Smith在一些贡献者的帮助下开发而成。经过验证的应用场景包括在虚拟显示环境中模拟地面车辆,足式生物和移动物体。它具有快速、灵活、健壮的特点,并具有内置的碰撞检测功能。
特点:支持具有任意质量分布的刚体;关节类型:球副、转动副、移动副、固定副、旋转电机、直线电机、万向节;碰撞基本体:球体、长方体、圆柱体、胶囊体、平面和三角形网格、凸面体;碰撞空间:四叉树、哈希空间和简单空间;模拟方法:根据Trinkle/Stuwart和Anitescu/Potra的拉格朗日乘子速度模型推导出运动方程;使用一阶积分器,速度很快但还不够准确,稍后将推出更高阶的积分器;时间步长方法的选择:可以使用标准的“大矩阵”方法或较新的迭代QuickStep方法;接触和摩擦模型:基于Baraff的Dantzig LCP求解器,尽管ODE实现了对Coloumb摩擦模型的更快近似;开放原生的C接口(尽管ODE大部分是用C++编写的)和基于C++接口。
>>>> Multi-Joint dynamics with Contact (MuJoCo)
介绍:MuJoCo[4]是由Emo Todorov为Roboti LLC而开发的一种物理引擎,旨在促进机器人技术、生物力学、图形、动画以及其他需要快速而准确仿真领域的研究和开发。它提供了速度,准确性和建模能力的独特组合,但它不仅仅是一个更好的模拟器。相反,它是第一个从头开始设计的全功能模拟器,目的是基于模型的优化,尤其是通过接触进行的优化。MuJoCo使扩大计算密集型技术(例如最优控制,物理一致状态估计,系统识别和自动化机制设计)成为可能,并将其应用于具有丰富接触行为的复杂动态系统。它还具有更多传统应用程序,例如在物理机器人上部署之前测试和验证控制方案,交互式科学可视化,虚拟环境,动画和游戏。
特点:在广义坐标系中进行仿真,避免出现关节冲突;即使存在接触也可以很好地定义逆动力学;通过凸优化对约束进行统一的连续时间表述;约束包括软接触,极限,干摩擦,等式约束;能模拟粒子系统,布料,绳索和软物体;包括马达,圆柱体,肌肉,腱,滑块曲柄的执行器;可选择牛顿,共轭梯度或投影高斯-赛德尔求解器;可选择金字塔形或椭圆形的摩擦锥,密集或稀疏的雅可比方程式;可选择Euler或Runge-Kutta数值积分器;多线程采样和有限差分近似;直观的XML模型格式(称为MJCF)和内置的模型编译器;跨平台GUI在OpenGL中具有交互式3D可视化;用ANSI C编写并针对性能进行手工调整的运行时模块。
>>>> Dynamic Animation and Robotics Toolkit (DART)
介绍:DART[5](动态动画和机器人工具箱)是由乔治亚理工学院的图形实验室和仿人机器人实验室创建的一个协作、跨平台的开放源码库。该库为机器人技术和计算机动画中的运动学和动力学应用提供数据结构和算法。由于DART使用广义坐标来表示铰接刚体系统,并使用Featherstone的铰接体算法来计算运动动力学,因此它的精度和稳定性得到了显著的提高。DART在机器人学和计算机动画中有着广泛的应用,因为它具有多体动力学模拟器和各种用于控制和运动规划的运动学工具。
特点:支持多种平台:Ubuntu,Archlinux,FreeBSD,macOS和Windows;提供可扩展的API以解决各种优化问题,例如非线性编程和多目标优化。
支持多种碰撞检测器:FCL,Bullet和ODE;支持各种碰撞形状,包括原始形状,凹面网格和概率体素网格;通过可定制的惯性和材料属性,支持众多原始的和任意的身体形状;提供对任意实体和坐标系的运动状态(例如,变换,位置,速度或加速度)的全面访问。
即插即用的分层整体逆运动学求解器;使用李群表示法和Featherstone混合算法为铰接式动态系统实现高性能;为动态量及其派生提供全面的API,例如质量矩阵,科里奥利力,重力,其他外力和内力;使用隐式LCP处理接触和碰撞,以确保不穿透,定向摩擦以及近似的库仑摩擦锥条件;提供多个约束求解器:Lemke方法,Dantzig方法和PSG方法;支持“孤岛”技术来细分约束处理以提高性能。
以上五种物理引擎的基本特点可以总结如下表[6]:
下表描述了基于速度-精度曲线评估的各物理引擎性能结果[7]。
从表3可以看出,ODE通常能很好地处理单个基本体形状的物体,而MuJoCo和DART在多体仿真中具有优势。ODE的多体系统仿真是非常耗时的,但值得注意的是,它在articulated-robot-system momentum test中表现出色:尽管效率明显低下,但采用最大坐标表示方法具有良好的动量保持能力。Bullet可以非常准确、高效地模拟具有摩擦接触的物体的滑动。RaiSim凭借其独特的接触求解方法和高效的多体动力学算法实现,通常在单体和多体任务中都具有良好的性能。
但是,这些引擎也具有自身局限性:
机器人系统设计离不开仿真工具的支持。机器人仿真让我们在没有物理硬件的情况下也可以快速对算法进行验证或者提高安全性,避免实验损伤我们的设备(比如在增强学习中,就需要大量random的exploration)。一般来说机器人仿真工具在物理引擎之上进行包装,如基于ODE、Bullet等。有些情况下我们只需要使用物理引擎就可以满足需要,但一般情况下我们也想通过可视化平台观察机器人运行的正确性。下面将对目前在机器人仿真领域比较知名的仿真平台进行介绍和分析。
>>>> Webots但Webots也有许多缺点。首先,Webots建模过程比较繁琐,对于闭链结构机器人的支持不够完善,使用webots仿真并联机器人会比较麻烦。其次,Webots仿真过程数据不能自动保存,可视化做得也不是很好,使用较为不便。最后,Webots控制台不支持中文,软件界面中文翻译不完整,帮助文档也没有中文版。
>>>> V-rep
V-REP[9](现在更新命名为CoppeliaSim)是免费的,用于教育目的,如果计划将其用于商业项目,则可以升级到专业版。可以在Windows,Linux或macOS上运行V-REP,并且可以使用六种不同的编程语言对其进行编程。它还具有ROS&BlueZero支持,因此可以只使用3D模拟器并使代码在另一个平台上运行。Gazebo[10]模拟器是一个免费的开源平台,可用于设计,开发,测试和可视化几乎任何类型的机器人。Gazebo可在Linux,Windows和Mac上运行,是ROS的默认仿真器,可以调用多种开源算法并可以直接部署到真机。Gazebo支持多种高性能物理引擎,例如ODE,Bullet,Simbody和DART。Gazebo模拟器还附带了一些机器人模型,例如PR2,DX,Irobot Create和TurtleBot,因此即使没有自己的机器人模型,也可以快速上手。它还支持广泛的传感器,并且可以模拟噪声和传感器故障,以准确模拟实际问题。甚至可以在云中运行Gazebo,并使用简单的Web浏览器与模拟器进行交互。
图9 Gazebo系统架构
图片来源:https://www.mdpi.com/2075-1702/7/2/42
Gazebo中的模型格式是基于XML的SDF,构建一个模型需要用户自己编写XML文件,对于初学者有一定难度。其次,Gazebo对于闭链结构机器人的支持不够完善,并且Gazebo与ROS的结合程度很高,对于不熟悉ROS的用户而言上手难度较大。图10 Gazebo仿真器界面
图片来源:https://alternativeto.net/software/gazebo-robot-simulator/about/
>>>> ISAAC
NVIDIA ISAAC[11]平台是由领先的显卡厂商NVIDIA开发的仿真平台,可以为开发者提供一个功能强大的端到端平台,用于开发、仿真和部署支持 AI 的机器人。它可以在启用GPU的桌面上运行,也可以在AWS,Google Cloud或Azure上的云中运行。它还支持NVIDIA Jetson AGX Xavier,Jetson TX2和Jetson Nano。由于ISAAC机器人技术平台是由NVIDIA制造的,因此它提供了所有机器人模拟仿真器中最好的图形。
ISAAC针对NVIDIA硬件(GPU)进行了优化,可以生成高效的平台优化的交叉编译应用程序。ISAAC 集成了其中许多CUDA加速的开源库,例如NPP,OpenCV,ROS,PCL(wip),Eigen等。ISAAC SDK附带了一系列高性能算法,这些算法被称为GEM,此外除了机器人控制类的算法,ISAAC还为主业打游戏副业“炼丹”的同学们准备了深度神经网络模块的集成,例如立体声深度估计、目标检测、Tracking算法等等。ISAAC 整合了最新的PhysX和RTX引擎进行物理仿真和图像仿真,其次引入了Pixar公司开发的usd(Universal Scene Description)描述格式作为机器人和复杂场景的描述方式。>>>> Drake
Drake[12]是由麻省理工学院计算机科学与人工智能实验室(CSAIL)机器人 Robot Locomotion Group 开发的C++工具箱。随着丰田研究所(Toyota Research Institute)领导的核心开发团队的发展,开发团队现已显著壮大。它是一个用于分析机器人动力学和构建机器人控制系统的工具集合,重点强调基于优化的设计/分析[13]。
Drake旨在模拟非常复杂的机器人动力学(例如,摩擦、接触、空气动力学等),但始终强调揭示控制方程中的结构特性(稀疏性、分析梯度、多项式结构、不确定性量化等),并使这些信息用于高级规划、控制和分析算法。
Drake有三个主要组件:1)多体动力学引擎;2)用于将库中的系统模型组织和组合成框图的“系统框架”;3)数学编程的优化框架。这些组件中的每一个对机器人研究都很重要。
图片来源:https://medium.com/toyotaresearch/drake-model-based-design-in-the-age-of-robotics-and-machine-learning-59938c985515
这些组件中的每一个对机器人研究都很重要,Drake的愿景是促进在单个应用程序中实现三个组件的强大组合。Drake支持符号计算,这对与优化问题非常有用。Drake还提供了一系列传感器模型、执行器模型、低层控制器和低层感知算法。Drake提供了Python接口,以实现新算法的快速验证,同时还致力于为许多最先进的算法提供可靠的开源实现。
图片来源:https://www.youtube.com/watch?v=_8af5NgbKVc
>>>> MATLABMATLAB是由美国MathWorks公司出品的一款商业数学软件。它是一个多功能的科学计算平台,将算法开发、数据分析、矩阵计算等诸多强大功能集成在一个易于操作的视窗环境中。
MATLAB下的Simulink[14]更是被认为可以“仿真任何系统”。正是由于MATLAB/Simulink的强大功能,它在机器人领域得到了广泛的运用。内置的Simscape工具箱可以用来设计和分析三维刚体机械结构(譬如汽车平台、机械臂等等)。除此之外,它还可以使用电气、液压或气动以及其他组件进行多域系统建模。Robotics System Toolbox可以让你通过ROS直接连接到传感器并且对传回来的信息进行校准、降噪等操作。
同时,针对机器视觉,Mathwork开发了单独的工具箱Computer Vision Toolbox。它支持单目、立体、鱼眼等相机的校准,提供了对象的检测跟踪,特征提取和匹配等算法,同时可以根据数据进行三维重建和3D点云处理。Simulink提供了一系列的嵌入式硬件支持,预设Arduino和树莓派的硬件包,支持微控制器、PLC、FPGA、GPU等多种设备,不仅仅可以仿真,更可以对硬件进行直接的控制。Simulink的编程环境具有多样化,支持C/C++,可以直接连接到ROS系统。MATLAB Coder和Simulink Coder可以根据你建立的模型自动生成控制代码,大大减轻工作量。图14 Matlab/Simulink Simscape仿真器
PyBullet[15]是基于Bullet物理引擎开发的仿真环境,是Gazebo强有力的竞争对手。由Erwin Coumans和其他贡献者开发,它允许用户使用Python编程语言来控制Bullet3物理引擎,并进行物理仿真。
PyBullet和Python紧密结合,目前在增强学习(RL)中广泛应用。该环境可以结合TensorFlow实现RL训练,比如DQN、PPO、TRPO、DDPG等算法[16],目前看到比较多的都是仿真多关节机器人。
PyBullet是一个快速且易于使用的Python模块,用于机器人仿真和机器学习,重点是Sim到Real的转换;使用PyBullet,可以从URDF、SDF、MJCF和其他文件格式加载铰接体;PyBullet提供正向动力学仿真、反向动力学计算、正向和反向运动学、碰撞检测和射线相交查询;Bullet Physics SDK包括PyBullet机器人示例,例如模拟的四足机器人Minitaur,使用tensorflow进行决策的模拟人类跑步,以及KUKA抓取物体;简化的坐标多体、刚体和变形体由统一的LCP约束求解器处理。
除了物理模拟之外,还具有渲染绑定,包括CPU渲染器(TinyRenderer)和OpenGL可视化,并支持HTC Vive和Oculus Rift等虚拟现实;PyBullet还具有执行碰撞检测查询(最近的点,重叠对,射线相交测试等)并添加调试渲染(调试行和文本)的功能;PyBullet具有跨平台的内置客户端服务器,支持共享内存,UDP和TCP网络,可以在连接到Windows VR服务器的Linux上运行PyBullet;PyBullet包装了新的Bullet C-API,它独立于底层的物理引擎和渲染引擎,因此我们可以轻松地迁移到Bullet的较新版本,或者使用不同的物理引擎或渲染引擎。>>>> Mujoco
MuJoCo全称Multi-Joint dynamics with Contact (接触型多关节动力学),它是一个模拟接触周围环境的多关节运动的物理引擎,可用于机器人动作、生物力学、图形和动画、机器学习等领域。2021年被DeepMind收购并开源,可在Linux,Windows和Mac上运行。
MuJoCo结合了广义坐标模拟和优化后的接触动力学[17],这使它能够模拟完整的物理运动。更让人惊艳的,还有MuJoCo对于人体关节、肌肉复杂运动的模拟。许多机械手的研究,都是先在MuJoCo中模拟和验证的。MuJoCo还能灵活将仿真步骤拆开执行,或者只执行仿真流程的一部分(如不计算逆动力学)。而且支持软体材料,如绳子、布料的稳定性仿真。图16 Mujoco仿真器1
图17 Mujoco仿真器2
图片来源:https://www.youtube.com/watch?v=3dlM1dvBtko
六、总结
仿真在复杂的机器人项目中可以有效地帮助提高开发和测试效率,使得开发者在实机测试和部署之前尽可能多的发现错误,在系统出现问题之后更方便的复现和解决问题,同时还有利于同一个项目中不同的小团队(例如软件组和硬件组)协调工作进度。但是,天下没有免费的午餐,构建和维护仿真也需要额外的工作量,因此开发团队需要针对项目需求,评估和选择合适的仿真平台以最大化收益/成本。[1] https://raisim.com/
[2] https://pybullet.org/wordpress/
[3] http://www.ode.org/
[4] https://mujoco.org/
[5] https://dartsim.github.io/
[6] Erez, Tom, Yuval Tassa, and Emanuel Todorov. "Simulation tools for model-based robotics: Comparison of bullet, havok, mujoco, ode and physx." 2015 IEEE international conference on robotics and automation (ICRA). IEEE, 2015.
[7] https://leggedrobotics.github.io/SimBenchmark/
[8] https://cyberbotics.com/
[9] https://www.coppeliarobotics.com/
[10] https://gazebosim.org/
[11] https://www.nvidia.com/en-us/deep-learning-ai/industries/robotics/
[12] https://drake.mit.edu/
[13] Posa, Michael, Scott Kuindersma, and Russ Tedrake. "Optimization and stabilization of trajectories for constrained dynamical systems." 2016 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2016.
[14] https://www.mathworks.com/products/simulink.html
[15] https://pybullet.org/wordpress/
[16] Mower, Christopher, et al. "ROS-PyBullet Interface: A framework for reliable contact simulation and human-robot interaction." Conference on Robot Learning. PMLR, 2023.
[17] Todorov, Emanuel. "Convex and analytically-invertible dynamics with contacts and constraints: Theory and implementation in mujoco." 2014 IEEE International Conference on Robotics and Automation (ICRA). IEEE, 2014.