news 2026/10/4 14:09:51

Webots Highway 高速公路世界解析:用预定义道路段搭建含出入口与立交的高速公路仿真场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Webots Highway 高速公路世界解析:用预定义道路段搭建含出入口与立交的高速公路仿真场景
  • 科研
  • 自动驾驶
  • 物理引擎

【免费下载链接】webots

Webots Robot Simulator

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

本文基于 Webots 仓库中 Highway 世界文档 展开,结合 highway.wbt 世界文件与 road PROTO 节点 源码,系统讲解该仿真场景的构成方式、道路段组件的参数语义,以及如何在自己的自动驾驶测试场景中复用这些预定义道路构件。读完本文,你将掌握 Webots 中高速公路出入口、车道增减、匝道立交与交通标志的搭建思路,并能直接打开、运行并改造该世界。

场景定位:一个开箱即用的高速公路世界

原文档对 Highway 世界的描述非常凝练:这是一个包含多种高速公路入口(entrances)与出口(exits)的简单高速公路场景,用以展示"使用预定义道路段(predefined road segments)构建场景"是多么容易。它属于 Webots 随附的 Worlds 集合 中的一员,与 City、City Traffic、CH Morges、Highway Overtake、Village 等世界一起,覆盖了从城市道路到乡村、高速的多样化驾驶场景。

