Расчёт плоскости штукатурных маяков по облаку точек, снятому с реальной стены тахеометром.
Скрипт отвечает на практический вопрос ремонта: куда выставить маяки на кривой стене, чтобы выровнять её под правило с минимальным расходом смеси и при этом удержать стену в отвесе.
Стена кривая: где-то бугор, где-то западание. Штукатурка ложится по плоскости, которую задают маяки. Плоскость надо выбрать так, чтобы:
- она нигде не резала стену — иначе маяк повиснет в воздухе, а бугор придётся сбивать;
- слой везде был не тоньше самого маяка — иначе маяк не влезет под правило;
- стена вышла практически в отвес — вертикальный завал ограничен;
- суммарный расход смеси был минимальным.
Обычная аппроксимация методом наименьших квадратов тут не работает: она проводит плоскость посередине облака точек, и половина стены оказывается снаружи. Нужна опорная плоскость, целиком лежащая перед стеной и касающаяся самого выступающего бугра. Поэтому задача решается как условная оптимизация с несимметричной целевой функцией.
Плоскость маяков задаётся уравнением
y = a·x + b·z + c
где x — ширина стены, z — высота, y — глубина. Толщина слоя штукатурки в измеренной точке i:
d_i = a·x_i + b·z_i + c − y_i
Отрицательное d_i означает, что плоскость ушла внутрь стены.
scipy.optimize.minimize (метод Нелдера — Мида) подбирает три параметра a, b, c, минимизируя сумму положительных d_i — то есть расход штукатурки. Ограничения задачи реализованы штрафами с весом 100000:
| Штраф | Что ограничивает | Константа |
|---|---|---|
angle_penalty |
наклон плоскости по вертикали | MAX_VERTICAL_ANGLE = 2.0° |
negative_count_penalty |
доля точек, которые плоскость срезает | ALLOWED_NEGATIVE_POINTS_RATIO = 0 (срезать нельзя) |
too_deep_penalty |
глубина среза, если он всё же допущен | MAX_NEGATIVE_DEPTH = 0.015 м |
thickness_penalty |
минимальный слой в положительных точках | MAYAK_THICKNESS = 0.008 м |
Все четыре константы задаются в начале wall.py — под свои маяки и свои допуски правьте там.
Что не ограничено: наклон по ширине (ось X). Он вычисляется и выводится, но в целевую функцию не входит. То есть стена гарантированно встаёт в отвес по вертикали, а в плане плоскость свободно доворачивается — так расход смеси получается меньше. Если стена должна быть строго перпендикулярна смежной, добавьте для a штраф по образцу angle_penalty.
Файл wall_points.csv рядом со скриптом:
point_number,x,y,z
1,0,0,0
2,0,0,1
3,0,0,2
...| Колонка | Смысл | Единицы |
|---|---|---|
point_number |
номер точки (целое) | — |
x |
положение по ширине стены | м |
y |
глубина: насколько точка выступает вперёд | м |
z |
высота над полом | м |
Съёмка ведётся тахеометром в системе координат, привязанной к стене: ось X вдоль стены, Z вверх, Y от стены наружу. Чем гуще сетка точек, тем точнее результат — угловые точки и очевидные бугры снимать обязательно.
Приложенный в репозитории wall_points.csv — синтетический пример: сетка 3×3 с одним выступом 5 см в центре. Замените его своими замерами.
pip install -r requirements.txt
python wall.pyЗависимости: numpy, pandas, scipy.
Скрипт печатает в консоль сводку и таблицу по точкам:
СТАТИСТИКА АНАЛИЗА СТЕНЫ:
==================================================
Параметры стены:
--------------------------------------------------
Ширина стены : 2.00 м
Высота стены : 2.00 м
Площадь стены : 4.00 м²
Параметры маяков:
--------------------------------------------------
Толщина маяка : 8.0 мм
Уравнение плоскости : y = 0.0056x + 0.0117z + 0.0407
Наклон по ширине (ось X) : 0.32°
Наклон по высоте (ось Z) : 0.67°
Параметры штукатурки:
--------------------------------------------------
Минимальная толщина : 8.0 мм
Средняя толщина : 52.4 мм
Максимальная толщина : 75.3 мм
Общий объем штукатурки : 0.210 м³
ТОЛЩИНА ШТУКАТУРКИ ПО ТОЧКАМ:
==================================================
Номер точки X (м) Y (м) Z (м) Толщина (мм)
------------------------------------------------------
1 0.000 0.000 0.000 40.7
2 0.000 0.000 1.000 52.4
3 0.000 0.000 2.000 64.1
4 1.000 0.000 0.000 46.3
5 1.000 0.050 1.000 8.0
6 1.000 0.000 2.000 69.7
7 2.000 0.000 0.000 51.9
8 2.000 0.000 1.000 63.6
9 2.000 0.000 2.000 75.3
Видно, как работает ограничение: бугор 5 см в точке 5 получает ровно MAYAK_THICKNESS = 8 мм — плоскость легла вплотную к нему, но не срезала.
Рабочая выдача — последняя таблица: по ней на объекте выставляются маяки. Строка «Уравнение плоскости» нужна, если вы хотите пересчитать толщину в произвольной точке стены, не только в измеренной.
Объём считается как средняя толщина слоя × площадь стены. Это оценка: она тем точнее, чем равномернее точки замера распределены по стене.