Помогите с алгоритмом аппроксимации кривых B-сплайнами

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Гармонист
Почётный участник
Почётный участник
Сообщения: 423
Зарегистрирован: 24 апр 2011, 09:14
Репутация: 72
Откуда: планета Земля
Контактная информация:

Помогите с алгоритмом аппроксимации кривых B-сплайнами

Сообщение Гармонист »

возникновение проблемы тут
Проблема: image-to-gcode посредством скрипта autors.py - создает не очень гладкий g-код.
(если задать не так много точек, то код получается гладкий, но я хочу получить изделие которое не требует шлифовки, поэтому шаг беру маленький 0.0875мм и получается вот что)
author.png (3125 просмотров) <a class='original' href='./download/file.php?id=31680&mode=view' target=_blank>Загрузить оригинал (25.09 КБ)</a>
Т.к. ПО ЧПУ развивается в направление B-сплайнов
вот пример задания g-кода b-сплайном, а не дугами в LinuxCNC:
axis_nurb.jpg (3125 просмотров) <a class='original' href='./download/file.php?id=31682&mode=view' target=_blank>Загрузить оригинал (64.56 КБ)</a>
butterfly.ngc
бабочка g-код задается NURBS кривыми.
если твое ПО открывает этот файл - значит поддерживает сплайны
(1.67 КБ) 767 скачиваний
Решение: решил написать новый алгоритм создания g-кода, а именно:
нужно разобраться с алгоритмом аппроксимации массива точек - B-сплайном, описанный Xunnian Yang.
Оригинал на английском.

Вот только я в математике и английском - не силен... :monkey:
А тема важна для всех писателей CAM-ов! Они могли бы реализовать генерацию g-кодов в виде сплайнов, а не только в виде дуг.

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

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

Суть алгоритма: берем набор точек(или любую кривую и ставим на ней точки очень часто) и касательные в этих точках,
берем первые m точек - строим кубическую криву Безье - проверяем:
1) вложились в заданную точность E1
2) количество изгибов на кривой Безье получилось не больше чем в оригинальной выборке

- если нет - то уменьшаем диапазон m
-иначе - все ок - принимаем полученную кривую Безье - берем следующие m точек...

- полученные кубические кривые Безье преобразовываем в B-сплайн - путем деления каждой пары на 3и сегмента с точностью E2 - вот так:
Merge two G1 continuous cubic Bézier curves to a cubic B-spline curve: <br />(a) the joint point is local convex and (без перегиба)<br />(b) the joint point is dealt as an inflexion (с перегибом в точке совмещения 2х сегментов) (3120 просмотров) <a class='original' href='./download/file.php?id=31685&mode=view' target=_blank>Загрузить оригинал (158.44 КБ)</a>
Merge two G1 continuous cubic Bézier curves to a cubic B-spline curve:
(a) the joint point is local convex and (без перегиба)
(b) the joint point is dealt as an inflexion (с перегибом в точке совмещения 2х сегментов)
Вот что у него получилось:
Результаты автоматической аппроксимации любой кривой B-сплайном <br />Xunnian Yang and Chongyang Deng (3125 просмотров) <a class='original' href='./download/file.php?id=31683&mode=view' target=_blank>Загрузить оригинал (174.62 КБ)</a>
Результаты автоматической аппроксимации любой кривой B-сплайном
Xunnian Yang and Chongyang Deng
Обратите внимание на сглаживание и на сжатие - то сколько было точек(серенькие) и сколько стало(синие крестики).
http://cnc-club.ru/forum/viewtopic.php?t=1064 - домашний станок типа "рука"
http://cnc-club.ru/forum/viewtopic.php?t=1107 - быстро создать 3d образ без сканера по фоткам
http://cnc-club.ru/forum/viewtopic.php?t=1073 - прогноз станко-строения
http://livehistory.ru - мозаика складывается
http://www.economics.kiev.ua - почему все так в нашем мире
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Помогите с алгоритмом аппроксимации кривых B-сплайнами

Сообщение Nick »

мММм... я б не стал пока к бисплайнам лезть - сложные они, плюс не все их хорошо обрабатывают. Плюс lookahead на них может не будет работать... в общем есть в них и плюсы и минусы...

Лучше по глубже разобраться откуда такие скачки берутся.....
Аватара пользователя
mhael
Мастер
Сообщения: 2443
Зарегистрирован: 09 мар 2013, 11:22
Репутация: 769
Настоящее имя: Ильдар
Контактная информация:

Re: Помогите с алгоритмом аппроксимации кривых B-сплайнами

Сообщение mhael »

Кстати вопрос по теме. Сервопривод обрабатывает поступающие управляющие сигналы с определенной периодичностью. Во время каждого цикла серва не может двигать приводом разноускоренно. Т.е. ускорение на одном цикле постоянное. В свою очередь идеально точное движение по B-сплайнам представляется мне совсем не равноускоренным. Это получается, что построив кривую, близкую к оригинальному чертежу и вписывающуюся в допуски, мы должны её еще поделить на участки, которые будут обрабатываться в одном цикле и быть равноускоренными и в то же время близкими к этой самой кривой? Тогда же мы получим в итоге приближенную кривую к приближенной кривой? И что тогда будет с этими самыми допусками? Или я чего-то не понимаю?
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: Помогите с алгоритмом аппроксимации кривых B-сплайнами

Сообщение Nick »

То-то и оно, что допуски там минимальные. Сервопериод - 1мс. Действительно серва на этом отрезке двигается равноускоренно, а шаговик, по крайней мере, если это LinuxCNC, так вообще с постоянной скоростью. Но т.к. средение скорости обработки редко превышают 10м мин то расстояние которое пройдет серва за этот отрезок мало (0,16мм при 10м/мин). Также на таких скоростях обычно делают черновую оюработку, чистовая проходит медленнее -=> точность на ней выше.
Аватара пользователя
torvn77
Мастер
Сообщения: 2442
Зарегистрирован: 02 июн 2012, 22:12
Репутация: 215
Откуда: Россия,Санкт-Петербург
Контактная информация:

Re: Помогите с алгоритмом аппроксимации кривых B-сплайнами

Сообщение torvn77 »

Гармонист писал(а): -иначе - все ок - принимаем полученную кривую Безье - берем следующие m точек...
А почему не добавляем К точек с проверкой на выход за пределы погрешности?
Зачем плодить лишние узлы?
Ответить

Вернуться в «LinuxCNC»