baldav/docs/session-logs/2026-09-07_brouter-findings.md
4aiman a52e998fb6 BRouter: analysis + embed the offline routing engine (Stage 1)
Analysis in docs/brouter-findings.md: how BRouter knows roads (.rd5
segments), routes and reaches low elevation gain (profile uphill/downhill
cost + kinematics), the three call surfaces, and an evaluation of two ideas
— fill GPS gaps along roads, and offline waypoint route planning. License is
MIT; the engine has no desktop-only deps, so it embeds on Android ART.

Stage 1 (embed + bridge, compiles into the apk; on-device route not yet run):
- vendored brouter-1.6.3-all.jar into the Android module (dexes cleanly) and
  bundled the trekking/shortest profiles + lookups.dat as assets, copied to
  files/brouter/profiles2 on launch
- MainActivity: a brouter_command.txt handler on the existing FileObserver
  runs btools.router.RoutingEngine off the UI thread (recipe taken via javap
  from ServerHandler) and returns the track as GPX
- Rust brouter_route command: same file bridge as GPS (request + command,
  poll for the result), registered in the invoke handler
- frontend/js/router.js: BRouter.route(points, profile) -> GPX (parseRouteGPX)
- LICENSE-brouter (MIT notice) kept alongside the vendored engine

Segments (.rd5, ~13-23 MB per 5x5 tile) are delivered later (Stage 2, wired
download inside BalDav). IMPLEMENTATION_PLAN.md tracks the 5 stages.
2026-09-09 00:56:13 +03:00

3.7 KiB
Raw Blame History

Сессия 2026-09-07: разбор BRouter под две идеи

Контекст

Пользователь спросил, разбирал ли я brouter apk. Не разбирал. В дереве оказался brouter-1.6.3.zip (внутри два apk btools.routingapp, движок brouter-1.6.3-all.jar, профили, доки) и FitPro...apk (не brouter). Цель разбора (уточнена пользователем): понять, как BRouter строит маршруты с малым набором высоты, ради двух идей —

  1. заполнять пропажу GPS кратчайшим путём по дороге; 2) оффлайн-планирование маршрута по точкам в BalDav (замена онлайн-BRouter).

Действия

Работали по утверждённому плану ~/.claude/plans/merry-discovering-dream.md (сохранён смысл ниже; файл планов ротируется). Разбор read-only: листинг архива, чтение доков/профилей через stdout, инспекция jar в памяти (python zipfile из BytesIO), извлечение строк байткода — распаковки на диск и запуска Java не было.

Выяснено: где дорога — сегменты .rd5 (тайлы 5×5°, OSM в битстрим по lookups.dat, высоты из SRTM-90м); роутинг — btools.router.RoutingEngine (matchWaypointsToNodes → поиск по графу, стоимость из профиля btools.expressions); малый набор высоты — параметры профиля uphillcost/downhillcost/cutoff + кинематика (totalMass/S_C_x=CdA/C_r/bikerPower, аналог модели мощности BalDav); shortest.brf — чистый кратчайший путь (под идею 1). Вызов оффлайн: jar RouteServer <segmentdir> <profiledir> <customprofiledir> <port> <maxthreads> + HTTP /brouter?lonlats=..&profile=..&format=geojson; приложение BRouter (Server-Mode HTTP или intent); встраивание jar (356 КБ) в Android-модуль BalDav.

Результат

Создан docs/brouter-findings.md — полный разбор: состав, данные, алгоритм, малый набор высоты, 3 способа вызова + встраивание, обе идеи со стыком к существующему коду (computeStats ветка isGap; showRouteEditor/showRouteDetail/parseRouteGPX/routeElevStats в main.js), таблица вариантов интеграции с рекомендацией (целевой — встраивание движка; сначала проверить ценность на установленном приложении BRouter), открытые вопросы (лицензия abrensch/brouter, сегменты качать/строить, хранилище на телефоне, профили). Реализацию идей НЕ делали — отдельные фичи.

README не трогал: пользовательской фичи пока нет, это анализ. PROJECT_MAP — добавлен раздел «Разборы (docs/)» с указателями на gps-model-findings и brouter-findings.

Следующие шаги

  • Ответы пользователя на открытые вопросы §9 разбора → планировать идею 1 и/или идею 2.
  • Опционально PoC: RouteServer на компе + сегменты региона (нужен JRE + загрузка, по согласию).