从仓库结构看,该世界的完整定义位于 projects/vehicles/worlds/highway.wbt(约 2000 行、.wbt世界文件,头部声明#VRML_SIM R2025a utf8,即面向 Webots R2025a 版本)。它没有依赖任何自定义建模资产,而是完全由projects/objects/road/protos/与projects/objects/traffic/protos/下的参数化 PROTO 节点拼装而成——这正是原文档强调"易于创建"的底层原因。

世界文件整体结构:从 EXTERNPROTO 看依赖

打开highway.wbt前 34 行,可以看到本场景的全部外部依赖(EXTERNPROTO / IMPORTABLE EXTERNPROTO)声明,这本身就是一张"技术清单":

  • 道路与路面:Floor、StraightRoadSegment、CurvedRoadSegment、LaneSeparation、AddLanesRoadSegment、Road、RoadPillars、Crossroad、RoadLine
  • 交通设施:ExitSign、OrderSign/OrderPanel、SpeedLimitSign/SpeedLimitPanel、CautionSign/CautionPanel、HighwayPole/HighwaySign、DivergentIndicator
  • 环境:TexturedBackground、TexturedBackgroundLight
  • 交通流与车辆:SumoInterface,以及以IMPORTABLE EXTERNPROTO形式可选导入的车模型——BmwX5Simple、CitroenCZeroSimple、ToyotaPriusSimple、RangeRoverSportSVRSimple、LincolnMKZSimple、TeslaModel3Simple、MercedesBenzSprinterSimple

其中IMPORTABLE(可导入型)EXTERNPROTO 值得注意:它表示这些简单车模型并非场景初始必需,而是留给 SUMO 接口按需实例化的"候补车型池",用于在运行期为高速公路注入车流。

场景主体则按逻辑组织为若干Solid容器:

Solid 容器内容
WEST_LOWER_LOOP/EST_LOWER_LOOP西、东两侧"下层环路":直线段 + 弯道段 + 车道分离/增减段,构成双向互通
SOUTH_UPPER_*/NORTH_UPPER_*南、北四个匝道(含带wayPoints的坡道Road+ 弯道段)
SOUTH_UPPER_LOOP/NORTH_UPPER_LOOP距地 5 米的"上层立交环路"(bottom TRUE+ 高架支撑)
SOUTH_RoadPillars/NORTH_RoadPillars上层高架路的桥墩阵列
SIGNS全部交通标志、指路牌、龙门架
WEBOTS_VEHICLE0初始放置的一辆宝马 X5 自动驾驶车辆

高速公路的"乐高积木":预定义道路段 PROTO 详解

原文档指出本场景的核心价值在于用预定义道路段快速拼场景。下面结合highway.wbt中的实际用法与projects/objects/road/protos/下的 PROTO 定义,逐一说明每种积木的作用。

直线段 StraightRoadSegment

StraightRoadSegment { translation 5.82 -53.6 0 rotation 0 0 1 -1.5707926535897934 id "INWJUN2" # 唯一标识,供其他节点通过 id 引用 startJunction "c10" # 起点交叉口 endJunction "c9" # 终点交叉口 numberOfForwardLanes 0 # 前向车道数(0 表示当前行驶方向相反,用于对向车道段) length 56.4 # 段长度(米) rightBorderBoundingObject TRUE leftBorderBoundingObject TRUE }

该节点的核心字段包括id、startJunction/endJunction(与Crossroad的id对应形成路网拓扑)、numberOfForwardLanes、length与可选width。可以看到本例中numberOfForwardLanes既有2(本向两车道)也有0(对向车道,作为道路另一半),这正是"一整条道路拆成两段反向直线段"的建模手法。

弯道段 CurvedRoadSegment

CurvedRoadSegment { id "INWJUN3" numberOfForwardLanes 2 lines [ RoadLine { type "continuous" } ] # 车道标线 curvatureRadius 38 # 曲率半径(米) totalAngle 3.14151 # 总弯转角(弧度),约 180° subdivision 32 # 曲面细分段数,影响网格平滑度 }

在高架匝道中它还会配合tilt 0.3(横向倾斜)使用,例如SOUTH_UPPER_LOOP中半径 90 米、总角 180°、subdivision 32、tilt 0.3的弯道段,用以平滑衔接上层立交。

车道分离段 LaneSeparation

车道分离段用于把一条路分叉为两条路(或反之合流),是"入口/出口"的关键:

LaneSeparation { id "INWJUN4" connectedRoadIDs [ "INtoOutW", "INWJUN3", "OUTSW" ] # 相连的三条路段 id length 25 # 分叉段长度 newLaneLeft FALSE # 新车道是否位于左侧 centralBorderBoundingObject TRUE # 分叉带中央隔离带碰撞体 }

connectedRoadIDs列出参与该分叉的全部路段id,从而实现"三岔"拓扑:主线继续直行、一支转入匝道。配合newLaneLeft控制新增车道出现在中央分隔带的哪一侧。

车道增减段 AddLanesRoadSegment

AddLanesRoadSegment { id "OUTSW1" connectedRoadIDs [ "INWJUN4", "INtoOutW" ] width 10.5 # 总宽度(米) length 60 numberOfLanes 3 # 车道总数 numberOfNewLanes 1 # 本段新增的车道数(用于汇入/驶离车道) newLaneLeft FALSE }

它表达"在路段行进方向上增加/减少一条车道"的渐变区域,是加速车道(入口匝道汇入)与减速车道(出口匝道驶离)的标准形态。

通用道路 Road(坡道)

Road { id "OUTWJUN3" numberOfForwardLanes 0 bottom TRUE # 生成路面底面(高架路需要) wayPoints [ 0 0 -5, -3 0 -4.95, -8 0 -4.5, -29 0 -0.5, -35 0 -0.05, -41.2 0 0 ] roadBoundingObject TRUE rightBorderBoundingObject TRUE leftBorderBoundingObject TRUE castShadows TRUE }

wayPoints给出沿路中心线的三维关键点序列,z坐标从-5渐变到0,即一条从地下(-5 米)爬升到地面的入地/出地坡道——这正是"下层环路"与"上层立交"之间的竖向联系通道。

交叉口 Crossroad 与桥墩 RoadPillars

Crossroad节点本身没有几何外观(shape []),只作为路网拓扑锚点存在:

Crossroad { id "c9" connectedRoadIDs [ "INWJUN2", "INWJUN3" ] # 该交叉口连接的路段 }

全部交叉口(c0–c15)通过connectedRoadIDs把直线段、弯道段、分离段串成完整路网,这正是 SUMO 接口识别道路拓扑的依据。RoadPillars则为上层立交提供桥墩,参数width、pylonsDistance(桥墩间距)与upperTilt(随弯道外侧抬升的立柱倾角)在上层环路的弧形区段被逐一调整,支撑起高架结构。

交通设施:标志、龙门架与指示牌

SIGNS容器集中放置了全套交通设施,展示预定义 traffic PROTO 的用法:

  • ExitSign / DivergentIndicator:出口预告标志与"车道分流"指示牌,布置在出入口分叉处(如translation -86.9 85.25的DivergentIndicator)。
  • SpeedLimitSign + SpeedLimitPanel:限速标志,贴图引用webots://projects/objects/traffic/protos/textures/signs/us/speed_limit_40.jpg(40 英里/小时限速,对应美国风格标牌)。
  • CautionSign + CautionPanel:注意/警告标志,贴图us/turn_right.jpg,放置在弯道与分叉前提示转弯。
  • OrderSign + OrderPanel:禁令标志(no_u_turn.jpg,禁止掉头),设置在高架起坡处防止误入对向车道。
  • HighwayPole + HighwaySign:横跨高速的龙门架,参数如stand 2(柱式)、height 12、length 33、thickness 0.4、curveRadius 0.8,可同时挂载rightHorizontalSigns、leftHorizontalSigns、rightVerticalSigns、leftVerticalSigns四组HighwaySign(含指向城市名的纹理,如highway_sign_sebastian.jpg、highway_sign_la_ciotat.jpg、highway_sign_bayonne.jpg)。

这些节点都来自 projects/objects/traffic/protos,与道路段 PROTO 一样是纯参数化组件,可在其他世界直接复用。

车辆与控制器:谁来在高速上跑

世界末尾放置了初始车辆:

BmwX5 { translation -7.53 78.7 0.4 rotation 0 0 1 -1.5708 controller "autonomous_vehicle" }
  • 车模来自 projects/vehicles/protos/bmw/BmwX5.proto,一个带轮子材质(BmwX5轮面在WorldInfo.contactProperties中对应了coulombFriction 8的高附着摩擦配置)的完整车辆 PROTO。
  • 控制器指向"autonomous_vehicle",即 projects/vehicles/controllers 下的自动驾驶示例控制器,负责沿路网行驶、遵守交通规则。
  • WorldInfo中还定义了basicTimeStep 10(毫秒)、ERP 0.6、lineScale 5,并为各车型轮子(CitroenCZeroWheels、ToyotaPriusWheels、LincolnMKZWheels、RangeRoverSportSVRWheels、TruckWheels)统一设置了摩擦与softCFM 1e-05接触参数,保证高速行驶的物理稳定性。

SUMO 接口:为高速注入动态车流

SumoInterface { enableHeight TRUE # 启用三维高度(适配高架/坡道路网) }

SumoInterface(PROTO 位于 projects/default/protos/SumoInterface.proto)负责把 SUMO(开源交通仿真器)与 Webots 世界对接:SUMO 负责宏观交通流决策,Webots 负责每辆车的物理与传感仿真。enableHeight TRUE表示本世界的路网具有高度维度(地下坡道与 5 米高架),SUMO 网络需在三维上与之对齐。与之配套的正是前文提到的IMPORTABLE EXTERNPROTO简单车模型池——SUMO 接口运行时按需实例化这些车辆。

对 SUMO 工作流感兴趣的读者可进一步阅读 SUMO 接口文档 与 SUMO 接口示例世界。

环境与视角设置

场景的"氛围"配置集中在文件前部:

  • 地面:1000×1000 米的Floor,1 米平铺,使用草地纹理webots://projects/vehicles/worlds/textures/ground_grass.jpg,roughness 1、metalness 0的 PBRAppearance。
  • 雾:Fog { color 0.396 0.396 0.396, visibilityRange 700 },灰色雾使 700 米外的远景淡出,增强高速视觉纵深感。
  • 视角:Viewpoint的follow "vehicle"让摄像机自动跟随主控车辆,near 1,并开启LensFlare;初始位置位于路网上方约 123 米高处,便于俯视全景。

如何运行与继续研究

运行方式:在 Webots 中直接打开 projects/vehicles/worlds/highway.wbt(File > Open World),点击运行即可看到车辆沿高速公路行驶;若已配置 SUMO 可进一步启用交通流。由于该世界完全由参数化 PROTO 拼装,改动某个StraightRoadSegment的length、调整AddLanesRoadSegment的numberOfNewLanes、或替换SpeedLimitSign的贴图,即可生成自己的高速公路变体。

想更深入理解这些积木的字段默认值,请直接阅读 projects/objects/road/protos/StraightRoadSegment.proto、CurvedRoadSegment.proto、LaneSeparation.proto、AddLanesRoadSegment.proto 等 PROTO 源码。仓库中还提供了 Highway Overtake 世界(4 车道直道 + SUMO 密集车流 + 距离传感器超车演示,对应世界文件 highway_overtake.wbt)与 场景创建教程,可作为下一步进阶方向。

小结

Highway 世界用一份约 2000 行的.wbt文件,仅凭十余个预定义 PROTO 节点就拼出了包含双向主线、进出口匝道、车道分离/汇入渐变与 5 米高架立交的完整高速公路场景,并叠加了全套交通标志、桥墩、雾效与 SUMO 交通流支持。它既是"预定义道路段"组件能力的直观证明,也是研究自动驾驶循迹、交规遵守与 SUMO 联合仿真的开箱即用实验台。

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

【免费下载链接】webots

Webots Robot Simulator

项目地址:https://gitcode.com/gh_mirrors/web/webots
点击查看免费下载
上一篇:Zappa Example 实战指南:用 Zappa 将 Flask 应用与定时任务部署到 AWS Lambda
下一篇:Cat-Catch 资源嗅探完整指南:两分钟装好,一键拿下网页里的隐藏媒体

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/4 14:09:45

办公 AI 助手到底值不值得用?从任务收益到真实局限的完整拆解:TaoToken 统一 Key 接入 TraeWork 的 Work 模式与 Code 模式实测

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 14:07:49

Coding Agent长期记忆:从易失忆到可持久化的实战拆解

我自己用 Coding Agent 半年多,最大的感受不是它多能写代码,而是它实在太容易“失忆”。上午让它修完一个 Bug,下午换个会话再让它优化同一段逻辑,它能给你写出一版与上午完全冲突的方案。长期记忆这件事,正在成为 Cod…

作者头像 李华
网站建设 2026/10/4 14:07:27

学习IEC 61850:用TaoToken统一Key跑通MMS报文解析与GOOSE订阅实验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/4 14:07:20

桥梁裂缝数据集处理:COCO转YOLO格式与训练避坑指南

简介:一份面向桥梁结构健康监测与计算机视觉研究者的图像分割数据集,采用COCO标注格式,聚焦混凝土桥梁表面裂缝缺陷的精准定位与分割。数据集包含约4500张训练图像和200张验证图像,覆盖不同光照、角度、拍摄距离及复杂背景下的裂缝…

作者头像 李华