Skip to content

Latest commit

 

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 

Repository files navigation

wall-slope

Python

Расчёт плоскости штукатурных маяков по облаку точек, снятому с реальной стены тахеометром.

Скрипт отвечает на практический вопрос ремонта: куда выставить маяки на кривой стене, чтобы выровнять её под правило с минимальным расходом смеси и при этом удержать стену в отвесе.

Задача

Стена кривая: где-то бугор, где-то западание. Штукатурка ложится по плоскости, которую задают маяки. Плоскость надо выбрать так, чтобы:

  • она нигде не резала стену — иначе маяк повиснет в воздухе, а бугор придётся сбивать;
  • слой везде был не тоньше самого маяка — иначе маяк не влезет под правило;
  • стена вышла практически в отвес — вертикальный завал ограничен;
  • суммарный расход смеси был минимальным.

Обычная аппроксимация методом наименьших квадратов тут не работает: она проводит плоскость посередине облака точек, и половина стены оказывается снаружи. Нужна опорная плоскость, целиком лежащая перед стеной и касающаяся самого выступающего бугра. Поэтому задача решается как условная оптимизация с несимметричной целевой функцией.

Как работает

Плоскость маяков задаётся уравнением

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 мм — плоскость легла вплотную к нему, но не срезала.

Рабочая выдача — последняя таблица: по ней на объекте выставляются маяки. Строка «Уравнение плоскости» нужна, если вы хотите пересчитать толщину в произвольной точке стены, не только в измеренной.

Объём считается как средняя толщина слоя × площадь стены. Это оценка: она тем точнее, чем равномернее точки замера распределены по стене.

About

Calculates the position of beacons for wall alignment based on total station measurements

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages