- 科研
- 自动驾驶
- 物理引擎
【免费下载链接】webots
Webots Robot Simulator
本文以 Webots 开源仓库中 projects/robots/clearpath/pr2 目录下的 Pr2 PROTO 及其配套示例为核心,完整讲解这台履带式(四向轮)移动操作机器人在 Webots 中的建模方式、PROTO 接口字段、传感器配置,以及官方示例pr2_demo控制器如何实现"从一张桌子抓取饼干盒放到另一张桌子"的完整搬运流程。读完本文,你将能够独立理解并复用Pr2PROTO、在自有场景中通过baseSlot扩展机器人,并基于位置传感器与力反馈编写自己的移动操作控制逻辑。
PR2 是什么:移动操作平台的典型代表
PR2 是移动操作(mobile manipulation)领域的经典研究平台,在 Webots 仓库中被描述为:
The ClearPath's PR2 robot is a mobile manipulation platform. The robot is mounted on four directional wheels, had two articulated arms with grippers, an articulated body and head. It is mounted by several sensors including cameras.
这段话概括了 PR2 的四项核心特征:
- 移动底盘:四个全向(可转向)脚轮(caster wheels),每个脚轮包含转向自由度与两组驱动轮,可原地旋转与任意方向平移;
- 双臂操作:左右两条 7 自由度机械臂(肩部 pan/lift、上臂 roll、肘部 lift、前臂 roll、腕部 flex/roll),末端各带两指夹爪(gripper);
- 可动躯干与头部:躯干可沿垂直方向升降(torso lift),头部具备 pan/tilt 两个自由度;
- 多传感器:多组摄像头(头部高清相机、双目立体相机、前臂相机)与两组激光雷达(基座
base_laser与可倾斜laser_tilt)。
原文档还提供了一段演示视频(Lm0FhXAxkXg),展示 PR2 在 Webots 中的实际运行效果;本仓库内则以截图 pr2.wbt.png 记录该示例世界的运行画面。
Pr2 PROTO:接口定义与字段说明
Pr2是一个派生自 Webots 核心节点 Robot 的 PROTO 节点,定义位于 Pr2.proto(文件头部注释同时注明其网格数据源自pr2.urdf,即由真实 URDF 模型转换而来)。其完整字段定义如下:
Pr2 { SFVec3f translation 0 0 0 SFRotation rotation 0 0 1 0 SFString name "PR2" SFString controller "pr2_demo" MFString controllerArgs [] SFString customData "" SFBool supervisor FALSE SFBool synchronization TRUE SFBool selfCollision FALSE MFNode baseSlot [] }每个字段都通过IS语句与内部Robot节点的对应字段相连(见 Pr2.proto),其语义与 Robot 节点字段 一致:
| 字段 | 默认值 | 说明 |
|---|---|---|
translation | 0 0 0 | 机器人在地图中的位置,对应Pose.translation |
rotation | 0 0 1 0 | 机器人的朝向,对应Pose.rotation |
name | "PR2" | 实例名称,对应Solid.name,在场景树与控制器中以此引用 |
controller | "pr2_demo" | 控制器程序名,位于当前项目controllers子目录下;若设为<none>则不运行任何控制器,设为<extern>则可由外部控制器驱动 |
controllerArgs | [] | 传给控制器程序的命令行参数列表,每个 MFString 项作为一个独立参数 |
customData | "" | 任意用户数据,控制器可用wb_robot_get_custom_data/wb_robot_set_custom_data读写 |
supervisor | FALSE | 置为TRUE时机器人获得 Supervisor 能力,可操控场景节点 |
synchronization | TRUE | 为TRUE时仿真与控制器同步(控制器每次wb_robot_step推进一个仿真步);为FALSE时仿真以最快速度运行、不等控制器 |
selfCollision | FALSE | 置为TRUE时启用机器人自身部件间的碰撞检测,防止肢体互相穿模(需各 Solid 带 Physics 节点) |
baseSlot | [] | 在机器人基座槽位(base_footprint处)扩展任意节点,例如挂载自定义传感器、工具或负载 |
其中与本文仿真主题最相关的是baseSlot——原文档特别强调:baseSlot:Extends the robot with new nodes in the base slot.在 PROTO 内部,它被直接插入到机器人根 Solid 的 children 中:
Group { children IS baseSlot }这意味着你可以在实例化Pr2时通过baseSlot [ ... ]挂载任意节点(如附加相机、机械臂末端工具、搬运负载),无需修改 PROTO 本体。
PROTO 内部结构:从 URDF 到 Webots 的源码级还原
Pr2.proto全文约 3114 行,内部以嵌套Solid/HingeJoint/SliderJoint树完整还原了 PR2 的运动学与动力学。梳理其结构如下:
底盘与四脚轮(base / caster wheels)
根节点为base_footprintSolid(质量 1.0 kg),其下挂载base_link(质量 116.0 kg,接触材质pr2_material,boundingObject 由 7 个 Box 组成),并在 Pr2.proto 中定义四个脚轮:
- 四个转向关节
fl/fr/bl/br_caster_rotation_joint(HingeJoint,z 轴旋转,电机maxVelocity 10.0、maxTorque 16.5); - 每个脚轮再含左右两个驱动轮关节
*_caster_l/r_wheel_joint(HingeJoint,y 轴旋转,电机maxVelocity 15.0、maxTorque 7.0,轮半径 0.08 m)。
控制器中对应的运动学常量(见 pr2_demo.c):
#define MAX_WHEEL_SPEED 3.0 // maximum velocity for the wheels [rad / s] #define WHEELS_DISTANCE 0.4492 // distance between 2 caster wheels (the four wheels are located in square) [m] #define SUB_WHEELS_DISTANCE 0.098 // distance between 2 sub wheels of a caster wheel [m] #define WHEEL_RADIUS 0.08 // wheel radius躯干升降与 IMU
torso_lift_joint为 SliderJoint(z 轴直线运动),由LinearMotor驱动:maxVelocity 0.1、maxPosition 0.33、maxForce 10000.0(Pr2.proto)。躯干上还挂载了imu_sensor(InertialUnit),供姿态估计使用。
头部与感知系统
头部由head_pan_joint(z 轴旋转)与head_tilt_joint(y 轴旋转)两个 HingeJoint 构成。头部承载的传感器包括:
| 设备名 | 类型 | 关键参数 |
|---|---|---|
high_def_sensor | Camera | 1224×1025,FOV 0.785 rad |
wide_stereo_l_stereo_camera_sensor | Camera | 640×480,FOV 1.571 rad |
wide_stereo_r_stereo_camera_sensor | Camera | 640×480,FOV 1.571 rad |
laser_tilt | Lidar | 圆柱投影,FOV 2.78 rad,640×1 分辨率,maxRange 10 m |
base_laser | Lidar | 圆柱投影,FOV 4.54 rad,640×1 分辨率,maxRange 10 m |
其中base_laser位于基座前端(base_laser_link,见 Pr2.proto),laser_tilt位于头部上方可倾斜支架(laser_tilt_mount_joint,Pr2.proto),用于对前方地面与货架进行 3D 扫描。
双臂与夹爪
左右两臂结构对称,从l/r_shoulder_pan_joint开始逐级串联。以右臂为例(Pr2.proto),其关节链为:
r_shoulder_pan_joint → r_shoulder_lift_joint → r_upper_arm_roll_joint → r_elbow_flex_joint → r_forearm_roll_joint → r_wrist_flex_joint → r_wrist_roll_joint → r_gripper_*(两指夹爪)各关节的RotationalMotor均配置了真实电机参数,例如:
r_shoulder_lift_joint:maxVelocity 2.082、maxTorque 85.0、行程[-0.5236, 1.3963];r_elbow_flex_joint:controlPID 10 0.1 0.2、maxVelocity 3.3、maxTorque 55.0;r_wrist_roll_joint:controlPID 18 0.01 11、maxTorque 10.0。
夹爪部分采用"电机 + 位置传感器 + 触觉传感器"组合:r_finger_gripper_motor::l_finger/::r_finger(RotationalMotor,maxPosition 0.548、maxTorque 1000.0)驱动两根手指,而每根手指指尖的 Solid 直接定义成了TouchSensor(type "bumper",见 Pr2.proto),分别是l/r_gripper_l/r_finger_tip_contact_sensor。这些触觉传感器正是示例控制器实现"抓牢物体即停"力反馈闭环的关键。
此外夹爪处还定义了r_gripper_led(LED)、r_gripper_motor_accelerometer(Accelerometer)以及r_gripper_tool_frame(工具坐标系,用于后续挂接末端工具)。
视觉与物理外观
所有外观均使用PBRAppearance(metalness 0、roughness 0.5)配合ImageTexture贴图与Mesh网格,贴图与网格分别位于 textures 与 meshes 目录;每个运动部件都配有简化的boundingObject(Box / Cylinder / IndexedFaceSet 组合),用于物理碰撞计算。整个模型以pr2_material作为统一接触材质,世界文件中通过ContactProperties为该材质设置了softCFM 1e-05以软化接触。
示例世界:pr2.wbt 场景布置
示例世界 pr2.wbt 展示了 PR2 的典型应用场景——从一张桌子抓取饼干盒,搬运并放到另一张桌子上。世界文件头部信息明确说明:
"Willow Garage PR2 robot. The robot model includes 44 actuated joints, 6 cameras and 2 laser-scanners."
场景构成(pr2.wbt):
WorldInfo:basicTimeStep 16,并为pr2_material配置softCFM 1e-05接触属性;Viewpoint:设置了follow "PR2",使视角始终跟随机器人;- 环境:
TexturedBackground+TexturedBackgroundLight+ 木地板Floor(Parquetry外观); - 物体:两张
Table(分别位于 x=1.5 与 x=-1.5)、一罐Can与一盒BiscuitBox(早餐饼干盒,来自 kitchen/breakfast)。
Table { translation 1.5 0 0 } # 放饼干盒的桌子 Table { translation -1.5 0 0 ... name "table 2" } Can { translation 1.25 -0.19 0.805 } BiscuitBox { translation 1.27 0.21 0.86 }需要说明:原文档将该世界描述为 "grabbing biscuit boxes from one table, and putting them on another table",即从一张桌子抓取饼干盒并放到另一张桌子;当前世界文件中初始只有一盒 BiscuitBox,控制器通过循环搬运让该盒子在两桌间往返(下文详述)。
示例控制器:pr2_demo.c 的抓取搬运逻辑
控制器源码位于 pr2_demo.c,约 475 行,是理解"如何用 Webots C API 驱动 PR2"的最佳教材。其设计与实现要点如下:
设备枚举与初始化
控制器用wb_robot_get_device按 PROTO 中定义的名称取到全部设备句柄(pr2_demo.c):
- 8 个轮子电机 + 8 个位置传感器;
- 4 个脚轮转向电机 + 4 个位置传感器;
- 左右臂各 5 个关节电机(shoulder roll/lift、upper arm roll、elbow lift、wrist roll)+ 传感器;
- 两个夹爪手指电机
l/r_finger_gripper_motor::l_finger; - 躯干电机
torso_lift_joint; - 4 个指尖触觉传感器、IMU、5 路摄像头与 2 路激光雷达(后 7 项在
enable_devices中被注释掉,即本示例未启用,见 pr2_demo.c)。
仿真步长固定为TIME_STEP 16(与世界的basicTimeStep一致)。
位置式(位置控制)运动原语
控制器将机器人的复杂运动抽象为四个高层函数,全部基于位置传感器反馈实现闭环:
robot_go_forward(distance):以MAX_WHEEL_SPEED驱动 8 个轮子,通过fl_caster_l_wheel_joint的位置传感器累计轮子转角、乘以WHEEL_RADIUS得到实际行驶距离,达到目标前 2.5 cm 时减速至 10% 速度(pr2_demo.c);robot_rotate(angle):先将四个脚轮转向到 45° 对角姿态(3π/4, π/4, -3π/4, -π/4),再以期望行驶弧长angle * 0.5 * (WHEELS_DISTANCE + SUB_WHEELS_DISTANCE)作为轮子行程目标完成原地旋转(pr2_demo.c);set_rotation_wheels_angles(...):设置四个脚轮转向角,并通过位置传感器循环等待到位;转向期间通过enable_passive_wheels(true)临时把 8 个轮子的可用力矩置零,避免轮子打滑干扰转向(pr2_demo.c)。
力反馈式夹爪控制
set_gripper(left, open, torqueWhenGripping, wait_on_feedback)是本文最值得研究的函数(pr2_demo.c):
- 打开时,将手指电机位置设为
0.5并等待到位; - 闭合时,将位置设为
0.0,然后循环检测两个指尖TouchSensor是否被触发——只要任一手指触碰到物体,立即停止,并把电机力矩降到torqueWhenGripping、位置回退到当前值的 95%,实现"夹住但不压碎"的恒力矩抓取。
这种"位置环 + 触觉反馈 + 力矩限制"的组合正是机器人抓取任务的工程化范本。
主循环:搬运任务编排
main函数(pr2_demo.c)先让双臂就位、躯干升到 0.2 m、前进 0.35 m 接近第一张桌子,然后进入无限循环:
- 左右夹爪以 20.0 力矩闭合,抓取饼干盒;
- 双臂抬起(elbow lift 从 -0.5 到 -1.0),将盒子提离桌面;
- 后退 0.35 m,原地旋转 180°,再前进 0.35 m 到达第二张桌子;
- 双臂放下、打开夹爪,放下饼干盒;
- 回到步骤 1,重复搬运,使盒子在两桌之间循环。
该循环与示例世界Viewpoint的follow "PR2"配合,可直观看到完整的"移动—抓取—搬运—放置"过程。
编译与运行
PR2 示例采用 Webots 标准 Makefile 体系,控制器构建文件为 controllers/pr2_demo/Makefile,其中仅包含 Webots 全局的Makefile.include,无需额外配置。运行方式:
- 启动 Webots,打开 worlds/pr2.wbt;
- 点击运行按钮,
Pr2节点默认的controller "pr2_demo"会自动加载并编译pr2_demo.c; - 若修改了控制器源码,可在
controllers/pr2_demo目录下执行make重新构建。
如果你要把 PR2 放入自己的项目,只需在场景中通过EXTERNPROTO引入 Pr2 PROTO 并实例化,例如:
EXTERNPROTO "webots://projects/robots/clearpath/pr2/protos/Pr2.proto" Pr2 { translation 0 0 0 rotation 0 0 1 0 name "PR2" controller "pr2_demo" baseSlot [ # 在这里挂载自定义节点,如附加相机、传感器或负载 ] }原文档将示例世界入口指向 worlds 目录,其中唯一的pr2.wbt即上述场景;PROTO 的图标(Pr2.png)位于 protos/icons,可用于场景树与节点库中的展示。
小结:从 PROTO 到仿真的完整链路
通过本文可以完整看到 Webots 中"真实机器人 → 仿真模型 → 控制算法"的落地路径:
- 建模层:Pr2.proto 从
pr2.urdf转换而来,用 Solid/Joint 树保留了 44 个关节、6 路相机与 2 路激光雷达的完整运动学与动力学参数,并通过baseSlot提供扩展口; - 场景层:pr2.wbt 用一张桌子、一盒饼干搭建了可复现的抓取搬运环境,并配置
follow "PR2"视角与接触参数; - 控制层:pr2_demo.c 以位置传感器闭环驱动行走/转向、以触觉传感器 + 力矩限制实现可靠抓取,演示了移动操作任务的基本控制范式。
无论是希望复用 PR2 模型做移动操作研究,还是想学习如何在 Webots 中构建"多关节机械臂 + 移动底盘 + 力感知夹爪"的完整仿真体系,这个目录都是可以直接上手的参考实现。
- 科研
- 自动驾驶
- 物理引擎
【免费下载链接】webots
Webots Robot Simulator
相关推荐
Webots 机器人仿真器入门指南:开源移动机器人仿真平台概述
Webots 机器人仿真器入门指南:开源移动机器人仿真平台概述 Webots 是一款开源的三维移动机器人仿真软件,本指南( 前言原文 https://link.
科研自动驾驶物理引擎Webots 与 SUMO 联合仿真接口详解:基于 SumoInterface PROTO 构建大规模实时交通流仿真
Webots 与 SUMO 联合仿真接口详解:基于 SumoInterface PROTO 构建大规模实时交通流仿真 Webots 的 SUMO Interfa
科研自动驾驶物理引擎Webots 仿真 SICK LD-MRS 多线激光雷达:SickLdMrs PROTO 参数全解析与点云实战
Webots 仿真 SICK LD MRS 多线激光雷达:SickLdMrs PROTO 参数全解析与点云实战 导读 本文围绕 Webots 开源机器人仿真器中
科研自动驾驶物理引擎
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考