Ось пути: замерил устойчивость и горизонт, оговорка к дальним цифрам

This commit is contained in:
Данил Омелечко 2026-09-22 14:55:26 +03:00
parent af317803ab
commit 329df21fce

View file

@ -1570,3 +1570,63 @@ P@150 0.32), а на всём, что меньше, — заметно хуже:
четвертью ложных треков на обеих сценах. Механизм оставлен в коде выключенным
(`near_long: 0`): на линии без платформ у самого габарита он может оказаться
дешевле — но проверять это надо замером на той линии.
## 13. Ось пути вдаль: устойчивость, горизонт и чего полигон не мерит
В общем чате организаторов участники пишут, что не могут устойчиво вести
путь с габаритом за 100 м — «облако очень разрежённое». Посылка верна:
рельсы на 100 м дают единицы точек. Мы их и не прослеживаем — ось берётся
из **дрейфа центра сечения тоннеля** с дальностью, а свод даёт тысячи точек
там, где рельсы не дают ничего.
Замер устойчивости: сдвиг оси в одной и той же точке пути между соседними
кадрами, 160 кадров на бэг.
| бэг | ось видна до | скачок @100 м, медиана/p90 | @150 м | ошибка касательной @150 |
|---|---:|---:|---:|---:|
| `doubleT_platform` | 86 м | 0.07 / 0.35 м | 0.10 / 0.67 | 0.16 м |
| `roundT_doubleT` | 107 м | 0.08 / 0.33 | 0.18 / 0.65 | 0.30 |
| `roundT_pressureGate_roundT` | 77 м | 0.07 / 0.31 | 0.11 / 0.85 | 0.51 |
| `roundT_squareT_pressureGate_squareT` | 69 м | 0.01 / 0.04 | 0.02 / 0.09 | 0.33 |
| `squareT_platform_squareT_switch` | 62 м | 0.04 / 0.28 | 0.05 / 0.57 | 0.91 |
На 100 м ось **не перескакивает**: худший p90 — 0.35 м при полуширине
габарита 1.6 м. Настоящее ограничение другое: сечение наблюдается только до
62–107 м, дальше ось продолжается касательной, и касательная расходится с
кривой до 1.19 м на 150 м.
### 13.1. Почему не продолжать кривизну
Напрашивается продолжать за горизонт не касательную, а измеренную кривизну:
железнодорожная кривая — длинная дуга постоянного радиуса. Проверено:
| бэг | разброс c₂ по кадрам (p10…p90) | расхождение на 150 м |
|---|---:|---:|
| `doubleT_obstacle` | 1.4·10⁻⁴ | 0.77 м |
| `doubleT_platform` | 3.9·10⁻⁴ | 0.70 м |
| `roundT_doubleT` | 10.3·10⁻⁴ | 1.87 м |
| `roundT_pressureGate_roundT` | 7.7·10⁻⁴ | **5.03 м** |
| `roundT_squareT_pressureGate_squareT` | 0.9·10⁻⁴ | 0.58 м |
| `squareT_platform_squareT_switch` | 8.0·10⁻⁴ | **6.25 м** |
Кривизна оценивается на коротком плече (до 62–107 м) и гуляет между кадрами;
её продолжение до 150 м даёт до 6 м расхождения против 0.16–1.19 м у
касательной. Нынешнее поведение `Corridor.centre` — линейное продолжение по
касательной — **лучшее из двух**, и теперь это подтверждено замером, а не
только рассуждением в комментарии.
### 13.2. Чего размеченный полигон не мерит
Предмет вставляется в точку `corridor.centre(d) + смещение`, то есть **на
нашу же оценку оси**. Поэтому полигон по построению не может обнаружить
ошибку оси: где бы мы ни считали путь, предмет окажется там же.
В эксплуатации это не так. Настоящий предмет стоит на настоящем пути, и на
150 м он может оказаться в 0.16–1.19 м от того места, где мы путь считаем —
при полуширине габарита 1.6 м этого хватает, чтобы предмет у края габарита
выпал за него. Дальние цифры полигона поэтому **оптимистичны по этой
причине**, и честно это назвать: не из-за алгоритма обнаружения, а из-за
того, что дальше 62–107 м мы путь не наблюдаем, а продолжаем.
Закрыть это можно только видимостью: накопление по кадрам не поможет,
потому что за горизонтом прямой видимости данных нет ни в одном кадре.