☰
Webots R2021b 版本技术解析:强化学习 API、WREN 网页渲染与电机关节新特性
2026/10/4 1:52:20 网站建设 项目流程
  • 科研
  • 自动驾驶
  • 物理引擎

【免费下载链接】webots

Webots Robot Simulator

项目地址:https://gitcode.com/gh_mirrors/web/webots
点击查看免费下载

导读

本文基于 Webots R2021b(2021 年 7 月 16 日发布)的官方版本说明,系统梳理这一版本的核心技术变更:面向强化学习场景新增的 Supervisor 状态保存/恢复 API 与 OpenAI Gym 集成示例、通过在线资源缓存将安装包体积缩减 70% 以上的新 URL 资源系统、将自研渲染器 WREN 移植到 WebAssembly 的全新 Web 仿真界面、支持多指夹爪等场景的耦合电机与带间隙关节 PROTO,以及新增的机器人模型、传感器与 ROS 2 集成进展。读完本文,你将掌握 R2021b 关键新特性的设计动机、API 用法与仓库内的可验证实现证据。完整的逐条变更清单请参见 Webots R2021 ChangeLog。


版本概览:R2021b 的六条主线

R2021b 的改进集中在六个方向:强化学习实验支持、安装包瘦身、Web 端渲染引擎重写、电机与关节功能扩展、机器人模型库扩充、ROS 2/ROS 1 生态集成。下面逐一展开,每条主线都结合当前仓库的源码与示例给出实现层面的印证。


面向强化学习场景的 Supervisor 新 API

强化学习实验最繁琐的一环是 episode 重置(reset)与状态复制。R2021b 为此新增了四个 Supervisor API,全部声明在 include/controller/c/webots/supervisor.h 中:

void wb_supervisor_node_save_state(WbNodeRef node, const char *state_name); void wb_supervisor_node_load_state(WbNodeRef node, const char *state_name); void wb_supervisor_node_set_joint_position(WbNodeRef node, double position, int index); const char *wb_supervisor_node_export_string(WbNodeRef node);

节点状态的保存与恢复(save_state / load_state)

wb_supervisor_node_save_state会保存指定节点及其所有后裔节点的完整仿真状态(位置、姿态、速度、关节状态、物理属性等),并关联一个字符串标识state_name;之后调用wb_supervisor_node_load_state即可在任意时刻将这部分场景"回退"到已保存的状态。这比传统做法——删除整棵子树再重建——要轻量得多,也更适合在多智能体 RL 场景中对单个机器人(而非整个世界)做部分重置。

官方 ChangeLog 对此的表述是 "allow partial world reverting to a saved state",即"允许将世界部分回退到已保存状态"。从设计意图看,这是为 RL 训练循环中"每个 episode 结束即恢复初始构型"的典型需求准备的。

节点定义的字符串导出(export_string)

wb_supervisor_node_export_string返回一个可用来重新构造该节点的字符串表示。典型用途是:训练中需要按概率复制若干同类实体(例如随机摆放多个障碍物或生成多个相同机器人),先取一次定义字符串,之后按需实例化,避免重复查询 DEF 名称与字段。

主动/被动关节的人工位置设定(set_joint_position)

wb_supervisor_node_set_joint_position允许不通过电机(Motor)指令,直接、立即地设定主动关节与被动关节(passive joint)的位置。index参数用于指定多自由度关节(如 Hinge2Joint)中的对应轴。这对 RL 非常实用:训练中直接"搬动"机械臂到期望位形,无需等待电机 PID 收敛,从而显著加速 reset 与数据采集。

配套的 OpenAI Gym 集成示例

仓库中新增了 OpenAI Gym 集成示例,位于 projects/samples/howto/openai_gym/,其中 openai_gym.py 演示了将 Webots 仿真封装为 Gym 环境接口(action/observation/reward/reset 循环)的典型写法,配合 openai_gym.wbt 世界文件可直接运行,可作为自建 RL 训练框架的起点模板。


安装包体积优化与新 URL 资源系统

思路:资源按需下载 + 本地缓存

R2021b 从安装包中移除了纹理(textures)、网格(meshes)和声音(sounds)等静态资源。这些资源不再随安装包分发,而是在仿真加载到对应url字段时从网络下载,并缓存在本地供后续复用。官方同时移除了离线文档等冗余内容,最终安装包体积大幅缩减:

OSR2021a 包体积R2021b 包体积
Windows1.65 GB448 MB
Linux1.45 GB263 MB
macOS1.42 GB226 MB

Windows 包从 1.65 GB 降到 448 MB,Linux 从 1.45 GB 降到 263 MB,macOS 从 1.42 GB 降到 226 MB——缩减幅度超过 70%。对在服务器、容器或 CI 中频繁部署 Webots 的强化学习流水线而言,这是非常可观的收益。

支持 http/https 下载的 URL 字段

按官方 ChangeLog,以下节点的 URL 字段在 R2021b 起支持http://与https://协议下载并缓存:

  • Background(天空盒)
  • Camera(背景图)
  • ContactProperties(接触纹理)
  • ImageTexture(贴图)
  • Mesh(网格文件)
  • Motor(自定义电机特性曲线等)

旧世界文件迁移提示:R2021a 及更早版本的世界文件中,纹理/网格往往引用本地相对路径。升级到 R2021b 后需要将这些本地 URL 更新为指向在线资源(官方给出的示例是把textures/carpet.jpg这类路径改写为指向 Webots 仓库 R2021b 标签的完整资源地址),否则对应资源可能无法加载。


新 Web 渲染引擎:将 WREN 移植到 WebAssembly

Webots 的 Web 界面(流式仿真、动画回放)此前使用独立的渲染管线,长期存在一个问题:网页端与桌面端的阴影、光照参数难以完全一致,导致同一场景在两个端看起来"不一样"。

R2021b 的解决方案是釜底抽薪——把 Webots 桌面端自研的 3D 渲染器WREN(Webots Renderer ENgine,源码位于 src/wren/)整体编译为 WebAssembly,并直接用于 Web 仿真界面。这样一来,网页端与桌面端共享同一套渲染代码,光照、阴影与材质效果天然一致,可以"straightforward"地在 Web 上运行高质量仿真与动画。官方同时趁此次改造刷新了 Web 界面的图形用户界面(GUI)。

对使用者而言,这意味着:通过 Web 分享、演示或远程运行仿真时,渲染结果与本地桌面版高度一致,不再需要为网页端单独调参。


电机与关节功能扩展

耦合电机(Coupled Motors)

R2021b 为 Motor 节点 增加了耦合电机支持:在name字段中通过::分隔符指定与之逻辑关联的另一个电机,并用新增的multiplier字段设定两者之间的传动比率。

在源码 src/webots/nodes/WbMotor.cpp 中可以找到这条实现的直接证据:

  • 第 76 行mMultiplier = findSFDouble("multiplier");解析multiplier字段;
  • 第 217–223 行通过电机名字中的::分隔符解析并建立mCoupledMotors列表,且保持耦合关系的对称性;
  • 第 357–397 行在计算目标位置、目标速度与力/力矩时统一乘以multiplier(),保证主从电机按比例联动;
  • 第 548–601 行还跨耦合电机校验最小/最大位置与最大速度的一致性约束。
# 耦合电机的典型字段用法(示意) Motor { name "left_finger::right_finger" # "::" 指定关联电机 multiplier 1 # 传动比率(不可为 0,默认 1) }

这项功能特别适合简化多指夹爪(multi-fingered grippers)等需要多个关节同步驱动的机构——不再需要在控制器里手动同步多个电机的位置/速度指令。

带间隙关节:HingeJointWithBacklash / Hinge2JointWithBacklash

机械传动中的"间隙"(backlash)对真实机器人精度影响显著,R2021b 为此新增两个 PROTO 节点:HingeJointWithBacklash与Hinge2JointWithBacklash,分别扩展 HingeJoint 与 Hinge2Joint,用于在铰链中方便地加入间隙效应。

