这是咱们这个TransModeler系列的第7篇前几篇把路网搭建、交通需求、信号控制都聊过一遍了这回终于轮到公共交通系统建模。做交通仿真的同仁应该都有体会纯小汽车仿真跑起来再顺一旦要加入公交车、BRT甚至轻轨模型往往会变得特别“脆弱”——要么公交线路画得歪歪扭扭要么仿真里的公交车开得比小汽车还猛要么站台明明设了站点客流却一点反应都没有。这类坑我基本都踩过所以专门把TransModeler里公共交通建模的完整套路整理出来从数据准备、实操搭建到参数调优、问题排查尽量写成一份能直接上手的参考笔记。1. 公共交通建模的整体思路与设计逻辑1.1 公交不是一个图层而是一套联动系统很多人第一次接触TransModeler时习惯把公交系统当成路网上的“附加图层”——画几条线、摆几个点就算建模完成。这个理解在CAD或者GIS画图软件里没问题但在仿真模型里会很快碰壁公交车辆是动态主体它有发车逻辑、停站行为、加减速性能还要和旁边的社会车辆抢道、让行、被信号拦截。所以做公交建模之前必须先把脑中的模型结构扭转过来。我把公交系统拆成四个层次来理解基础设施层公交站点、站台、公交专用道线路层线路几何走向、路径模式Pattern、起终点和停靠规则运营层发车计划、车头时距、车辆类型与车队规模需求层客流OD、站点上下客量、乘客候车与上车行为。这四个层次不是孤立存在的。站点必须落在路网上路径必须沿link走运营计划必须在仿真时钟内被触发客流需求又直接决定停站时间。我做项目时有个习惯先在纸上把每条线路的pattern、停靠站点、发车频率、车辆类型列成一张“公交逻辑关系表”再动TransModeler。边画边想是大忌最后十有八九会出线路数据和运营表对不上的问题。1.2 为什么公交建模比小汽车建模更“难缠”有朋友问我小汽车模型已经够复杂了公交再往上叠还有必要吗我的回答是正因为公交系统是多模式共存的产物它才是城市交通拥堵治理里最容易被误判的部分。公交的运行状态高度依赖道路条件——同样的线路在公交专用道上的行程时间和混行车流里的完全不一样。公交又是“大体积、低灵活度”的载体一台12米长的车频繁进出站对相邻车道的影响远大于几辆小汽车。更关键的是公交运行还受信号控制影响而信号控制又可能反过来为公交提供优先。这种相互耦合的关系只有放到仿真模型里才能完整呈现。TransModeler适合做公交建模就是因为它把这些关系都做成了“可编辑的变量”而不是把公交当贴图。公交专用道可以设置允许车辆类型信号优先可以设置申请条件和绿灯延长、红灯早断停站时间可以关联上下客人数。这意味着只要数据够细模型能反映的交通现象就够真。1.3 建模流程总览七步走完一个公交模型我用的标准流程是七步检查并预处理基础路网包括link、node、道路功能等级导入或标定公交站点逐个检查站点在线路上的位置创建公交线路polyline对齐加自动路径生成设置公交车辆类型、车队数量与发车计划配置公交专用道与信号优先策略录入乘客需求OD与站点上下客参数试运行、校准、迭代。整理成表格更直观步骤核心任务主要手段输出产物1路网预处理网络编辑器可识别link/node的路网2站点标定公交图层带link偏移量的站点表3线路与pattern创建公交线路工具线路几何加停靠站序列4运营计划配置时刻表或头距表可发车的公交服务5公交优先设施车道与信号编辑器方案对比能力6需求配置公交OD矩阵站点上下客量7仿真校准动画加统计输出可交付的仿真模型每次做完第2步我都会用“地图肉眼对比加线形距离检查”双保险过一次站点位置因为后面所有结果都建立在站点位置正确的基础上。这一步省不得省了后面必然加倍还回来。2. 前期数据准备料备齐了再动手别让模型输在起跑线2.1 别急着画线先把基础路网核到位公交建模的所有上层建筑都落在基础路网之上。如果路网里的link类型、方向、连通性有问题公交线路再规范也没用——车辆根本没路可走。新项目拿到手我先做三件基础工作检查link方向。双向道路是否按双向建模单向交通是否完整检查连通性。交叉口处的转弯连接是否齐全断头路、错位连接要清理检查道路分级与速度。公交路径选择高度依赖道路功能等级等级混乱会导致自动生成的公交路径走进不该走的路。其中最容易忘的是“方向”。在TransModeler里link是带方向的双向路段通常体现为双向的两条link但GIS数据导入时经常出现只导了单向的情况。公交线路严格按方向运行我曾经遇到某条BRT线路返程车辆在仿真里绕行三个路口查了一下午才发现返程方向的路网根本断了头。这种问题看似低级却在真实项目里反复出现。2.2 公交站点数据整理三个关键字段不能少公交站点建模最吃亏的项目类型就是“只有一张Excel站点名表没有坐标”。坐标是站点能不能吸附到link上的前提。我习惯先在GIS或CAD里把站点位置全部点好再导出成包含经度、纬度或投影坐标X、Y的点文件。拿到站点坐标后还需要三个关键字段才能让TransModeler正确识别站点名称与编号Stop ID加Name站点定位信息建议直接用坐标导入软件自动吸附到最近link再人工校正偏移量站点属性包括是否港湾式、站台长度、是否允许上下客。有个细节经常被忽略公交站是有“车道侧”的。同一个站点如果服务上下行两个方向需要在两条方向的link上分别设置站点。只建一个点另一半方向上的车辆永远不会停靠。我习惯给站点名加方向前缀比如“人民路站东行”、“人民路站西行”后期列表里一眼能看出有没有漏。2.3 时刻表数据先分清频率优先还是时刻优先公交运营数据在现实中通常分两大类建模前要分清手里是哪一种固定时刻表型也就是Schedule-based每条线路在停靠站有精确的到发时刻适合城际干线、BRT、轨道交通车头时距型也就是Frequency-based只给出高峰和平峰的发车间隔适合常规地面公交。TransModeler两种都支持。我的建议是手头有完整固定时刻表就尽量用固定时刻表只有发车间隔就用频率模式。固定时刻表能自然体现串车、大间隔等实际运营现象对方案对比更敏感。整理时刻表时有个常见坑表格里用的是车辆在运营起点的发车时间而不是到终点时间。你要给每一趟车的首站发车时间后续站点的到发时间由仿真内部计算。曾经在某市公交线网优化项目里甲方给的是从首站到末站的全线时刻表几百条线路几千个站点直接照搬会产生大量参数冲突。最后我们只取“首站发车时刻加站点间参考限速”两列其余交给仿真计算模型干净许多。2.4 车型与车队参数取值经验直接抄公交车辆参数直接影响仿真中的运行表现尤其是加速度、最大速度和载客量。以常规12米柴油或纯电公交为例常见取值范围如下参数典型取值备注车辆长度10.5到12米影响占用空间与变道行为最大载客70到90人含站立乘客按拥挤系数可调空车加速度1.2到1.5 米/平方秒动力性能一般低于小汽车满载加速度0.8到1.0 米/平方秒爬坡、满载时明显下降最大车速50到60 公里/小时按道路限速和公交限速取较小值这类参数在TransModeler里按车辆类型管理同种车型统一设置方便批量替换。车辆参数不合理的危害很大——见过某项目把公交车最大速度设成90公里/小时结果仿真里公交在混行车道上不断超小汽车动画看起来极其违和数据完全没法用。速度参数宁可保守也不要给得过激。2.5 数据清单速查开工前人手一份整理一个公共交建模数据清单速查表方便项目前期使用数据类别数据内容建议格式质量要求路网link、node、方向、等级Shapefile或GeoJSON拓扑无误、方向完整站点名称、坐标、车道侧、站台长度点Shapefile加Excel坐标与路网匹配线路线路编号、pattern、停靠站序列Excel加路径参考每个站必须在线路上运营首站发车时刻或高峰平峰头距CSV或Excel覆盖全天仿真时段车型长宽高、载客量、动力性能参数表与真实车队一致需求公交OD矩阵、站点上下客量矩阵文件总量与控制点误差小于15%这是我在多个项目里反复打磨过的清单。数据准备阶段多花一天后期标定阶段少花两周这个时间投资非常划算。3. 实操在TransModeler里把公交网络搭起来3.1 图层与路网的准备先给自己一个好底子正式建公交之前先把TransModeler里的图层结构理顺。一般我会规划这几个图层组基础图层组路网link、节点node、控制点公交图层组公交站点、公交线路、公交专用道需求图层组交通小区、需求连接器方案图层组信号控制、公交优先策略、动画输出。把公交相关元素单独放一个图层组最大好处是之后做方案对比时可以直接把不同方案建成不同图层切换图层做前后对比输出图表和视频都方便。导入新路网之后我习惯做一个测试从任意两个小区之间模拟一辆私家车走一遍确认路径算法没有瞎绕路。基础路网路径异常交通流量标定就会出问题公交线路跑出来的门到门时间也毫无参考价值。3.2 公交站点标定与属性设置吸附不对全白搭在TransModeler里建站点关键不是画一个点而是设置点与路网的绑定关系。点坐标会吸附到最近的link软件会用“link加距离起点偏移量”来保存站点位置。我的操作建议通过文件或坐标批量导入站点点文件选择吸附到最近道路逐个检查站点是否吸附到正确link、在正确车道侧对需要调整的站点用沿link的偏移量微调为站点填写站台长度、是否允许上下客、是否港湾式停靠等属性。为什么“是否正确吸附”这么重要因为TransModeler里的站点是公交车辆的目标点如果站点吸附到了错误link比如路网外侧的辅路或匝道车辆虽然可视化里看似经过站台附近却永远不会触发停站逻辑。这个坑在立交桥、辅路较多的地段尤其多。我通常是开启站点编号标签缩放至1比2000逐站过一遍虽然繁琐但有效。另外同一个站位在上下行两条link上是两个站点。有人会问我用同一个站点设置成双方向可停靠行不行软件逻辑上可以但我强烈不建议这会给分方向客流量统计埋雷数据拆不出来。方向分开是模型规范性的第一课。3.3 公交线路与路径生成line与pattern要分清创建公交线路通常会经过“几何走向定义”和“路径生成”两步。常见工作流是这样的在GIS或规划图上根据实际运营走向先画出线路中心线polyline作为线路参考路径导入在TransModeler里对polyline进行吸附和拓扑对齐把参考线落到link上检查并调整途经的控制点就是waypoints确保走向与运营一致指定线路的停靠站序列顺序从首站到末站把路径保存为pattern备用。这里必须分清line和pattern的区别。我习惯把它理解成“线路”与“线路的一个具体走向方案”。比如高峰走主路、平峰绕行支路这是同一条line下的两个pattern。发车计划挂在pattern上而不是直接挂在line上。理解这一点后面班次配置才顺。路径生成时最怕黏错路。尤其在大路口、有渠化岛的路段参考线很容易被吸附到旁边的左转专用道。手动加waypoints是最直接的解决办法我的习惯是线路上每个关键交叉口至少留一个控制点宁可多点几个不要省。等到跑仿真发现车辆连续绕路口再回头改代价大得多。3.4 运营计划与发车频率让车按规矩动起来公交网络建完之后要让车跑起来就得给pattern配置运营计划。运营计划包括两大部分车队由哪些车跑、什么时候发车。发车逻辑一般有两种配置方式按车头时距发车设定高峰间隔5分钟、平峰10分钟软件按均匀头距自动生成发车时刻按固定时刻表发车直接导入首站发车时刻表比如07:00:30、07:05:30、07:12:00。方案比选时我建议用固定时刻表尤其当对比方案会改变行程时间时固定时刻表能在微观层面反映早到和晚点现象。如果只看大尺度运营效果频率模式更快。发车时刻数据最好能外部导入。这里是一个简单的首站发车时刻表CSV格式示例pattern_id,vehicle_type,trip_start,remark P_B101_01,BUS_STANDARD,06:00:00,早高峰前 P_B101_01,BUS_STANDARD,06:05:00,早高峰前 P_B101_01,BUS_STANDARD,06:30:00,早高峰 P_B101_02,BUS_STANDARD,06:35:00,早高峰绕行方案这个CSV看着简单但解决了手工一行行配班次的低效问题。几十条线路、全天数百个班次的项目没有外部数据导入能力基本做不动。配置运营计划时有个容易被忽视的点车辆周转。如果线路终点没有任何回程线路公交车到终点后是要返回的。返回过程按空驶处理还是立即转入下一趟车直接影响车队规模。我会在运营计划里专门规定空驶逻辑避免仿真里出现车辆在终点凭空消失又凭空出现的尴尬场面。3.5 公交专用道与信号优先方案价值的高地公交专用道和信号优先是公交建模里最能体现方案价值的功能。在TransModeler中公交专用道通常作为link属性或车道属性来设置指定某个车道只允许公交车辆通行也可以部分设置成允许高载客车辆。设置专用道时要检查两个问题专用道的起终点是否与路段物理位置吻合否则公交会过早或过晚变道专用道与普通车道之间的换道规则是实线还是虚线影响仿真中车辆能否在交叉口前离开专用道。信号优先也就是Transit Signal Priority简称TSP是另一大块。TSP通常有两种实现逻辑绿灯延长和红灯早断。配置时要给特定交叉口的信号机设置“检测到公交到达时允许延长绿灯X秒”或者“允许提前结束红灯切换绿灯”。仿真中可以设置每个班次的优先权限与次数限制避免公交密集路段信号被刷爆。做方案比选时强烈建议做有无对比。一组跑无TSP一组跑有TSP放同一个动画窗口对比。有一次做某大道公交优先方案无TSP时公交平均行程时间21分钟TSP实施后降到17.5分钟而社会车辆仅增加约3%延误。这种结果拿到评审会上特别有说服力。4. 仿真运行前必须盯紧的公交参数4.1 停站时间最敏感的参数没有之一停站时间Dwell Time是指公交到站后从开门、上下客到关门离站的时间。现实里它是公交行程时间中最不确定的部分。TransModeler里一般有两种建模方式固定值或分布值以及与上下客人数挂钩的动态计算。我的经验是早晚高峰和客流大的站点务必用动态计算这样才能自然体现上车人多就停得久的累积效应远郊偏远站点、几乎没人上下客的站点可以设一个固定最小停站时间比如15秒避免频繁零停站导致动画突兀。动态停站时间的常用参数包括每名乘客上车平均耗时约2.5到3.5秒、下车约1.5到2.5秒、车门开启和关闭约3到5秒。车辆满载时上下车速度会明显下降模型中应把满载率作为修正系数。调停站时间时有个细节站台同时有多辆车排队进站时后车要等前车离开才能进站。这个排队行为是仿真自动处理的但你必须确保站台长度参数正确。长度太短就会在动画里看到两三辆车在同一站台重叠那就荒唐了。4.2 公交运行速度与跟驰行为别让大车开出小车的味公交车辆的动力性能、驾驶行为都和小汽车不同。给公交配置车辆类型时最要紧的三个速度参数是最大速度、期望速度、加速度。我一般把公交车最大速度设置成略低于道路限速。比如城市快速路限速80公里/小时公交最大速度设为65公里/小时。为什么因为现实中公交司机极少顶着限速跑而且满载后动力有衰减。这样设出来的行程时间才贴近实际。跟驰行为上公交车的跟车距离通常比小汽车大一些尤其满载或路况不佳时。TransModeler里可以给公交类型单独配置跟驰参数不要套默认小汽车参数。如果不单独配仿真里最大的违和感就是公交车贴着前车屁股开视频拿出去汇报时外行都能看出不对。变道问题同样值得调一调。公交驾驶员很少频繁变道尤其是大车。可以把公交车的换道意愿系数适当调低默认参数往往偏向普通车辆。调整后公交会更稳定地待在专用道或右侧车道整体动画真实很多。4.3 乘客需求与站点上下客建模让停站时间活起来只让空车在路上跑模拟出来的停站时间永远不准确。要把公交仿真做到位还得把乘客需求输进去。在TransModeler中公交乘客需求一般以OD矩阵或站点上下客客流量方式输入模型把有多少人上车、多少人下车转化为上下客事件再驱动停站时间动态变化。这一步看着简单实际有坑公交OD矩阵必须对应站点建的是“站点1到站点N”的OD而不是小区OD因为乘客是在站点上车下车的如果模型里有多个公交线路还涉及候车与换乘逻辑。乘客会选定某条线路并等待不同线路共享站台时乘客被模型分配选择哪条线路会影响各线路载客量。客流标定时我习惯用站点上下客总量做控制。也就是说用公交IC卡或客流调查获得各站全天上下车人数先把总量校准到误差15%以内再看OD和换乘结构做精细优化。如果直接从头调OD矩阵很容易出现总量对但分布飞了的情况。4.4 仿真步长、随机种子与统计口径跑数前的最后一步公交建模完成后仿真运行的参数设置也很讲究。最关键的三个仿真步长、随机种子、统计口径。仿真步长。TransModeler以秒或亚秒为步长更新车辆位置。公交的停车、开门、关门事件在更细步长下更平滑但计算开销也更大。我一般用1秒步长做大批量方案比选对重点交叉口或公交站点复核再用更细步长随机种子。仿真里的交通需求、发车时刻扰动、驾驶行为变化都受随机种子影响。公交仿真尤其需要同一种子下做方案对比否则两条方案的差异会夹杂随机噪声统计口径。公交行程时间统计必须在同一个统计断面和同一时间段取数比如早高峰7点30到8点30由人民路站到火车站站。不同口径的数据不能混在一起比。有一次我做两个方案对比把方案放在不同随机种子下跑结果无公交优先方案的平均速度反而比有优先方案高3%数据分析会做了快半天才发现是随机种子不一致。从此以后我在项目里固定种子方案每个方案至少跑3个种子取均值。5. 常见问题与排查技巧实录5.1 线路画了仿真里却没有公交车这是新手期遇到最多的问题。可能的原因有几个线路被设置为未激活状态仿真引擎不派车运营计划没有挂在正确pattern上发车时间不在仿真时间段内比如全天仿真只设了8点到9点但首站发车是7点30车辆类型与线路不匹配线路指定车型未正确关联。排查步骤我一般这样走先看线路属性和pattern状态确认已激活、有效再查运营计划是否关联到该pattern是否覆盖仿真时段打开车辆运行轨迹显示看该时段首站是否有车辆生成最后检查车辆类型是否被拉入车队。最实用的建议不要用肉眼盯着动画找车几分钟车没来就急死人。直接查车辆列表或已运营班次表一分钟内就能定位问题出在哪个环节。5.2 公交快得像狂奔的小汽车公交速度异常九成是车辆参数或路网限速设置的问题。几个排查方向公交车辆类型里的最大速度是否设置过高link允许速度是否被统一设成过高值公交是否错误使用了专用道最高速度按小汽车期望速度跑是否缺少公交在混行车道的速度折减系数。排查时建议打开多模式速度图层叠加显示把道路link的期望速度图层和公交实际路径对比一看基本马上能定位问题出在哪段路。我不止一次发现模型里某条新改建道路link限速被误设成120公里/小时公交最大速度也是90公里/小时那当然快。把link限速调回实际值后一切恢复正常。5.3 站点有人等但没人上车很多朋友建模时会把公交OD矩阵直接挂到线路上却忽略了“乘客是否选择该线路”这一环。如果站台同时有两条线路共用乘客可能被分配到另一条如果线路的停靠模式把该站标记成跳停车辆经过也不会开门。排查角度检查线路在该站是否设置为停靠检查候车乘客的目的站是否在该线路的途经站范围内检查乘客需求是否已正确关联到公交网络公交OD和普通车辆OD是两套体系检查上车时间阈值是否过小导致乘客在仿真里永远等不上车。这个坑我调试过最久的一次是某条线路设置站点属性时误点了skip选项车辆全线跳过该站上午客流数据全废。后来把线路站点序列导出成CSV人工核对才发现问题。大型路网项目里别信眼睛信表格。5.4 仿真结果和现场视频对不上公交仿真最大的验收环节是拿仿真动画和现场视频对比。最常被质疑的是三个指标到发时刻、停站时间、行程时间。偏差大时先别急着怀疑模型不稳按顺序排查先核对信号配时方案是否与现场一致。公交在交叉口的等待时间和信号配时强相关配时对不上后面全白搭再核对停站时间参数。现场视频里的上下客人数如果明显多于模型上下客量停站时间自然对不上最后核对公交是否受社会车辆影响。混行路段的延误高度依赖小汽车流量流量输入偏低公交行程时间也会显著低估。我做过一个BRT改造项目仿真出来的公交平均速度比实际快了20%一开始以为是公交参数问题逐项排查后发现基础路网某段流量输入偏低导致混行路段几乎不拥堵。把流量修正后速度差立刻缩到4%以内。5.5 高频问题综合速查表症状可能原因排查顺序无车可发线路未激活、时刻表未关联、时段不覆盖状态→计划→车辆类型公交飞驰车型速度过高、link限速错误车型参数→道路限速→多模式速度显示站台无人乘客OD未关联、线路跳停停靠模式→OD关联→候车分配停站过久dwell time参数过大、客流过高停站参数→站台排队→上下客速度司机神走位换道意愿参数未调整换道系数→专用道→车道标线结果对不上视频信号配时、流量输入、交叉口建模配时→流量→路网拓扑这张表我打印出来贴过实验室好几次后来干脆做成Excel模板每次项目结束就把新踩的坑填进去慢慢就成了团队自己的坑库。最后分享一点个人体会。公交建模看起来只是交通仿真里的一个模块但在实际项目里它往往是牵扯数据种类最多、方案论证价值最高的部分。做公交仿真的关键并不在于软件操作多花哨而在于对“线路-站点-运营-乘客”这条数据链的掌控力。我的经验是每次都宁可前期多花时间把站点位置、发车时刻、车型参数一条条核对清楚也不要指望仿真跑起来之后顺手修一修——公交系统里每个环节的连锁反应比小汽车模型大得多。还有一个小技巧做完模型后保存一个“原始参数备份版本”每次调优都在副本上进行万一把参数调乱了随时能回到一个可复现的稳定版。这期先把公交建模讲到这里下期可以接着聊TransModeler里信号控制与公交优先的联合优化那也是我反复踩坑后想好好总结的一个专题。