
1. 项目缘起为什么选择Isaac Sim来仿真reBotArm最近在折腾一个机械臂项目用的是reBotArm。这玩意儿性能不错但直接上真机调试成本高、风险大一个参数不对就可能“咣当”一声。所以仿真是绕不开的一步。市面上仿真工具不少从老牌的Gazebo到MATLAB/Simulink再到各种CAD软件里的运动仿真模块选择很多。但为什么我最终锁定了NVIDIA的Isaac Sim呢这得从几个实际的痛点说起。首先是物理仿真的真实度。很多仿真器在模拟接触、碰撞、摩擦时效果比较“卡通”。你可能会遇到机械臂抓取物体时直接穿模或者摩擦力设置稍有不慎物体就滑得跟抹了油一样。Isaac Sim基于PhysX 5这是目前游戏和工业仿真领域顶级的物理引擎之一。它对刚体动力学、关节驱动、传感器噪声的模拟尤其是对复杂接触比如机械手抓取不规则物体的处理比很多开源方案要靠谱得多。对于reBotArm这种可能涉及精密操作如装配、分拣的场景物理保真度是刚需。其次是与AI工作流的无缝衔接。现在搞机器人尤其是机械臂早就不是写死一串轨迹点那么简单了。视觉伺服、强化学习、数字孪生、AI感知模型训练这些才是提升智能化的关键。Isaac Sim不是一个孤立的仿真器它是NVIDIA Omniverse平台的一部分天生为AI和机器人研发设计。这意味着你可以在高度逼真的虚拟环境中用合成数据Synthetic Data训练你的视觉模型或者用强化学习库比如Isaac Gym来训练控制策略然后近乎无缝地部署到真实的reBotArm上。这个“仿真-训练-部署”的闭环是其他工具难以比拟的。再者是渲染与传感器模拟能力。如果你需要基于摄像头做视觉算法仿真的摄像头画面质量至关重要。Isaac Sim支持RTX实时光线追踪能生成带全局光照、阴影、材质反射的高保真图像甚至能模拟相机畸变、噪声、运动模糊。这对于训练一个鲁棒的视觉模型来说价值巨大。相比之下Gazebo的渲染效果就朴素得多虽然能用但生成的数据分布和真实世界差距较大训练出的模型容易过拟合到仿真环境。最后是对ROS 2的原生支持。reBotArm的官方驱动和控制器大概率是基于ROS 2的。Isaac Sim内置了ROS 2 Bridge可以让你在仿真环境里直接启动ROS 2节点订阅和发布话题控制仿真的机械臂同时接收其传感器数据。这几乎复刻了真实机器人的软件栈使得在仿真中调试好的算法迁移到真机时改动最小。当然Isaac Sim的门槛也不低。它对硬件有要求推荐RTX显卡学习曲线相对陡峭而且Isaac Sim 2023.1.0及之后的版本与ROS 2 Humble的Python版本3.10存在冲突这是个著名的坑后面我们会详细讲怎么绕过去。但权衡下来为了reBotArm项目后期在感知和智能控制上的拓展性投入时间搭建Isaac Sim环境是值得的。2. 环境搭建避开版本冲突的深坑万事开头难搭建Isaac Sim仿真环境的第一步就可能让你卡上半天。最大的拦路虎就是开头提到的“Isaac Sim 5.0 与 ROS 2 Python 版本冲突”。这里我详细拆解一下这个问题的来龙去脉和我的解决方案。2.1 冲突根源剖析Isaac Sim 2023.1.0内部版本常被称为Isaac Sim 5.0及其后续版本其内置的Python解释器是3.10。而ROS 2 Humble Hawksbill的官方支持版本是Ubuntu 22.04其默认的Python版本是3.10。看起来一致对吗问题出在Isaac Sim并非使用系统Python它自带了一个完整的Python 3.10环境并且这个环境中的一些核心库如NumPy、OpenCV的绑定是NVIDIA用特定方式编译的与通过apt或pip安装的常规库ABI不兼容。当你通过Isaac Sim提供的ros2_workspace脚本或者手动安装ros2_bridge扩展时它会尝试在Isaac Sim的内部Python环境中安装ROS 2的Python包如rclpy。这些包在编译或运行时会去寻找系统级的依赖库版本对不上就会导致导入失败、符号未找到等一堆令人头疼的错误。2.2 我的解决方案虚拟环境隔离法经过多次尝试最稳定、最干净的方案是完全隔离。不强行让Isaac Sim用系统ROS 2也不在系统环境里折腾Isaac Sim的包。具体步骤如下安装Isaac Sim从NVIDIA官网下载Isaac Sim 2023.1.0的.run安装包。我选择的是“轻量级”安装选项它不包含一些大型的AI模型资产节省磁盘空间。安装路径我设为~/isaac_sim。安装完成后务必将启动脚本的路径加入环境变量echo source ~/isaac_sim/setup_conda_env.sh ~/.bashrc source ~/.bashrc这个脚本会激活Isaac Sim自带的Conda环境。为ROS 2创建独立的Conda环境在系统层面我们依然用apt安装ROS 2 Humble。但为了与Isaac Sim解耦我们创建一个全新的Conda环境专供ROS 2开发。# 安装Miniconda (如果尚未安装) # 创建名为ros2_humble的conda环境指定python3.10 conda create -n ros2_humble python3.10 conda activate ros2_humble # 在这个干净的conda环境里安装ROS 2的Python核心包 pip install rosdep sudo rosdep init rosdep update # 注意这里我们不通过conda或pip安装完整的ROS2因为基础库还是需要系统apt安装。 # 我们只是让这个conda环境作为我们开发ROS2节点的工作环境。这个环境的用途是当你开发一个普通的、不依赖Isaac Sim的ROS 2节点比如真机控制器时在这里进行。在Isaac Sim环境中安装ROS 2 Bridge这是关键一步。我们需要在Isaac Sim自己的Python环境里安装能与它通信的ROS 2组件。# 首先启动Isaac Sim自带的Conda环境 source ~/isaac_sim/setup_conda_env.sh # 此时命令行提示符应变为 (isaac-sim) # 在这个环境下使用Isaac Sim提供的脚本安装ROS2 Bridge cd ~/isaac_sim ./python.sh -m pip install -e ./exts/omni.isaac.ros2_bridge这个命令会从Isaac Sim的扩展目录编译安装ros2_bridge。它确保了所有编译链接都在Isaac Sim的内部环境中完成避免了库冲突。验证安装启动Isaac Sim。cd ~/isaac_sim ./isaac-sim.sh在Isaac Sim的图形界面中点击顶部菜单栏的Window - Extensions。在搜索框输入“ros”你应该能看到omni.isaac.ros2_bridge这个扩展并且状态是启用的复选框被勾选。这就说明桥接器安装成功了。注意从此以后你的工作流就分成了两条线。线A在Isaac Sim环境source ~/isaac_sim/setup_conda_env.sh下运行与仿真交互的脚本或启动Isaac Sim。线B在独立的ros2_humbleConda环境下开发其他ROS 2节点。两者通过ROS 2的DDS中间件默认是Fast DDS进行网络通信这是完全没问题的。2.3 可能遇到的其它坑CUDA版本问题确保你的显卡驱动和Isaac Sim要求的CUDA版本匹配。Isaac Sim 2023.1.0通常需要CUDA 11.x。可以通过nvidia-smi查看驱动支持的CUDA最高版本。权限问题.run安装包需要执行权限有时需要chmod x。安装路径最好选择你有完全读写权限的目录不要用/opt等系统目录避免后续扩展安装麻烦。桌面环境Isaac Sim在纯命令行服务器无GUI上运行需要额外配置对于初学者强烈建议在带有桌面环境如Ubuntu Desktop的系统中操作。3. reBotArm模型导入与URDF优化实战环境搭好了接下来就是把reBotArm“搬”进仿真世界。这里核心是URDF文件。URDF是ROS里描述机器人模型的XML格式文件定义了连杆、关节、外观、碰撞体等信息。3.1 获取与检查reBotArm的URDF通常机械臂厂商会提供ROS功能包里面包含urdf或xacro文件。假设你从reBotArm的供应商那里拿到了一个reBotArm.urdf文件。第一步不是直接导入而是仔细检查。用文本编辑器打开URDF文件重点关注以下几点文件路径URDF中通过mesh filenamepackage://reBotArm_description/meshes/arm_link.stl/这样的标签引用网格文件。这里的package://是ROS的包路径。在Isaac Sim中它不认识ROS包。你需要将这些路径转换为绝对路径或者将网格文件集中放在一个Isaac Sim能访问的目录下并修改URDF中的引用。我推荐后者创建一个专门的资源文件夹比如~/isaac_sim/assets/reBotArm/把所有的.stl或.dae网格文件拷贝进去然后将URDF中的路径改为mesh filename./meshes/arm_link.stl/相对路径或绝对路径。惯性参数很多URDF为了省事惯性矩阵inertial标签设置得非常随意甚至全是零。这在仿真中是大忌会导致物理引擎计算错误机器人可能瘫软无力或行为诡异。你需要为每个连杆link估算或计算合理的质量和惯性矩。一个粗略的方法是如果网格文件是实体可以用Blender等软件计算体积乘以一个估计的密度如铝的密度2700 kg/m³得到质量软件也能估算惯性矩。至少要给一个非零的质量和一个近似的惯性矩阵。关节类型与限位检查joint标签。类型type是否正确revolute旋转关节prismatic平移关节位置和速度限位limit是否合理这些参数直接影响仿真的安全性和真实性。3.2 使用Isaac Sim的URDF导入器Isaac Sim提供了强大的URDF导入功能。在Isaac Sim主界面点击顶部菜单栏Window - USD - URDF Importer。在弹出的窗口中点击Browse选择你修改好的reBotArm.urdf文件。关键设置Fix Base Link: 一定要勾选。这会将机器人的基座固定在世界坐标系防止它掉下去。Make Instanceable: 如果场景中只需要一个机械臂可以不勾。如果计划放置多个相同的臂勾选此选项可以提升渲染性能。Import Config这里可以设置初始位姿。对于机械臂通常基座的位置position设为[0, 0, 0]朝向orientation设为[0, 0, 0, 1]四元数表示无旋转。点击Import。如果一切顺利你将在Stage场景层级窗口看到导入的机器人模型并在3D视图中看到它。3.3 常见导入失败问题排查网格文件丢失这是最常见的问题。Isaac Sim会在控制台输出红色错误信息提示找不到某个网格文件。请严格按照3.1节的方法确保URDF中的网格路径指向正确的文件。URDF语法错误XML格式错误如标签未闭合、属性值缺少引号。Isaac Sim的报错信息会指出大致行数。仔细核对。关节名称重复URDF中每个关节joint必须有唯一的name属性。重复会导致导入失败。视觉与碰撞模型分离在URDF中一个link可以包含visual用于显示和collision用于物理计算两种几何体。有时为了提升仿真性能会用简化的几何体如长方体、圆柱体作为碰撞体而用精细的网格作为视觉体。检查你的URDF如果collision标签缺失Isaac Sim会默认使用视觉网格作为碰撞体这在关节多、模型复杂时会导致物理计算非常缓慢。强烈建议为每个连杆添加简化的碰撞体。3.4 优化仿真性能简化碰撞体这是我踩过的一个大坑。最初导入的reBotArm有7个关节每个连杆的视觉网格都很精细数万个三角面。直接仿真时即使什么都不做帧率都极低。解决方案在URDF中为每个link添加简化的collision几何体。例如一个复杂的连杆其视觉网格是弯曲的异形结构。我们可以用一个或多个简单的box或cylinder来近似它的碰撞体积。link namelink_3 visual geometry mesh filename./meshes/complex_link_3.stl/ /geometry /visual collision geometry box size0.1 0.05 0.2/ /geometry origin xyz0 0 0.1 rpy0 0 0/ /collision inertial mass value1.5/ inertia ixx0.01 ixy0 ixz0 iyy0.01 iyz0 izz0.01/ /inertial /link通过这种优化我的reBotArm仿真帧率从不到10 FPS提升到了稳定的60 FPS以上物理步长也能跑得更快仿真效率大增。4. 关节控制与ROS 2通信配置模型导入了但它还是个“雕塑”。接下来要让它的关节动起来并接受来自ROS 2的控制指令。Isaac Sim提供了多种控制接口对于机械臂我们最常用的是关节位置控制和关节速度控制。4.1 在Isaac Sim中设置关节驱动器在Stage窗口选中你的reBotArm机器人USD层级根节点。在右侧的Property窗口中找到Physics部分确保Articulation Root被勾选。这告诉物理引擎这是一个多刚体关节系统。然后你需要为每个需要控制的旋转关节添加驱动器。展开机器人层级找到代表关节的节点通常以Joint结尾。选中它在Property窗口中找到Drive部分可能需要滚动。驱动类型选择Position位置控制或Velocity速度控制。对于轨迹跟踪位置控制更常用。刚度可以理解为PID控制中的P比例增益。值越大关节抵抗位置误差的“力度”越强响应越快但也更容易超调振荡。需要根据仿真调试可以从一个中等值如1e5开始尝试。阻尼相当于PID中的D微分增益。用于抑制振荡增加系统稳定性。值太小会振荡值太大会响应迟钝。通常设置为刚度值的0.1到0.5倍左右。最大力驱动器能输出的最大力/力矩。这个值要设置得合理太小了关节没力太大了不真实且可能导致数值不稳定。可以参考reBotArm电机的额定扭矩来设置。4.2 配置ROS 2控制节点Isaac Sim的ROS 2 Bridge扩展允许我们通过标准的ROS话题来控制关节。我们需要在Isaac Sim中创建一个ROS 2发布者节点来发布关节状态并创建一个订阅者节点来接收控制指令。这通常通过Python脚本完成。在Isaac Sim的脚本编辑器Window - Script Editor或外部的IDE中编写一个脚本。核心步骤如下导入必要的模块import omni.isaac.core.utils.nucleus as nucleus_utils from omni.isaac.core import World from omni.isaac.core.articulations import Articulation import omni.isaac.core.utils.stage as stage_utils # ROS2相关 import rclpy from rclpy.node import Node from sensor_msgs.msg import JointState from std_msgs.msg import Float64MultiArray创建World和加载机器人# 创建一个物理世界 world World(stage_units_in_meters1.0) # 获取当前stage中机器人的路径假设你导入后将其重命名为“reBotArm” robot_path /World/reBotArm # 将机器人实例化为Articulation对象方便控制 robot world.scene.add(Articulation(prim_pathrobot_path, namereBotArm)) # 初始化世界 world.reset()创建ROS 2节点class RebotArmController(Node): def __init__(self, robot): super().__init__(rebotarm_sim_controller) self.robot robot # 获取关节名称和索引 self.joint_names robot.dof_names # 假设URDF中关节有命名 self.num_joints len(self.joint_names) # 发布者发布当前的关节状态位置、速度、力矩 self.joint_state_pub self.create_publisher(JointState, /joint_states, 10) # 订阅者订阅目标关节位置指令 self.target_joint_sub self.create_subscription( Float64MultiArray, /rebotarm/joint_position_target, self.joint_target_callback, 10 ) # 定时器每0.01秒100Hz发布一次状态并应用控制 self.timer self.create_timer(0.01, self.update) # 初始化目标位置为当前位置 self.target_positions robot.get_joint_positions() def joint_target_callback(self, msg): # 收到新的目标位置指令 if len(msg.data) self.num_joints: self.target_positions msg.data else: self.get_logger().warn(fReceived target with wrong dimension: {len(msg.data)} vs {self.num_joints}) def update(self): # 1. 获取当前物理世界的时间 world.step(renderTrue) # 2. 应用目标位置到关节驱动器 self.robot.set_joint_position_targets(self.target_positions) # 3. 获取更新后的关节状态 current_positions self.robot.get_joint_positions() current_velocities self.robot.get_joint_velocities() # 注意获取关节力矩可能需要特定API这里用零向量示意 current_efforts [0.0] * self.num_joints # 4. 发布关节状态消息 msg JointState() msg.header.stamp self.get_clock().now().to_msg() msg.name self.joint_names msg.position current_positions.tolist() # 转换为list msg.velocity current_velocities.tolist() msg.effort current_efforts self.joint_state_pub.publish(msg)在World中运行节点# 初始化ROS2 rclpy.init() # 创建控制器节点 controller_node RebotArmController(robot) # 开始运行在Isaac Sim的仿真循环中 try: while world.is_playing(): rclpy.spin_once(controller_node, timeout_sec0.0) except KeyboardInterrupt: pass finally: controller_node.destroy_node() rclpy.shutdown()4.3 外部ROS 2节点控制仿真现在仿真中的机械臂已经订阅了/rebotarm/joint_position_target话题。你可以在另一个终端激活之前创建的ros2_humbleConda环境中运行一个简单的ROS 2节点来发送控制指令# 文件send_joint_commands.py import rclpy from rclpy.node import Node from std_msgs.msg import Float64MultiArray import numpy as np class JointCommander(Node): def __init__(self): super().__init__(joint_commander) self.publisher self.create_publisher(Float64MultiArray, /rebotarm/joint_position_target, 10) timer_period 2.0 # 每2秒发送一次新目标 self.timer self.create_timer(timer_period, self.timer_callback) self.target_index 0 # 示例一组预定义的关节角度弧度制 self.targets [ [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], # 初始位姿 [0.5, 0.2, -0.3, 0.8, 0.0, 0.5, 0.0], # 目标位姿1 [-0.3, 0.5, 0.1, -0.5, 0.2, 0.0, 0.0], # 目标位姿2 ] def timer_callback(self): msg Float64MultiArray() msg.data self.targets[self.target_index] self.publisher.publish(msg) self.get_logger().info(fPublishing target: {msg.data}) self.target_index (self.target_index 1) % len(self.targets) def main(argsNone): rclpy.init(argsargs) node JointCommander() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ __main__: main()运行这个节点你应该能看到Isaac Sim中的reBotArm开始运动依次摆出预定义的几个姿态。这就完成了从外部ROS 2网络到Isaac Sim仿真的闭环控制。5. 传感器集成与场景构建一个完整的仿真任务离不开环境和传感器。对于reBotArm最常见的传感器是摄像头用于视觉和力/力矩传感器用于力控。5.1 添加虚拟摄像头在Isaac Sim中添加一个摄像头非常直观。你可以通过UI或Python脚本完成。UI方式在Stage窗口右键点击World或某个物体选择Create - Camera。然后在Property面板中调整摄像头的位置、朝向、焦距、分辨率等参数。你还可以启用RTX Ray Tracing来获得逼真的渲染效果。Python脚本方式更灵活可集成到你的控制脚本中from omni.isaac.sensor import Camera # 在World初始化后 camera Camera( prim_path/World/reBotArm/camera, # 摄像头挂载的路径 position[0.1, 0, 0.1], # 相对于父坐标系的位置 frequency30, # 发布频率 resolution(640, 480) # 分辨率 ) world.scene.add(camera)摄像头的数据可以通过ROS 2 Bridge发布。在Isaac Sim的扩展管理器里确保omni.isaac.ros2_bridge已启用并且其设置中勾选了发布摄像头数据。通常图像会发布到类似/camera/color/image_raw和/camera/depth/image_raw的话题上。5.2 模拟力/力矩传感器Isaac Sim可以测量关节或连杆上的力和力矩。对于reBotArm我们可能关心末端执行器与环境的接触力。启用接触报告在机器人的末端连杆link的Prim属性中找到Physics - Collision部分确保Contact Report是启用的。这允许物理引擎计算该碰撞体上的接触力。通过脚本读取力数据在Python脚本中你可以订阅接触报告事件或直接查询物理引擎。# 获取末端执行器连杆的Prim end_effector_prim stage_utils.get_prim_at_path(/World/reBotArm/link_7) # 在仿真循环中 contact_report end_effector_prim.GetAttribute(physxContactReport).Get() # 解析contact_report可以获得接触点、法向力、切向力等信息 # 注意这是一个底层API使用起来较复杂。更简单的方法是使用Isaac Sim提供的Sensor API如ForceSensor但这可能需要特定的扩展或自定义。更常见的做法是如果你使用的是像Franka或UR这样的机器人模型Isaac Sim的官方扩展库中可能已经提供了对应的力传感器组件。对于reBotArm如果没有现成的你可能需要基于接触报告数据自己计算合力与力矩或者查阅Isaac Sim文档中关于ForceSensor的用法。5.3 构建仿真场景一个孤零零的机械臂没什么用。你需要为它构建一个工作场景。添加工作台和物体在Isaac Sim的Content浏览器中有大量免费的USD资产桌子、箱子、球体等。你可以直接拖拽到场景中。也可以导入自己的CAD模型支持FBX, OBJ, STEP等格式需转换为USD。设置物理属性为添加的物体设置合理的质量、摩擦系数、 restitution弹性系数。例如一个木块的质量、摩擦力和一个钢块是不同的。创建任务例如你可以设置一个简单的“抓取与放置”任务在工作台上放一个立方体编程控制reBotArm运动到立方体上方下降闭合夹爪如果模型有抬起移动到另一个位置放下。使用Reference如果你需要在场景中放置多个相同的物体比如一堆相同的螺栓使用Reference而不是Instance。Reference在USD中更节省内存因为它们是同一个Prim的引用。6. 调试、性能优化与真机迁移仿真跑起来了但可能还不完美。以下是调试和优化的一些经验。6.1 常见仿真问题与调试机械臂抖动或飞出去原因1惯性参数错误。回头检查URDF中每个连杆的inertial标签质量和惯性矩是否合理。一个快速验证方法是在Isaac Sim的Property面板中临时将机器人的Physics - Solver Position Iteration Count和Solver Velocity Iteration Count调高比如从4调到20。如果抖动减轻那基本就是物理参数或驱动器增益的问题。原因2驱动器增益刚度/阻尼不合适。刚度过高或阻尼过低都会导致振荡。尝试降低刚度增加阻尼。这是一个试错过程。原因3仿真步长太大。在Window - Physics - Settings中可以调整Step Size物理步长。默认0.01667秒60Hz。对于高速或高刚度的系统可以尝试调小如0.005秒200Hz但这会增加计算负荷。物体抓取不稳容易滑落原因接触摩擦系数设置不当。检查被抓取物体和夹爪的物理材质Physics Material。增加Static Friction和Dynamic Friction的值。在Isaac Sim中可以为Prim分配物理材质。ROS 2话题收不到或发不出检查网络配置确保Isaac Sim和外部ROS 2节点在同一个网络且能互相ping通。ROS 2默认使用DDS需要正确的组播设置。在局域网内通常没问题。如果有防火墙需要放行相关端口。检查话题名称在Isaac Sim的脚本和外部节点中使用ros2 topic list命令确认话题是否被正确发布和订阅。检查数据类型确保发布和订阅的消息类型Float64MultiArray,JointState等完全匹配。6.2 仿真性能优化简化碰撞体如前所述这是提升性能最有效的手段。降低渲染负载如果不需要高质量的视觉反馈可以在Viewport设置中降低渲染质量关闭抗锯齿、动态模糊、景深等后期效果。控制仿真规模只加载必要的资产。对于远处或不重要的物体可以降低其渲染LOD细节层次。使用Instancing对于大量重复的物体如一堆相同的零件使用USD Instancing。调整物理精度与频率在保证稳定性的前提下使用尽可能大的物理步长Step Size。减少物理求解器的迭代次数Solver Iteration Counts。6.3 从仿真到真机reBotArm的迁移仿真的最终目的是指导真机。迁移时需要注意控制器接口一致性确保仿真中使用的控制接口如/rebotarm/joint_position_target话题与真机reBotArm的ROS驱动提供的控制接口一致。如果不一致你需要编写一个简单的“接口转换节点”。单位统一仿真中通常使用国际单位制米弧度。检查真机驱动器的指令单位是否一致。动力学差异仿真模型再精确也与真机有差距。真机的电机响应、齿轮间隙、连杆形变等因素在仿真中难以完全复现。因此在仿真中调试好的控制器尤其是高增益的PID或模型预测控制器在真机上运行前必须将增益参数调低以“柔顺”模式开始逐步调高避免剧烈运动造成损坏。感知差异仿真摄像头生成的图像与真实摄像头拍摄的图像存在“域差异”。用纯仿真数据训练的视觉模型在真机上性能会下降。解决方案包括使用域随机化在仿真中随机化纹理、光照、背景、使用域适应技术或者采用真实与仿真混合的数据集进行训练。安全第一首次在真机上运行仿真验证过的程序时务必有人工急停开关在旁并且让机械臂从低速、小范围运动开始。仿真世界可以随时重置真实世界可没有“撤销”按钮。通过以上六个步骤你基本上就完成了reBotArm在Isaac Sim中的仿真环境搭建、模型导入、控制集成、场景构建和调试优化。这个过程虽然繁琐但一旦打通你就拥有了一个强大的、可重复的、安全的机器人算法开发和测试平台。无论是研究新的运动规划算法还是训练AI视觉模型都可以在这个虚拟环境中大胆尝试反复迭代最终将成熟的方案部署到真实的reBotArm上大大降低了研发成本和风险。