Автоуровень кровати: алгоритм с компенсацией кривизны

Обсуждение технологии печати на 3D принтерах. Самостоятельное изготовление и приобретение. RepRap и его последователи.

Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение setar » 14 июл 2015, 19:20

я вчера до 3 ночи черепил по этому вопросу, пилил прошивку марлина.
тут есть над чем подумать и посоветоваться.
сейчас не проблема получить матрицу параметров контрольных точек стола.
не проблема построить усредненную плоскость которая будет пересекать всю поверхность стола, и привести к ней виртуальное "скомпенсированное" пространство.
вот только усредненная плоскость в некоторых местах отходит от стола на значительное расстояние, а в некоторых перекрывает сопло, так что пластик не выдавить.

можно поднять расстояние немного от стола, тогда не будет перекрытия, но и удаленные точки станут еще дальше.

можно попытаться сделать кривую поверхность которая точно прилегает к столу, но беда в том что у нее в каждой точке своя нормаль и вертикальные и параллельные стенки модели перестанут быть таковыми.
...
в общем вопросов больше чем ответов.
причем дело даже не в реализации кода, а в выработке правильного подхода к алгоритму автоуровня
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Автоуровень кровати: ёмкостной датчик расстояния

Сообщение dccharacter » 14 июл 2015, 20:06

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

...если только ты не напечатаешь плоскость на кривом столе до того, как печатать модель
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Автоуровень кровати: ёмкостной датчик расстояния

Сообщение TedBeer » 15 июл 2015, 00:22

setar писал(а):можно попытаться сделать кривую поверхность которая точно прилегает к столу, но беда в том что у нее в каждой точке своя нормаль и вертикальные и параллельные стенки модели перестанут быть таковыми

dccharacter писал(а):...если только ты не напечатаешь плоскость на кривом столе до того, как печатать модель

Мне видится следующий вариант - постепенная компенсация кривизны. Скажем толщина слоя 0.25мм Тогда за один слой мы можем компенсировать, скажем, 0.1мм
Т.е. мы печатаем по кривой поверхности, но там где она выпирает, мы хотендом размазываем на 0.1мм ниже и тем самым после первого слоя перепад уменьшится. И т.д. - за 10 слоев мы можем компенсировать целый мм.
Представьте себе геодезические линии. Это вот наша кривая поверхность.
topomap.jpg
Мы как бы на каждом слое вдавливаем вершины нашей поверхности и постепенно выводим её в ноль.
Аватара пользователя
TedBeer
 
Сообщения: 1129
Зарегистрирован: 08 авг 2012, 00:38
Откуда: Нидерланды, Алмере
Skype: edwbes
ФИО: Эдуард

Re: Автоуровень кровати: ёмкостной датчик расстояния

Сообщение kindrat » 15 июл 2015, 10:31

Для Cartesian принтеров добавляется еще одна точка кривизны - прогиб направляющих. И в центре каждой оси прогиб направляющих может быть интерпретирован датчиком автоуровня как кривизна стола. По хорошему, прогибы тоже нужно как-то измерять и учитывать.
kindrat
 
Сообщения: 207
Зарегистрирован: 13 мар 2013, 14:31
Откуда: Химки

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение setar » 15 июл 2015, 13:25

Давайте о терминах договоримся - удобнее будет обсуждать.

реальные координаты XYZ - базовые без использования математики автоуровня, доступны для вычисления через число шагов * коэфициент мм/шаг

результаты замера стола в прошивке хранятся так:
eqnBVector[probePointCounter] = measured_z;
eqnAMatrix[probePointCounter + 0 * abl2] = xProbe;
eqnAMatrix[probePointCounter + 1 * abl2] = yProbe;
eqnAMatrix[probePointCounter + 2 * abl2] = 1;
где:
probePointCounter - порядковый номер точки замера. Нумеруется от 0,0 слева направо, затем линия выше на один шаг тоже слева направо и т.д.
abl2 - количество точек замера (квадрат числа точек по одной стороне)

базовая плоскость (plan_bed_level_matrix) - плоскость построенная как средняя проходящая по массиву точек снятых с реальной поверхности стола. Может содержать как отрицательные значения относительно реальной поверхности так и положительные (может "углублять" сопло в стол и печатать в воздухе)