以 projects/joints/protos/HingeJointWithBacklash.proto 为例,其关键字段与实现机制如下:

  • backlash(默认 0.01):定义齿轮间隙大小,取值范围 [0, ∞);
  • gearMass(默认 0.1):定义模拟间隙的齿轮质量;
  • device/outputSensor/startPoint/endPoint:与普通关节一致,用于挂载电机、位置传感器、起点与终点。

实现上,该 PROTO 在backlash > 0时会在endPoint前插入一个"虚拟齿轮实体"(带物理属性Physics的 Solid),并在其内部嵌套一个微型 HingeJoint,通过将minStop/maxStop设为±backlash/2、stopERP设为 0,让末端在间隙范围内"自由游走",从而在物理层面还原真实的空行程效应。若backlash为 0,则直接退化为普通 HingeJoint。官方同时提供了对应的示例世界(见 ChangeLog 的 #2786、#2850 PR)。

通用 Gear 齿轮 PROTO

R2021b 新增了通用GearPROTO,用于模拟基于碰撞的传动机构(collision-based transmission)。其实现位于 projects/objects/gear/protos/Gear.proto,是一个使用 JavaScript 模板语言(template language: javascript)程序化生成几何的 PROTO:

  • teeth(默认 8):齿数,取值 [8, ∞),低于 8 会自动回退默认值;
  • width(默认 0.01):齿轮厚度;
  • innerRadius(默认 0.01):中心孔半径;
  • pitchRadius(默认 0.04):齿节圆半径;
  • toothDepth(默认 0.01):齿深;
  • density(默认 0.001):齿轮密度,为 0 时禁用物理;
  • bodyBoundingObject/teethBoundingObject:是否启用齿轮主体圆柱碰撞体、是否在每个齿上生成球形/胶囊碰撞接触点。

模板内部按齿数循环计算顶点坐标并生成 IndexedFaceSet 网格,同时在teethBoundingObject开启时于每个齿尖生成球/胶囊碰撞体,用于齿间啮合的碰撞式传动仿真。


新增机器人模型

R2021b 在 projects/robots/ 下新增了多款机器人模型,对应世界文件均可直接打开运行。

模块化移动平台:Summit-XL Steel、MiR100、Fabtino

新增三款用于物流与室内运输场景的模块化移动平台机器人:

  • Robotnik Summit-XL Steel:summit_xl_steel.wbt
  • Mobile Industrial Robots MiR100:mir100.wbt
  • REC Fabtino:fabtino.wbt

三款模型都预定义了用于安装附加设备的挂载位点(mounting points),并预留了前/后激光雷达(lidar)位,方便用户直接在其上扩展传感器与执行器。

Niryo Ned 六轴协作机械臂

Niryo Ned 是一款面向工业环境中编程教学的 6 轴协作机器人(collaborative robot),其模型适合用于 ROS 与机械臂运动学/逆运动学教学实验。

NVIDIA JetBot 与 Jetson Nano 板卡

NVIDIA JetBot 是基于 NVIDIA Jetson Nano 开发板的低成本双轮机器人,广泛用于 AI 机器人应用(如目标跟随、避障等)。除整机模型外,R2021b 还单独提供了 NVIDIA Jetson Nano 板卡的独立模型,方便用户将其嵌入自建机器人。


新增传感器:SICK S300 激光雷达与 Altimeter 高度计

SICK S300 激光雷达模型

R2021b 在传感器库中新增了SICK S300激光雷达(lidar)模型,相关设备模型位于 projects/devices/sick/(该目录同时维护多个 SICK 系列激光雷达的 PROTO 与配套文档)。S300 是工业安全/导航领域常用的二维激光扫描仪,可满足室内移动机器人建图与导航仿真需求。

社区贡献的 Altimeter 高度计

感谢社区贡献者 sishamilton,R2021b 提供了全新的Altimeter传感器,用于获取机器人或机器人部件相对地面的全局高度(altitude)。其完整 API 与字段说明见 Altimeter 节点参考文档,官方示例用法见 示例设备列表中的 Altimeter 小节。该传感器与 GPS 配合,可以方便地构建三维位置感知系统。


ROS 2 与 ROS 1 集成进展

ROS 2:16 个 Webots 包,兼容 Foxy / Galactic / Rolling

R2021b 持续完善 ROS 2 支持,官方 Webots 包(webots_ros2)数量达到 16 个,且本版本完全兼容 ROS 2 当前的两个最新发行版(Foxy Fitzroy、Galactic Geochelone)以及滚动版本(Rolling Ridley)。本版本重点新增了四个包:

  • webots_ros2_tesla:演示 Webots 与 ROS 2 的汽车仿真。特斯拉 Model 3 车辆通过简单的 OpenCV 图像处理实现车道跟随;
  • webots_ros2_mavic:演示 Webots 与 ROS 2 的无人机仿真。DJI Mavic 2 PRO 无人机使用简单的 PD 控制器跟随给定的geometry_msgs/Twist速度指令;
  • webots_ros2_driver:全新的 Webots ROS 2 接口核心,面向性能设计,支持通过 C++ 插件扩展,并可通过 URDF 文件进行便捷配置;
  • webots_ros2_control:集成ros2_control控制框架的插件,已在webots_ros2_turtlebot包中落地。

ROS 1:ros_control 集成与更简单的传感器启用

R2021b 也没有冷落 ROS 1:一方面将ros_control框架集成进来(通过--use-ros-control启动参数激活,即可直接使用diff_drive_controller、joint_state_controller等标准控制器);另一方面,传感器不再需要通过 service 手动启用——配合--auto-publish参数,所有设备会在启动时自动启用并创建对应 topic。此外还新增了--robot-description参数暴露robot_description(内含机器人 URDF),使 Webots 更容易嵌入 ROS 1 应用。官方同时提供了一个集成 SLAM(gmapping)与 MoveIt 的 Tiago 演示示例。


其他亮点:Billboard 节点与 JavaScript 程序化 PROTO

  • Billboard 节点:新增 Billboard 节点,其子节点会自动平移/旋转以始终面向视点(viewpoint)。在场景中放置方向指示牌、标签或"始终面向用户"的辅助信息非常实用,其含义可类比三维场景中"永远面向相机"的公告板。
  • JavaScript 程序化 PROTO:程序化 PROTO(Procedural PROTO)此前仅支持 LUA 脚本,R2021b 起新增 JavaScript 支持,用法见 JavaScript 程序化 PROTO 文档。上文提到的GearPROTO 正是用 JavaScript 模板语言实现的典型示例——脚本在解析阶段动态生成几何节点,让"一个参数化齿轮 PROTO 生成任意齿数齿轮"成为可能。
  • 其他值得一提的底层改进(详见 ChangeLog):仿真重置(simulation reset)相关的一批 Bug 修复与同步逻辑优化(对 RL 训练稳定性至关重要);wb_camera_get_image等图像读取函数性能显著提升;Supervisor 新增按节点检索全部字段、绝对/相对位姿获取等函数;WorldInfo新增dragForceScale/dragTorqueScale字段等。

小结

Webots R2021b 是一版"面向 AI 训练与 Web 协作"的里程碑式更新:Supervisor 状态保存/恢复与关节人工设定 API 直击强化学习实验的 reset 痛点;在线资源缓存把安装包压缩到几百 MB 级别,显著降低服务器/容器部署成本;WREN 渲染器移植 WebAssembly 让 Web 端与桌面端渲染质量首次对齐;耦合电机、带间隙关节与齿轮 PROTO 则让机构级仿真更接近真实机械。结合本文给出的仓库源码与示例路径,读者可以直接在 projects/samples/howto/openai_gym/、projects/robots/ 与 projects/joints/protos/ 等处动手验证这些新特性,并以此为起点构建自己的仿真实验。

  • 科研
  • 自动驾驶
  • 物理引擎

【免费下载链接】webots

Webots Robot Simulator

项目地址:https://gitcode.com/gh_mirrors/web/webots
点击查看免费下载
上一篇:CANN opbase 算子错误码 EZ0021(Invalid Argument Tensor Dtype)深度解析:多参数数据类型不一致的定位与排查
下一篇:npx vs npm run:深度对比与最佳实践指南

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询