科研自动驾驶物理引擎【免费下载链接】webotsWebots Robot Simulator项目地址https://gitcode.com/gh_mirrors/web/webots点击查看免费下载Webots 节点图Node Chart是理解 Webots 场景.wbt 世界文件内部结构的一站式索引它用一张继承关系图把构建仿真世界所需的全部节点从几何体、刚体到各类传感器与执行器设备组织成清晰的类层次。本文以 node-chart.md 为主体逐项讲解图表的图例语义继承箭头、抽象节点虚线框、Bounding Object 绿色背景并结合仓库源码中的 C 类继承关系src/webots/nodes/*.hpp与节点类型枚举nodes.h验证每一层继承的真实性。读完本文你将能够熟练阅读节点图、准确判断任意节点可插入的位置、知道哪些几何节点可作为boundingObject参与碰撞检测并理解为什么某些节点无法直接实例化。什么是 Webots 节点图Webots 节点图勾勒了构建 Webots 世界时所有可用节点的全貌。它本质上是一张节点族谱每个盒子代表一个节点类型盒子之间的箭头代表继承inheritance关系。通过这张图你可以快速回答三类问题某个节点如 Solid从哪些基节点继承了字段与 API哪些节点是抽象节点、不能被直接实例化如 Device哪些节点可以作为 Solid 节点的boundingObject参与碰撞检测节点图的完整说明位于 docs/reference/node-chart.md每个节点的字段与 API 详解则收录于 Nodes and API functions 一章。如何阅读继承箭头在节点图中两个节点之间的箭头代表继承关系。箭头从基节点arrow tail箭尾指向派生节点arrow head箭头派生节点箭头端继承基节点箭尾端的全部字段与 API 函数。例如Solid 节点继承自 Pose 节点因此 Pose 中可用的全部字段和函数如translation、rotation、translationStep、rotationStep在 Solid 节点中同样可用。这一语义在文档中可以直接得到印证pose.md 开篇即标注 Derived from Group 并列出 Direct derived nodes: Solid, Transform, Fluidsolid.md 则标注 Derived from Pose 并列出全部直接派生节点含 Robot、Track、Charger 及所有 Solid 设备。换句话说继承是传递的Robot继承了Solid的字段也就继承了Pose的translation/rotation进而继承了Group的children字段——这正是节点图能作为单点入口索引全部节点的原因。抽象节点虚线框的含义图中用虚线框dashed line绘制的盒子如 Light、Device 或Geometry代表抽象节点abstract nodes抽象节点无法被实例化——既不能在场景树Scene Tree中创建也不能在 .wbt 世界文件中直接书写。抽象节点的价值在于分组它把一组派生节点共享的公共字段与公共函数集中定义在基类中从而避免重复。例如 Device 是一个抽象节点其文档device.md明确指出 This abstract node (that cannot be instantiated) represents a robot device (actuator and/or sensor)并定义了三个被所有设备继承的 APIwb_device_get_model、wb_device_get_name、wb_device_get_node_type。从源码看Webots 内部同样以抽象 C 基类实现这些节点。以下抽象节点的源码继承关系均可直接在src/webots/nodes/目录验证节点图中的抽象节点对应 C 基类源码文件GeometryWbGeometry : public WbBaseNodeWbGeometry.hppDeviceWbDevice被WbSolidDevice、WbLogicalDevice多重继承WbDevice.hppJointDeviceWbJointDevice : public WbLogicalDeviceWbJointDevice.hppSolidDeviceWbSolidDevice : public WbDevice, public WbSolidWbSolidDevice.hppMotorWbMotor : public WbJointDeviceWbMotor.hppLightWbLight : public WbBaseNodeWbLight.hppJointWbJoint : public WbBasicJointWbJoint.hpp值得注意的是WbSolidDevice同时继承WbDevice与WbSolid这与图中 Solid -- SolidDevice 的箭头完全对应——Solid 设备如相机、距离传感器既是设备也是具有物理属性的刚体因此天然继承了Solid的boundingObject、physics、contactMaterial等字段。Bounding Object 节点绿色背景的含义图中带有绿色背景的盒子表示该节点可以直接使用或通过 Group、Pose 节点组合使用来构建 Solid 对象的boundingObject用于碰撞检测。图中被标注为 Bounding Object 的节点包括Capsule、Mesh、Plane次级节点以及Box、Cylinder、ElevationGrid、IndexedFaceSet、Sphere高亮次级节点。但请注意并非所有几何节点都能用作boundingObject。例如 IndexedLineSet 与 PointSet 虽然是Geometry的派生节点却不适合也无法参与碰撞体积的计算。boundingObject的具体用法在 solid.md 中有详尽说明boundingObject字段用于以几何图元近似表达 Solid 的边界碰撞检测与惯量矩阵计算均基于它。一个boundingObject可以包含以下 10 种组合方式之一一个 Box 节点一个 Capsule 节点一个 Cylinder 节点一个 ElevationGrid 节点一个 IndexedFaceSet 节点一个 Plane 节点一个 Sphere 节点一个 Shape 节点其geometry字段为上述任一节点一个 Pose 节点其children字段为上述任一节点一个 Group 节点其多个children各为上述节点之一。实践中机器人的可视化表示通常由大量复杂网格如 IndexedFaceSet构成直接用于碰撞检测会显著拖慢仿真并引入误差因此boundingObject的意义就在于用少数简单图元Box/Capsule/Cylinder/Sphere 等近似这些复杂外形。solid.md 还指出若boundingObject为 NULL则该对象不参与碰撞检测可与任何物体地面、障碍物、其他机器人互相穿透且此时physics字段也必须为 NULL。boundingObject与 Physics 节点一起用于计算 Solid 的惯量矩阵假定图元内质量均匀分布而质心位置则由 Physics 节点的centerOfMass字段单独指定。节点插入规则节点图提示了一条通用插入规则一般情况下Device 节点应位于 Robot 节点的children层级体系之内。这是因为设备的name字段正是控制器中wb_robot_get_device函数使用的设备名参数见 solid.md 的name字段说明设备必须挂接在 Robot 上才能被控制器寻址。但也有例外例如 Connector 节点可以插入 Robot 节点之外用于在两个独立 Solid/Robot 之间建立机械连接。更详细的插入位置约束请参考 Nodes and API functions 一章中每个节点的children字段类型说明。例如 group.md 明确列出 Group 的children可包含 Group、Pose、Transform、Shape、CadShape、Solid 及其全部派生节点solid.md 则说明 Solid 节点可以是 Group、Pose、Solid 及其派生节点的子节点但不能作为 Transform 的子节点因为 Solid 不支持缩放。节点图全览下面是 node-chart 文档中定义的完整节点图继承关系以箭头表示虚线为抽象节点绿色为 Bounding Object 节点此外图中还列出了不与上述家族构成派生关系、独立存在的其他节点other NodesAppearance、Background、CadShape、Color、ContactProperties、Coordinate、Damping、Focus、Fog、ImageTexture、ImmersionProperties、Lens、LensFlare、Material、Muscle、Normal、PBRAppearance、Physics、Recognition、Shape、Slot、SolidReference、TextureCoordinate、TextureTransform、Viewpoint、WorldInfo、Zoom。它们各自承担材料、纹理、渲染、物理属性、界面等独立职责在节点图中位于子图subgraphother Nodes 中。分层深入解析从图表到源码节点图按家族分层组织节点。下面结合源码逐一解析每一层的真实继承关系所有 C 继承关系均摘自src/webots/nodes/目录中对应的.hpp文件可直接在仓库中复核。Geometry 家族几何图元Geometry是抽象基类WbGeometry.hpp 中class WbGeometry : public WbBaseNode它派生 11 个具体几何节点。其中IndexedFaceSet与Mesh又共享一个中间基类WbTriangleMeshGeometryWbTriangleMeshGeometry.hpp后者同样是Geometry的派生类节点C 类源码文件BoxWbBox : public WbGeometryWbBox.hppCapsuleWbCapsule : public WbGeometryWbCapsule.hppConeWbCone : public WbGeometryWbCone.hppCylinderWbCylinder : public WbGeometryWbCylinder.hppElevationGridWbElevationGrid : public WbGeometryWbElevationGrid.hppIndexedFaceSetWbIndexedFaceSet : public WbTriangleMeshGeometryWbIndexedFaceSet.hppIndexedLineSetWbIndexedLineSet : public WbGeometryWbIndexedLineSet.hppMeshWbMesh : public WbTriangleMeshGeometryWbMesh.hppPlaneWbPlane : public WbGeometryWbPlane.hppPointSetWbPointSet : public WbGeometryWbPointSet.hppSphereWbSphere : public WbGeometryWbSphere.hppWbGeometry定义了isAValidBoundingObject(...)虚函数WbGeometry.hpp这正是节点图绿色背景标注的源码对应只有重载该方法并返回合法的几何节点才能用作boundingObject。Device 家族传感器与执行器Device抽象节点派生出两条主要支线加一个特例SolidDevice抽象WbSolidDevice : public WbDevice, public WbSolidWbSolidDevice.hpp。它是绝大多数传感器/执行器的直接基类其派生节点Accelerometer、Altimeter、Camera、Compass、Connector、Display、DistanceSensor、Emitter、GPS、Gyro、InertialUnit、LED、Lidar、LightSensor、Pen、Propeller、Radar、RangeFinder、Receiver、Speaker、TouchSensor、VacuumGripper全部既是设备又是 Solid。其中部分节点还有更深层的继承WbRenderingDevice : public WbSolidDeviceWbRenderingDevice.hppWbAbstractCamera : public WbRenderingDeviceWbAbstractCamera.hpp而 Camera、Lidar、RangeFinder 均派生自WbAbstractCameraDisplay 则直接派生自WbRenderingDevice。JointDevice抽象WbJointDevice : public WbLogicalDevice而WbLogicalDevice : public WbBaseNode, public WbDeviceWbLogicalDevice.hpp。它派生出 Motor抽象、Brake、PositionSensor——这些是附着在关节上的设备。Motor 进一步派生WbLinearMotorWbLinearMotor.hpp与WbRotationalMotorWbRotationalMotor.hpp。Skin特例WbSkin : public WbBaseNode, public WbAbstractPose, public WbDeviceWbSkin.hpp是骨骼蒙皮动画设备因此图中 Device 直接指向 Skin。控制器通过wb_robot_get_device按name获取设备再以WbDeviceTag调用各类设备 API详见 device.md 中的wb_device_get_model、wb_device_get_name、wb_device_get_node_type。Group / Pose / Transform / Solid 家族场景图与刚体这一家族是 Webots 场景图的脊柱GroupWbGroup : public WbBaseNode仅含children字段不引入新的坐标变换。PoseWbPose : public WbGroup, public WbAbstractPoseWbPose.hpp引入translation、rotation、translationStep、rotationStep为其子节点定义相对于父节点的坐标系。TransformWbTransform : public WbPose在 Pose 基础上额外支持scale缩放。SolidWbSolid : public WbMatter而WbMatter : public WbPoseWbMatter.hpp。Solid 是碰撞检测对象的基类Robot 与设备类都是它的子类。RobotWbRobot : public WbSolidWbRobot.hpp增加controller、supervisor、battery、selfCollision等字段。FluidWbFluid : public WbMatter是流体动力学对象。Track 与 ChargerWbTrack : public WbSolid、WbCharger : public WbSolid。BillboardWbBillboard : public WbGroupTrackWheelWbTrackWheel : public WbPose。节点图中 Group -- Pose -- Solid -- Robot 的链路在 C 里就是WbBaseNode → WbGroup → WbPoseWbAbstractPose→ WbMatter → WbSolid → WbRobot的逐级继承字段与 API 沿这条链逐级累积。Light 家族光源Light是抽象节点WbLight : public WbBaseNodeWbLight.hpp统一管理光源的公共属性如on、intensity、color等。三个具体光源均派生自它DirectionalLight平行光WbDirectionalLight : public WbLightWbDirectionalLight.hppPointLight点光源WbPointLight : public WbLightWbPointLight.hppSpotLight聚光灯WbSpotLight : public WbLightWbSpotLight.hpp。Joint 家族关节系统Joint是抽象节点WbJoint : public WbBasicJointWbJoint.hpp文档joint.md明确指出其派生类建模各种机械关节并创建其 Solid 父节点与endPoint字段中 Solid 之间的链接。源码继承链如下WbHingeJoint : public WbJointWbHingeJoint.hppWbHinge2Joint : public WbHingeJointWbHinge2Joint.hpp——注意图中 Hinge2Joint 的箭头来自 HingeJoint即 Hinge2Joint 是 HingeJoint 的派生节点天然继承单轴铰链的全部行为并扩展第二旋转轴WbBallJoint : public WbHinge2JointWbBallJoint.hpp——球关节进一步继承 Hinge2Joint扩展第三旋转轴WbSliderJoint : public WbJointWbSliderJoint.hpp——棱柱/滑动关节直接从 Joint 派生。除了 Motor、Brake、PositionSensor 这类 JointDevice 之外关节还通过jointParameters字段关联参数节点WbJointParameters : public WbBaseNodeWbJointParameters.hpp其派生类WbHingeJointParameters : public WbJointParametersWbHingeJointParameters.hpp与WbBallJointParameters : public WbJointParametersWbBallJointParameters.hpp分别对应 Hinge/Hinge2 与 Ball 关节的参数配置含position、anchor、axis、minStop/maxStop等。其他独立节点AppearanceWbAppearance : public WbAbstractAppearance、PBRAppearance同样派生自WbAbstractAppearance、Background、CadShape、Color、ContactProperties、Coordinate、Damping、Focus、Fog、ImageTexture、ImmersionProperties、Lens、LensFlare、Material、Muscle、Normal、Physics、Recognition、Shape、Slot、SolidReference、TextureCoordinate、TextureTransform、Viewpoint、WorldInfo、Zoom均为WbBaseNode的直接派生类对应源码可在src/webots/nodes/下逐一找到在图中不与任何家族构成派生链。其中 WorldInfo 是每个世界文件必备的全局配置节点定义重力gravity默认 9.81、ODE 物理参数CFM/ERP、basicTimeStep默认 32、坐标系coordinateSystem默认 ENU等全局仿真参数。节点图与 WbNodeType 枚举的对应除 C 类继承外节点图还对应一份供控制器使用的节点类型枚举WbNodeType定义于 include/controller/c/webots/nodes.h。该枚举按语义分组列出了全部可实例化节点如WB_NODE_SOLID、WB_NODE_ROBOT、WB_NODE_CAMERA、WB_NODE_HINGE_JOINT、WB_NODE_POSE等。控制器可通过 supervisor.md 中的 API 查询场景中任意节点的类型或配合wb_device_get_node_type判断设备类型见 device.md。抽象节点Device、Geometry、Joint、Light、Motor、SolidDevice、JointDevice不出现在该枚举中——因为它们无法被实例化与节点图虚线框的语义一致。使用节点图的典型工作流在实际建模中节点图的实用价值体现在三个典型场景搭建机器人层级新建 Robot 时按 Robot → Solid肢体→ Joint关节→ SolidendPoint 肢体 的链路搭建运动学骨架并按 Device 家族选择传感器挂在对应 Solid 的children中最后参考 Robot 的字段为每个设备设置唯一name。配置碰撞体积为每个带physics的 Solid 选择图中绿色背景的几何节点Box/Capsule/Cylinder/Sphere/ElevationGrid/IndexedFaceSet/Plane/Mesh作为boundingObject并按 solid.md 中列出的 10 种组合方式组织多图元碰撞体积。验证字段与 API 可用性当不确定某个节点是否具有某字段/函数时沿节点图的继承链向上追溯即可——例如要给 Lidar 设置位置沿Lidar → SolidDevice → Solid → Pose找到translation/rotation要判断能否把某几何体放入boundingObject则检查它是否属于绿色背景节点。总结Webots 节点图是一张浓缩的节点族谱它用三种视觉符号继承箭头、虚线抽象框、绿色 Bounding Object 背景编码了 Webots 场景构建的全部规则。本文通过源码验证了图表每一层继承的真实性C 类继承src/webots/nodes/*.hpp、节点类型枚举nodes.h与文档声明node-chart.md、nodes-and-api-functions.md三者完全一致。掌握这张图就等于掌握了 Webots 场景建模的语法表知道节点从何而来继承、能用在哪里插入规则、能做什么boundingObject 与设备 API从而在搭建仿真世界时有的放矢。赞分享科研自动驾驶物理引擎【免费下载链接】webotsWebots Robot Simulator项目地址https://gitcode.com/gh_mirrors/web/webots点击查看免费下载相关推荐Summarize云服务部署AWS、Azure与Google Cloud配置指南Summarize云服务部署AWS、Azure与Google Cloud配置指南 Summarize是一款强大的内容摘要工具支持对URL、YouTube视频Webots Box 节点完全指南size 字段、纹理映射规则与 boundingObject 碰撞体实战Webots Box 节点完全指南size 字段、纹理映射规则与 boundingObject 碰撞体实战 Box 是 Webots 中最常用的几何原语之一科研自动驾驶物理引擎Webots 设备Device抽象节点与设备查询 API 全解析WbDeviceTag、模型获取与节点类型识别Webots 设备Device抽象节点与设备查询 API 全解析WbDeviceTag、模型获取与节点类型识别 Device 是 Webots 中所有机器科研自动驾驶物理引擎创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?