нулевая плоскость - плоскость идеально ровного стола, все точки Z стола в реальных координатах равны нулю

скомпенсированная плоскость - плоскость находящаяся выше базовой на расстоянии достаточном для постепенной компенсации неровностей кровати. выше ее расстояния реальны (1мм=1мм), а ниже расстояния скомпенсированны таким образом чтобы сопло дошло до реального стола. Например скомпенсированная плоскость находится на высоте 1мм от базовой, и в этой точке до стола 1.2 мм, значит для линейных перемещений будет применяться коэфициент 1.2 и перемещение на 0.1мм будет преобразовано в 0.12 реального перемещения.

повернутые координаты X'Y'Z' - координаты получаемые для точки модели XYZ приложением матрицы поворота относительно базовой плоскости apply_rotation_xyz(plan_bed_level_matrix, x, y, z); показывают в какой точке реальных координат будет находиться модель стоящая на базовой плоскости

я тоже думал про постепенную компенсацию на первых слоях миллиметрах (прошивка про слои ничего не знает)
для анализа минимальной необходимой высоты для первого плоского уровня есть информация о кривизне кровати,
но нету информации о диаметре сопла, чтобы вычислить какой может быть слой.
А вот нужно ли знать диаметр сопла чтобы рассчитать компенсацию ?
Ведь по идее можно компенсировать линейное расстояние на какой то процент , например 10 или 20.
Тогда при неровности кровати в 1мм (расстояние между максимальной и минимальной точкой относительно базовой плоскости)
для 10% на скомпенсированную плоскость можно выйти через 10мм а при 20% через 5 мм.
И соответственно для слоя 0.2
10% ,будет давать разброс в реальных координатах от 0.18 до 0.22, и выход на линейные размеры через 50 слоев (10мм)
20% ,даст разброс от 0.16 до 0.24 и выход на линейные размеры через 25 слоев (5мм)
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение dccharacter » 15 июл 2015, 21:58

А слабо замерить кривизну реального стола и выложить поверхность тут?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение setar » 15 июл 2015, 22:13

минуту назад этим занимался:
Код: Выделить всё
G29 Auto Bed Leveling
Measured zPosition=-0.14861
Measured zPosition=-0.15181
Bed X: 5.000 Y: 5.000 Z: 0.100 FSR: 990
Measured zPosition=0.17705
Measured zPosition=0.18552
Bed X: 187.000 Y: 5.000 Z: 0.431 FSR: 986
Measured zPosition=-0.56068
Measured zPosition=-0.55761
Bed X: 369.000 Y: 5.000 Z: -0.309 FSR: 991
Measured zPosition=-0.33449
Measured zPosition=-0.32541
Bed X: 5.000 Y: 145.000 Z: -0.080 FSR: 995
Measured zPosition=-0.16159
Measured zPosition=-0.12650
Bed X: 187.000 Y: 145.000 Z: 0.106 FSR: 991
Measured zPosition=-0.54780
Measured zPosition=-0.52345
Bed X: 369.000 Y: 145.000 Z: -0.286 FSR: 993
Measured zPosition=-1.03071
Measured zPosition=-1.01365
Bed X: 5.000 Y: 285.000 Z: -0.772 FSR: 994
Measured zPosition=-0.40510
Measured zPosition=-0.39202
Bed X: 187.000 Y: 285.000 Z: -0.149 FSR: 991
Measured zPosition=-0.83164
Measured zPosition=-0.82368
Bed X: 369.000 Y: 285.000 Z: -0.578 FSR: 993
Eqn coefficients: a: -0.00038470 b: -0.00204801 d: 0.19822214
Mean of sampled points: -0.17067751

Bed Height Topography:
+-----------+
|...Back....|
|Left..Right|
|...Front...|
+-----------+
-0.60150 +0.02212 -0.40698
+0.09073 +0.27663 -0.11495
+0.27047 +0.60196 -0.13847

Corrected Bed Height vs. Bed Topology:
-0.17068 +0.45294 +0.02384
+0.52155 +0.70746 +0.31588
+0.70129 +1.03278 +0.29236
planeNormal x: 0.000385 y: 0.002048 z: 1.000000

Bed Level Correction Matrix:
+1.000000 +0.000000 -0.000385
-0.000001 +0.999998 -0.002048
+0.000385 +0.002048 +0.999998
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение dccharacter » 15 июл 2015, 23:11

