日期:2026-10-12。范围:本轮用户确认的基线核对、规则对照、小样本验证、最终结论四项评估。
继续使用 OSRM v5.27.1 是当前静态配送路线需求的可行方向;没有证据要求立即换成 Valhalla,也不需要先把它的 C++ 全部翻译成 Lua。 现有模型已有机车通行与转向能力,可优先补充路面、信号灯和转向的静态软权重,并校准速度和距离偏好。
真实 OSRM 合成路网试验验证了这些机制。但这不是台湾全境导航验收,也没有运行 Valhalla 引擎做路线等价比较。按时间变化的通行限制、实时交通、请求级动态偏好和完整两段式转弯不能凭本次试验宣称支持。
| 对象 | 固定基线 / 实际核对 |
|---|---|
| 地图本地 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 映射后传过去。
| 规则 | 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 的旅游/越野偏好也不应原样加入外卖配送。
固定参考链接:摩托车源码、踏板/轻便机车源码、API 文档、OSRM 5.27.1 Lua 文档。Valhalla COPYING 声明 MIT,实际复制源码时需保留相应版权与许可声明;本轮未复制其 C++ 实现。
Windows 本机 Docker daemon 未运行,因此复用已配置 SSH 到测试服务器运行一次性隔离试验。没有安装依赖、修改正式配置或重启原服务。
| 验证内容 | 实际结果 |
|---|---|
| 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 米直路,确认当前没有执行该条件 |
试验同时说明:软偏好设得过强可能明显绕远,不能把“借鉴路面权重”直接等同于“配送最优”。正式参数需用实际订单、骑手入口和运营目标校准。
本节是评估建议,不是本次已执行的生产改造:
当前基础静态需求无需改 OSRM C++ 的结论有机制与夹具证据;完整复刻 Valhalla 或实现动态时间导航则没有这一保证。 本轮没有部署/运行 Valhalla,没有验证两引擎同图同参数的等价路线、台湾机车法规全覆盖、实际配送 ETA、P99 或长期运行容量。
本轮四项评估已验证;生产实现、全量路网更新与线上切换仍未开始。未自动 commit/push。