Webots Track 节点完全指南:用履带与传送带驱动坦克机器人与输送系统

发布时间:2026/10/15 16:40:07
Webots Track 节点完全指南:用履带与传送带驱动坦克机器人与输送系统
科研自动驾驶物理引擎【免费下载链接】webotsWebots Robot Simulator项目地址https://gitcode.com/gh_mirrors/web/webots点击查看免费下载本指南系统讲解 Webots 机器人仿真器中 Track 节点的完整用法。Track 节点用于建模履带式坦克机器人的履带以及工厂传送带等输送装置涵盖节点字段语义、物理仿真前提、电机驱动编程、TrackWheel履带轮布局以及纹理动画与几何动画两种履带可视化方案。读完本文你将能独立搭建一条可被LinearMotor驱动的履带系统并通过textureAnimation或animatedGeometry呈现逼真的履带运动效果。Track 节点概览与字段定义Track派生自 Solid因此它天然拥有 Solid 的全部属性translation、rotation、boundingObject、physics、contactMaterial、name等并在此基础上增加了 4 个专有字段Track { MFNode device [ ] # {LinearMotor, PositionSensor, Brake, PROTO} SFVec2f textureAnimation 0 0 # any vector SFNode animatedGeometry NULL # {Shape, CadShape, Group, Pose, Transform, Slot, PROTO} SFInt32 geometriesCount 10 # [0, inf) }各字段的核心职责如下字段类型默认值作用deviceMFNode[]可选地挂载一个 LinearMotor线性电机、一个线性 PositionSensor 和一个 Brake制动器用于驱动与监测履带textureAnimationSFVec2f0 0纹理动画的滚动方向矢量非零时使履带表面贴图随皮带速度滚动animatedGeometrySFNodeNULL几何动画中沿履带路径移动的纯图形对象Shape 及其容器geometriesCountSFInt3210几何动画中分布在履带路径上的动画对象个数取值范围[0, ∞)从源码看这 4 个字段在 WbTrack.cpp 的init()中分别通过findMFNode(device)、findSFVector2(textureAnimation)、findSFNode(animatedGeometry)、findSFInt(geometriesCount)绑定并与对应的信号槽updateDevices、updateTextureAnimation、updateAnimatedGeometries等联动实现字段变更的实时响应。Track节点可用来建模两种典型场景官方示例世界 projects/samples/devices/worlds/track.wbt 中同时演示了它们履带式机器人在 Robot 左右两侧各放置一条 Track配合同步反转的电机速度实现直行与转向差速驱动传送带将一条水平放置的 Track 作为输送面配合textureAnimation呈现皮带纹理滚动把货物Solid 箱子从一端送往另一端。物理仿真前提与 boundingObject 约定Track节点的运动完全依赖 ODE 物理引擎因此它只在 physics-based物理仿真模式下工作。使用时有三个硬性要求Track节点自身以及相关 Solid 节点的physics字段必须非 NULL即挂载Physics节点boundingObject字段也必须非 NULL否则系统无法为履带生成碰撞几何体节点朝向必须满足Track节点的z 轴与世界 up 向量默认 ENU 坐标系下的 zNUE 下的 y平行履带与所有轮子对齐在垂直于 Track 节点 y 轴的平面上即轮子的运动平面是 Track 局部坐标的 x-y 平面。关于boundingObject官方文档特别强调它不要求与履带外表面精确吻合。完全可以用 Box、Cylinder 等基础几何体来近似指定履带的外部形状尤其是可能与地面、障碍物接触的部分。例如示例世界 projects/samples/devices/worlds/track.wbt 中履带的 boundingObject 就是由一组Pose包裹的 Box用于履带上下表面加两个 Cylinder用于两端驱动轮位置组合而成的简化几何体而不是复杂的履带环面网格。这种做法能显著降低碰撞检测开销同时保证物理行为正确。在WorldInfo.contactProperties中为履带指定较高的库仑摩擦系数如示例中的coulombFriction 500也是让履带机器人正常行走与转向的关键——控制器 projects/samples/devices/controllers/track/track.c 的注释明确提示接触摩擦值对机器人的运动行为尤其是转向影响很大。用 LinearMotor / PositionSensor / Brake 驱动履带device字段可以挂载三种设备LinearMotor履带的动力来源。电机驱动履带表面以线速度运动进而通过摩擦力带动整个机器人。若该字段未定义履带会表现得像一个固定关节fixed joint无法产生驱动效果。PositionSensor线性位置传感器用于读取履带表面移动的累计线位移。Brake制动器可为履带提供阻尼/制动力。官方明确指出位置控制、速度控制、力控制都可以用于履带电机但力反馈force feedback函数不可用。底层实现位于 WbTrack.cpp 的prePhysicsStep()每个仿真步中若存在电机且处于用户控制模式userControl()则按force rawInput - brakingDamping * surfaceVelocity计算净力并推得mSurfaceVelocity force * dt / mass即力控制否则调用computeCurrentDynamicVelocity()得到表面速度即位置/速度控制。随后travelledDistance mSurfaceVelocity * dt累加到电机位置并驱动所有 TrackWheel 旋转以及两种动画的推进。控制器编程示例履带机器人的差速驱动与普通轮式机器人如出一辙只需把电机设为位置无穷大、直接设置速度即可。参照 projects/samples/devices/controllers/track/track.c#include webots/motor.h #include webots/robot.h int main(int argc, char **argv) { wb_robot_init(); WbDeviceTag leftMotor wb_robot_get_device(left motor); WbDeviceTag rightMotor wb_robot_get_device(right motor); // 位置设为无穷大使电机进入速度/力矩控制模式 wb_motor_set_position(leftMotor, INFINITY); wb_motor_set_position(rightMotor, INFINITY); int timeStep wb_robot_get_basic_time_step(); // 直行两侧履带同速同向 wb_motor_set_velocity(leftMotor, 0.1); wb_motor_set_velocity(rightMotor, 0.1); int i 1400; while (wb_robot_step(timeStep) ! -1 i 0) --i; // 左转左侧履带反转 wb_motor_set_velocity(leftMotor, -0.1); wb_motor_set_velocity(rightMotor, 0.1); while (wb_robot_step(timeStep) ! -1) { } wb_robot_cleanup(); return 0; }传送带场景则常用位置控制让电机位置按时间线性递增实现匀速输送。参考 projects/samples/devices/controllers/track_conveyor_belt/track_conveyor_belt.c#include webots/motor.h #include webots/robot.h int main(int argc, char **argv) { wb_robot_init(); int timeStep wb_robot_get_basic_time_step(); WbDeviceTag motor wb_robot_get_device(linear motor); double p 0.0; while (wb_robot_step(timeStep) ! -1) { p 0.0005; wb_motor_set_position(motor, p); } wb_robot_cleanup(); return 0; }对应的世界文件 projects/samples/devices/worlds/track.wbt 中传送带 Track 的device字段只挂了一个LinearMotor并设置了textureAnimation 1.85 0使棋盘格纹理沿皮带方向滚动。配合 TrackWheel 搭建履带轮系Track本身没有默认的履带轮需要通过在其children字段中插入 TrackWheel 节点来定义轮系。TrackWheel是纯图形辅助节点没有物理行为所有物理属性都由父级Track承担。TrackWheel { SFVec2f position 0 0 # any vector SFFloat radius 0.1 # [0, inf) SFBool inner TRUE # {TRUE, FALSE} }三个字段的含义position轮子在Track局部坐标系 x-y 平面上的位置SFVec2f。它同时决定了children中用户自定义轮子形状的自动平移量radius轮子半径。若设为非正值源码 WbTrackWheel.cpp 会通过WbFieldChecker::resetDoubleIfNonPositive将其重置为默认值 0.1inner轮子相对履带带体的位置。TRUE表示轮子位于履带内侧内撑轮FALSE表示位于外侧外压轮/张紧轮。用户需要在TrackWheel.children中自行定义轮子的外观形状如 Cylinder 加贴图。在 projects/samples/devices/worlds/track.wbt 中驱动轮就是带tank_wheel.jpg贴图的圆柱体TrackWheel { position -0.15 0.0075 radius 0.046 children [ Pose { rotation -1 0 0 3.141589 children [ Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [webots://projects/samples/devices/worlds/textures/tank_wheel.jpg] } roughness 1 metalness 0 } geometry Cylinder { height 0.015 radius 0.046 subdivision 20 } } ] } ] }TrackWheel的自动旋转逻辑在 WbTrackWheel.cpp 的rotate()中转角angle traveledDistance / radius若inner为 TRUE则取反即内侧轮沿履带运动方向旋转外侧轮反向旋转。这样无论轮子在带内还是带外与带面的接触速度方向都保持一致。纹理动画Texture Animation最简单的履带可视化纹理动画是最简单的履带运动表现方式原理是让履带表面的贴图沿指定方向滚动模拟皮带在运动。关键点滚动方向由textureAnimation字段SFVec2f指定。若取值为[0 0]纹理静止不动滚动速度不是固定的而是与皮带线速度实时结合每个仿真步中纹理平移量按surfaceVelocity * textureAnimation * dt更新见 WbTrack.cpp实际实现为mTextureTransform-translate(-0.001 * ms * mSurfaceVelocity * mTextureAnimationField-value())。因此电机停转时纹理也立即停止方向随电机正反转切换系统只取Track的第一个子节点参与纹理动画且它必须是一个 Shape 节点或一个 Group 节点或其派生/后代且其第一个子节点是 Shape该 Shape 的 Appearance 节点的texture与textureTransform字段必须被显式定义否则纹理动画无法启用源码中会打印 Texture animation is enabled only if the TextureTransform node is explicitly defined. 的解析警告见 WbTrack.cpp被 Track 功能自动修改的 TextureTransform 节点不能是 USE 节点。源码 WbTrack.cpp 会检测 TextureTransform 的 USE 祖先若存在则发出警告并将其转换为 DEF 节点以避免纹理值独立于 DEF 节点变化的语义冲突。传送带示例节选自 projects/samples/devices/worlds/track.wbtTrack { translation 0 0 0.064 children [ DEF BELT Shape { appearance PBRAppearance { baseColorMap ImageTexture { url [webots://projects/default/worlds/textures/checkered_marble.jpg] } roughness 1 metalness 0 textureTransform TextureTransform { scale 40 1 } } geometry Box { size 0.54 0.04 0.004 } } ] boundingObject USE BELT physics Physics { density -1 mass 10 } device [ LinearMotor {} ] textureAnimation 1.85 0 }这里textureTransform通过scale 40 1把棋盘纹理在皮带长度方向重复 40 次textureAnimation 1.85 0令纹理沿 x 方向滚动。注意纹理动画模式下带体本身不会被自动生成履带皮带的外形需由用户在children中手动定义上例中的BELTBox 即为带体。几何动画Geometries Animation自动生成履带与移动的履带板几何动画由一串纯图形、无物理属性的 Shape 对象组成它们沿由轮系确定的履带路径匀速移动从而生动地表现履带板或传送带上的标记物的运动。启用条件与字段animatedGeometry定义动画对象的模板可以是 Shape、CadShape、Group、Pose、Transform、Slot 或 PROTOgeometriesCount沿履带路径均匀分布的动画对象个数。只有当geometriesCount 0且animatedGeometry被定义时几何动画才会启用对应源码 WbTrack.cpp 中的双重判断。源码实现上Track 会遍历animatedGeometry中的每个 Shape克隆其 WREN 渲染节点并按mPathStepSize mPathLength / geometriesCountWbTrack.cpp在履带路径上等距排布每个时间步随皮带表面速度推进animateMesh()见 WbTrack.cpp同时隐藏模板节点本身。履带路径由 TrackWheel 自动计算几何动画还有一个重要副产物只有启用几何动画时履带带体才会被自动生成并显示源码createWrenObjects()中调用findAndConnectAnimatedGeometries并沿路径构建带体。若未启用几何动画带体需像纹理动画那样由用户在children中手动建模。履带路径完全由children中的TrackWheel节点确定每个轮子提供其圆心位置、半径以及位于带内innerTRUE还是带外innerFALSE的信息。算法computeBeltPath()见 WbTrack.cpp依次计算相邻轮之间的外切线/内切线直段与绕轮心的圆弧段最终拼接出一条闭合路径内/外属性相同的相邻轮之间取外切线内/外属性不同的相邻轮之间取内切线仅一个 TrackWheel 时路径退化为周长为2 * π * radius的圆WbTrack.cpp。轮子的定义约定几何动画要求轮子满足以下布局约定所有轮子对齐在垂直于 Track 节点 y 轴的平面上即 x-y 平面轮子必须按顺时针顺序依次定义起始轮应为x 轴位置分量最小的那个轮子。凸履带路径示例以下代码片段定义了图中凸形履带路径所需的 5 个轮子来自 docs/reference/track.mdchildren [ TrackWheel { position -0.4 0.4 radius 0.2 inner TRUE } TrackWheel { position 0.4 0.4 radius 0.2 inner TRUE } TrackWheel { position 0.2 0.12 radius 0.1 inner TRUE } TrackWheel { position 0 0.12 radius 0.1 inner TRUE } TrackWheel { position -0.2 0.12 radius 0.1 inner TRUE } ]凹履带路径示例凹形内凹履带路径则需要外侧轮参与例如下图所示的 3 轮配置children [ TrackWheel { position -0.4 0.0 radius 0.2 inner TRUE } TrackWheel { position -0.0 0.14 radius 0.1 inner FALSE } TrackWheel { position 0.4 0.0 radius 0.2 inner TRUE } ]完整几何动画配置示例履带机器人场景节选 projects/samples/devices/worlds/track.wbt同时启用了纹理动画与几何动画带体由children中带track.png贴图的IndexedFaceSet手动定义textureAnimation -0.033 0驱动贴图滚动而animatedGeometry提供 40 个沿履带路径移动的小 BoxTrack { translation 0 0 -0.07 rotation 1 0 0 -1.5707953071795862 children [ Pose { translation 0 0.0025 0 rotation -0.5773488553723224 -0.5773509760969792 -0.577350976096979 -2.094397223120449 children [ DEF TRACK_GEOM Shape { appearance Appearance { material Material { diffuseColor 0.592157 0.388235 0.368627 } texture ImageTexture { url [textures/track.png] } textureTransform TextureTransform { scale 13 1 } } geometry IndexedFaceSet { ... } } ] } TrackWheel { position -0.15 0 radius 0.0575 } TrackWheel { position 0.165 0 radius 0.0575 } ] contactMaterial wheel material boundingObject Pose { ... } physics Physics { density 500 } device [ PositionSensor { name left position sensor } LinearMotor { name left motor } ] textureAnimation -0.033 0 animatedGeometry DEF ANIMATED_SHAPE Shape { appearance Appearance { material Material { diffuseColor 0.34902 0.172549 0 } } geometry Box { size 0.01 0.015 0.005 } } geometriesCount 30 }这里的animatedGeometry只有两个轮子路径即两轮的外切线加两端圆弧geometriesCount 30表示 30 个履带板样式的 Box 均匀分布并随皮带移动。测试世界 tests/api/worlds/track.wbt 中还有一组相同的验证场景track_caterpillar并额外覆盖了BrakeLinearMotor maxForce的制动用例与geometriesCount 0关闭几何动画的情形可用于回归验证本文所述行为。常见问题与排错建议结合文档约束与源码行为归纳以下常见陷阱履带不运动检查physics与boundingObject是否都已定义物理仿真的硬性前提纹理动画不生效确认第一个子节点是 Shape 或首个孩子为 Shape 的 Group且Appearance的texture、textureTransform均已显式定义textureAnimation非[0 0]纹理变换节点不能是 USE 节点几何动画不显示确认animatedGeometry已定义且geometriesCount 0若animatedGeometry中包含非 Shape/Group/Pose/Transform/Slot 的非法节点源码会输出 Invalid X used in animatedGeometries field 警告WbTrack.cpp履带路径异常/报 NaN检查 TrackWheel 是否按顺时针、从 x 分量最小的轮子开始排列两个及以上相邻轮子位于同一位置时会输出警告并仅采用第一个WbTrack.cpp路径计算失败时会提示检查 children 中的 TrackWheel 节点WbTrack.cpp轮子旋转方向错误检查inner设置——内侧轮与履带同向旋转、外侧轮反向WbTrackWheel.cpp力控制不生效力反馈函数在履带电机上不可用请使用位置/速度/力矩控制并注意 WorldInfo 中接触摩擦系数的设置对驱动效果的影响。进一步探索节点完整字段与官方示例docs/reference/track.md、docs/reference/trackwheel.md源码实现WbTrack.cpp、WbTrack.hpp、WbTrackWheel.cpp可直接运行的示例世界projects/samples/devices/worlds/track.wbt履带机器人 传送带双场景配套控制器track.c、track_conveyor_belt.c自动化测试世界tests/api/worlds/track.wbt含制动器与几何动画关闭用例赞分享科研自动驾驶物理引擎【免费下载链接】webotsWebots Robot Simulator项目地址https://gitcode.com/gh_mirrors/web/webots点击查看免费下载相关推荐Webots TrackWheel 节点详解为 Track 履带系统定义轮子与自动生成履带路径Webots TrackWheel 节点详解为 Track 履带系统定义轮子与自动生成履带路径 TrackWheel 是 Webots 机器人模拟器中用于搭建科研自动驾驶物理引擎PX4 Hiwonder Tracked 履带式地面机器人搭建与配置指南PX4 Hiwonder Tracked 履带式地面机器人搭建与配置指南 本文基于 PX4 Autopilot 仓库的官方完整机型文档详细介绍如何将 Hiwo嵌入式物联网机器人自动驾驶智能硬件Webots 执行器Actuator节点完全指南通用电机、耦合驱动与多设备扩展Webots 执行器Actuator节点完全指南通用电机、耦合驱动与多设备扩展 Webots 通过一套统一的节点体系来模拟机器人上最常见的机械与电气执行器科研自动驾驶物理引擎创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考