То есть у тебя разница в 3-4 слоя по всей площади стола?
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение setar » 15 июл 2015, 23:17

да,
учитывая что стол большой (400x300) и совсем нерегулируемый, это обычный факт.
потому автоуровень и пилю
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение dccharacter » 15 июл 2015, 23:52

Ничего мне в голову не приходит, кроме как постепенного зажатия слоя в местах выпуклостей.
Т.е. инструмент идет над волнистой поверхностью - в ямах на обычной высоте, на выпуклостях почти впритир, размазывая филамент по столу.
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.
Аватара пользователя
dccharacter
 
Сообщения: 4995
Зарегистрирован: 10 дек 2010, 13:16
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение om2804 » 16 июл 2015, 01:30

Без движения 3х осей одновременно ничего не выйдет хорошего. Так как, грубо говоря, нам нужно огибать все неровности поверхности.
Зависание по XY и поднимание/опускание головы займёт. А это подтёки и обрывы нити
Аватара пользователя
om2804
 
Сообщения: 2044
Зарегистрирован: 30 апр 2012, 20:03
Откуда: Архангельск
Skype: om2804
прог. языки: С/С++/C#

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение setar » 16 июл 2015, 01:40

никаких подтеков и обрывов, движение по Z очень мелкое и работает уже сейчас

Добавлено спустя 25 секунд:
допилю - сниму видео
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение 3DPrinter » 16 июл 2015, 10:45

немного отсебятины...
Для начала алгоритм должен отталкиватся от верхней точки, не допуская знакомства сопла с поверхностью стола.
Раз прошивка не знает о слоях, значит нужно отталкиваться от максимальной разницы между верхней и нижней точкой платформы.
замеряем эту разницу, добавляем 100 микрон и получаем ту высоту в пределах которой стоит делать корректировку
Данную высоту считаем шагами оси зет. После достижения нужно количество шагов корректировку стоит отключать дабы не искажать изделие.
Сама корректировка - это алгоритм увеличения/уменьшения подачи пластика. То есть вводим коэффициент на количество шагов экструдера. Играем в пределах 30-170%. В местах впадин опускаем зет на стандартный зазор (например 200 микрон или процент от чего-то) от нуля умноженный на 2 и давим 170% пластика. В местах холмов наоборот. Уменьшаем стандартный зазор на 50% и давим 30% пластика.
Как дошли до верхней точки + 100 микрон прекращаем вносить поправки в G-code

--------------------------------------------------------------
Альтернативный вариант - ровнять поверхность под объектом. Строим ровный фундамент под деталью. Для этого циклично повторяем первый слой пока не выравняем поверхность. При каждом повторении давим больше во впадинах, меньше в выемках и так пока ось зет не поднимется до верхней точки. Первым слоем считаем G-code пока ось Z не сместится вниз. Как только в коде видим команду на смещение вниз идем на второй круг. Когда произведем выравнивание поверхности запускаем код заново уже без поправок считая нулем верхнюю точку платформы. В итоге объект строится красиво и без искажений.

Все это ИМХО конечно.
Аватара пользователя
3DPrinter
 
Сообщения: 603
Зарегистрирован: 23 янв 2014, 01:13
Откуда: Украина. Киев.
Skype: kiev_3dprinter
ФИО: Печать трехмерная

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение ursus » 16 июл 2015, 13:28

А кривизна стола всегда постоянная или меняется со временем? Наиболее точный вариант, имхо ессно, это как то передавать кривизну стола в слайсер, что бы он компенсировал кривизну.
ZAV MAX Pro V1. ZAV mini.
ursus
 
Сообщения: 267
Зарегистрирован: 27 авг 2014, 02:11
Откуда: Тольятти
ФИО: Михаил

Re: Автоуровень кровати: алгоритм с компенсацией кривизны

Сообщение setar » 16 июл 2015, 13:29

она немного плавает со временем и температурой
Аватара пользователя
setar
Site Admin
 
Сообщения: 10989
Зарегистрирован: 04 окт 2004, 12:58
Откуда: St.Petersburg
Skype: taranenko.sergey
ФИО: Сергей Тараненко

След.

Вернуться в 3D печать

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 19