# 配送机车模型评估结论 日期:2026-10-12。范围:本轮用户确认的基线核对、规则对照、小样本验证、最终结论四项评估。 ## 结论 **继续使用 OSRM v5.27.1 是当前静态配送路线需求的可行方向;没有证据要求立即换成 Valhalla,也不需要先把它的 C++ 全部翻译成 Lua。** 现有模型已有机车通行与转向能力,可优先补充路面、信号灯和转向的静态软权重,并校准速度和距离偏好。 真实 OSRM 合成路网试验验证了这些机制。但这不是台湾全境导航验收,也没有运行 Valhalla 引擎做路线等价比较。按时间变化的通行限制、实时交通、请求级动态偏好和完整两段式转弯不能凭本次试验宣称支持。 ## 1. 代码与部署基线 | 对象 | 固定基线 / 实际核对 | |---|---| | 地图本地 master / 远端 master | `f8d104a4fd9a12d4197593e711135c2b9662db72`,只有汽车配置 | | 地图双车型分支 | `8906fe1d49d7304e6ea3a579bea2d81d0bd31db6`,已有机车 Lua | | 测试服务器部署 | `/opt/foodie-map-tw-20260909`,汽车、机车为两个 OSRM v5.27.1 容器 | | 部署机车 Lua | SHA-256 `6f8741c9a6130434074be06302a28c204ed25ed9f5b760f776ac9f6b3bedbe26`,与双车型分支完全一致 | | 实际 API 文件 | 宿主机 settings/routing 与 API 容器对应文件哈希一致;但两者均不等于上述任一分支的对应版本 | | 路网指纹 | 已构建路网指纹等于镜像内 car.lua 与部署 motorcycle.lua 拼接指纹;PBF 指纹见机器证据 | | Valhalla 参考源码 | 固定提交 `34639a33510eb0764da77650e91f6efbb70e8daa`;两模型、LICENSE.md、COPYING 均记录下载哈希 | **不能把部署代码整体认定为双车型分支的原样发布。** 机车 Lua 可按已核对的分支文件研究,但后续修改 API 前需要整合已部署的车型、多站点能力,不能盲目覆盖文件或切换到旧 master。 实际测试服务器请求同一组台北公开坐标(`25.0330,121.5654` → `25.0375,121.5637`): | 接口 | 汽车 profile=car | 机车 profile=motorcycle | |---|---|---| | GET /api/route | 693 米 / 63 秒 | 693 米 / 87 秒 | | GET /api/route/multi | 693 米 / 63 秒 | 693 米 / 87 秒 | 两个接口都接受 `profile` 并切到相应引擎,`traffic_aware=false`。因此 foodie 无需另造地图车型接口,但其 `SelfHostedRouteDistanceProvider` 当前仍未把 `vehicleType` 映射后传过去。 ## 2. 规则对照:借鉴什么,不照搬什么 | 规则 | Valhalla 机制 | 当前 OSRM / 本轮判断 | |---|---|---| | 车型通行权限 | motorcycle 使用机车 access mask;motor_scooter 使用 moped access mask | 已读 motorcycle/motor_vehicle/vehicle/access,可复用;模型名称不能直接等同台湾机车类别 | | 高速/快速道路 | 通行 mask 与道路偏好分离,motorcycle 的 use_highways 是软偏好 | 当前硬排除 motorway/link;trunk/motorroad 明确 motorcycle=yes 等许可时仍放行。不能把“避开高速”当作所有禁行路段的完整保证 | | 单行与转向禁止 | 道路方向、简单及复杂限制 | 已有 oneway:motorcycle、restriction:motorcycle 和通用 restriction;真实夹具通过,优先保留而非重写 | | 路面不佳的偏好 | motorcycle 对路面加成本;scooter 还影响速度 | 可用 forward/backward_rate 调整权重,也可另校准实际速度;本轮验证权重变化不必同步扩大时间 | | 信号灯和转向 | 通过公共转向时间及独立成本估算 | OSRM process_turn 可分别改 weight/duration;本轮验证信号灯与转向软权重,不能把固定灯等待值当作实时信号周期 | | 时间/距离偏好 | use_distance/shortest 与其它成本组合 | OSRM 可构建固定的 rate/weight 策略;需要选择静态业务权重,不保证最短距离、最少灯和最短时间同时成立 | | 最高速度与道路速度 | top_speed 截断并配合速度惩罚 | 当前仅部分道路速度及机车 maxspeed 覆盖;max_speed_for_map_matching 不是算路最高速度上限,后续需单独校准 | | 坡度与道路密度 | 使用图中的 weighted_grade、density 等属性 | 当前没有相同数据链;静态扩展需可靠的坡度/密度数据,不能复制 C++ 常量就获得这些能力 | | 请求时动态偏好 | 在请求时使用 costing_options | OSRM Lua 主要在预处理执行;固定配置可以迁移,请求级任意组合不能仅靠一份静态 Lua 等价复刻 | | 条件通行、实时封路 | EvaluateRestrictions、日期/时间和交通数据 | 当前 Lua 未处理测试中的 motorcycle:conditional;生产若要求预约时间条件导航或实时交通,应另设计时间数据/引擎方案 | | 两段式转弯 | 需实际路网和当地转向规则共同支持 | 源码阅读未证明存在通用台湾待转实现;禁止某个转向不等于完整待转流程,本轮不宣称达标 | 参考的是规则思路与机制,不是模型的全部常量。motor_scooter 的默认 45 km/h 等参数面向其 moped 模型,不直接作为我们的配送机车默认值。motorcycle 的旅游/越野偏好也不应原样加入外卖配送。 固定参考链接:[摩托车源码](https://github.com/valhalla/valhalla/blob/34639a33510eb0764da77650e91f6efbb70e8daa/src/sif/motorcyclecost.cc)、[踏板/轻便机车源码](https://github.com/valhalla/valhalla/blob/34639a33510eb0764da77650e91f6efbb70e8daa/src/sif/motorscootercost.cc)、[API 文档](https://github.com/valhalla/valhalla/blob/34639a33510eb0764da77650e91f6efbb70e8daa/docs/docs/api/route/api-reference.md)、[OSRM 5.27.1 Lua 文档](https://github.com/Project-OSRM/osrm-backend/blob/v5.27.1/docs/profiles.md)。Valhalla COPYING 声明 MIT,实际复制源码时需保留相应版权与许可声明;本轮未复制其 C++ 实现。 ## 3. 小样本验证结果 Windows 本机 Docker daemon 未运行,因此复用已配置 SSH 到测试服务器运行一次性隔离试验。没有安装依赖、修改正式配置或重启原服务。 - 生成合成 OSM XML,并分别构建汽车、部署机车基线、一次性机车候选三份小路网。 - 构建容器无网络;算路容器仅绑定 127.0.0.1 的随机端口,每容器限制 0.5 CPU / 256MB,单线程。 - 候选只在拥有的 /tmp 临时目录生成:保留硬通行规则,gravel 的 rate ×0.2、信号灯 weight +8、较大转向 weight +3。数值由本次探针选择,仅验证机制,不是 Valhalla 原值或生产批准参数。 - **35 项常规断言通过,另 1 项限制探针确认了条件禁行未生效;无脚本错误。** “限制探针通过”表示成功复现不足,不表示该功能受支持。 | 验证内容 | 实际结果 | |---|---| | motorcycle=no;motorcar=no 但 motorcycle=yes | 汽车与机车按不同权限选路;基线和候选均正确 | | motorway/link、无许可 trunk/motorroad | 基线和候选均绕行;明确许可的 trunk/motorroad 均能通行,说明当前是该保守策略而非无条件全部排除 | | 单行、机车特定单行覆盖 | 两个机车版本均按预期选路 | | 通用及机车专属转向关系 | 均绕过禁止的直接转向,约 653.6 米 | | 车型限速 | 同一路段约 221.6 米,汽车 11 秒、机车 49.8 秒,证明车型限速参与实际时间计算 | | 固定碎石路:权重与估时分离 | 距离 221.6 米、时间均 20 秒,权重由 20 变 99.6 | | 固定信号路口:权重与估时分离 | 时间均 34 秒,权重由 34 变 42 | | 固定转向:权重与估时分离 | 时间均 29.6 秒,权重由 29.6 变 32.6 | | 有替代路线时的路面偏好 | 基线 221.6 米/20 秒;候选改走铺装绕路 423.1 米/60.9 秒。这是实际路径变化,不是把原路径 ETA 乘惩罚系数 | | 道路吸附失败、不同连通分量 | 分别 NoSegment、NoRoute,未伪造直线成功 | | 按序三站点往返 | 保留两条 leg 并返回整线距离 | | 全天禁止的 motorcycle:conditional | 基线仍走约 221.6 米直路,确认当前没有执行该条件 | 试验同时说明:软偏好设得过强可能明显绕远,不能把“借鉴路面权重”直接等同于“配送最优”。正式参数需用实际订单、骑手入口和运营目标校准。 ### 证据与复现 - [脚本](evaluation/run_model_probe.py),仅使用 Python 标准库、已有 SSH 和服务器现成 OSRM 镜像。 - [机器证据](evaluation/model-probe-results.json),保存固定来源哈希、全部断言、实际指标及清理核对结果。 - 按 [plan.md](plan.md) 的命令复现。此脚本会创建临时文件和临时容器;只停止本次创建的容器 ID,不操作生产 Compose 项目。 - 检查确认:生产文件前后哈希一致,三个原服务容器仍运行,临时容器及临时目录均已移除。无业务库读写,无凭据入库或入文档。 ## 4. 后续生产实施的最小范围 本节是评估建议,不是本次已执行的生产改造: 1. 保留部署机车通行/单行/转向规则,先明确适用机车类别及快速道路保守策略,避免照搬通用 moped 或旅游摩托车模型。 2. 仅补充经业务确认的静态距离、路面、信号灯、转向权重与速度上限;时间和偏好分开,不直接采用试验常量。 3. foodie 将 vehicleType=1/2 映射为 profile=motorcycle/car,透传到已经支持车型的 GET /route/multi;同步校准 032 的历史 car-only 假设与 ETA 口径。 4. 在版本对齐后重建独立机车路网,按真实台湾取送点回归、性能压测和回退验收,再决定上线。 **当前基础静态需求无需改 OSRM C++ 的结论有机制与夹具证据;完整复刻 Valhalla 或实现动态时间导航则没有这一保证。** 本轮没有部署/运行 Valhalla,没有验证两引擎同图同参数的等价路线、台湾机车法规全覆盖、实际配送 ETA、P99 或长期运行容量。 本轮四项评估已验证;生产实现、全量路网更新与线上切换仍未开始。未自动 commit/push。