Преобразование координат из локальных в машинные и обратно [РЕШЕНО]

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Преобразование координат из локальных в машинные и обратно [РЕШЕНО]

Сообщение kharpost »

Возникла необходимость преобразования координат из локальных в машинные и обратно. Как это правильно сделать? Ещё интересно, как правильно считать оффсеты и поворот?
Последний раз редактировалось kharpost 28 дек 2023, 14:44, всего редактировалось 1 раз.
vtgmfg
Мастер
Сообщения: 1475
Зарегистрирован: 23 июн 2022, 14:13
Репутация: 55
Настоящее имя: Максим
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение vtgmfg »

через таблицу СК в любом случае.. как она организована и как туда обратиться у всех вероятно по-разному.
в WLmill это несложно делается
alex_sar
Мастер
Сообщения: 1718
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 286
Настоящее имя: Алексей
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение alex_sar »

kharpost писал(а): Возникла необходимость преобразования координат из локальных в машинные и обратно. Как это правильно сделать? Ещё интересно, как правильно считать оффсеты и поворот?
если взять только смещения, то они есть в переменных соответствующих https://linuxcnc.org/docs/html/gcode/ov ... parameters

а если полностью, с g92 и поворотами, то там много букв.

вопрос - а зачем это?
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

alex_sar писал(а): вопрос - а зачем это?
Это нужно для автонастройки на заготовку
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

Пока придумал так:

Код: Выделить всё

o<conv_xyto53> sub

#<x>=#1
#<y>=#2
#<ncs>=#5220
#<xo5x>=#[5201+20*#<ncs>]
#<yo5x>=#[5202+20*#<ncs>]
#<R5x>=#[5210+20*#<ncs>]
#<xo92>=#5211
#<yo92>=#5212

#<xr>=[#<x>+#<xo92>]
#<yr>=[#<y>+#<yo92>]
#<cosr>=[cos[#<R5x>]]
#<sinr>=[sin[#<R5x>]]

#<_res_x>=[#<xr>*#<cosr>-#<yr>*#<sinr>+#<xo5x>]
#<_res_y>=[#<xr>*#<sinr>+#<yr>*#<cosr>+#<yo5x>]

o<conv_xyto53> endsub
M2
Я начинающий пользователь около 2 мес. Может кто знает как это делать правильнее
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

Обратное преобразование:

Код: Выделить всё

o<conv_53toxy> sub

#<ncs>=#5220
#<x53>=#1
#<y53>=#2
#<xo5x>=#[5201+20*#<ncs>]
#<yo5x>=#[5202+20*#<ncs>]
#<R5x>=#[5210+20*#<ncs>]
#<xo92>=#5211
#<yo92>=#5212

#<xr>=[#<x53>-#<xo5x>]
#<yr>=[#<y53>-#<yo5x>]
#<cosr>=[cos[#<R5x>]]
#<sinr>=[sin[#<R5x>]]

#<_res_x>=[#<xr>*#<cosr>+#<yr>*#<sinr>-#<xo92>]
#<_res_y>=[#<yr>*#<cosr>-#<xr>*#<sinr>-#<yo92>]

o<conv_53toxy> endsub
M2
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

vtgmfg писал(а): таблицу СК
А что такое таблица СК?
alex_sar
Мастер
Сообщения: 1718
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 286
Настоящее имя: Алексей
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение alex_sar »

kharpost писал(а): Я начинающий пользователь около 2 мес. Может кто знает как это делать правильнее
ну прекрасно. а цель то какая преобразования, конечная задача?
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

alex_sar писал(а): ну прекрасно. а цель то какая преобразования, конечная задача?
Конечная задача к теме отношения не имеет. Конечная задача такая: закрепил заготовку рамдомно, нажал на кнопку, станок всё,что нужно обмерил и пошёл в работу.
vtgmfg
Мастер
Сообщения: 1475
Зарегистрирован: 23 июн 2022, 14:13
Репутация: 55
Настоящее имя: Максим
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение vtgmfg »

kharpost писал(а): 27 дек 2023, 12:54
vtgmfg писал(а): таблицу СК
А что такое таблица СК?
таблица в которую сведены все смещения, повороты для всех систем координат станка (СК). и там еще может быть другая информация полезная. это не удобно - это архиудобно.
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

Установка смещения СК по типу touch off:

Код: Выделить всё

o<set_touch_off> sub

#<x>=#1
#<y>=#2

o<conv_xyto53> call [#5420] [#5421]
#<x53pre>=#<_res_x>
#<y53pre>=#<_res_y>

o<conv_xyto53> call [#<x>] [#<y>]
#<x53>=#<_res_x>
#<y53>=#<_res_y>

#<ox53>=[#<x53pre>-#<x53>]
#<oy53>=[#<y53pre>-#<y53>]

#<ncs>=#5220
#<_res_x>=[#[5201+20*#<ncs>]+#<ox53>]
#<_res_y>=[#[5202+20*#<ncs>]+#<oy53>]

g10 l2 p0 x#<_res_x> y#<_res_y>

o<set_touch_off> endsub
M2
vtgmfg
Мастер
Сообщения: 1475
Зарегистрирован: 23 июн 2022, 14:13
Репутация: 55
Настоящее имя: Максим
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение vtgmfg »

kharpost писал(а): Конечная задача такая: закрепил заготовку рамдомно, нажал на кнопку, станок всё,что нужно обмерил и пошёл в работу.
это тогда станку нужно зрение и ИИ. и то нужно указать что является заготовкой.
наверное речь идет о привязке СК?
lazymiller
Новичок
Сообщения: 30
Зарегистрирован: 27 дек 2011, 22:58
Репутация: 4
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение lazymiller »

#<_abs_x> - Return current absolute X coordinate (G53) including no offsets.

#<_abs_y> - Return current absolute Y coordinate (G53) including no offsets.

#<_abs_z> - Return current absolute Z coordinate (G53) including no offsets.

#<_abs_a> - Return current absolute A coordinate (G53) including no offsets.

#<_abs_b> - Return current absolute B coordinate (G53) including no offsets.

#<_abs_c> - Return current absolute C coordinate (G53) including no offsets.
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

lazymiller писал(а): #<_abs_x> - Return current absolute X coordinate (G53) including no offsets.
Это координаты, на которых сейчас стоит инструмент. Что делать, если нужны координаты внутри заготовки? Да и как-то не правильно гонять станок, что бы просто преобразовать координаты.
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

vtgmfg писал(а): наверное речь идет о привязке СК?
О привязке с поворотом нескольких СК.
alex_sar
Мастер
Сообщения: 1718
Зарегистрирован: 28 авг 2018, 17:13
Репутация: 286
Настоящее имя: Алексей
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение alex_sar »

kharpost писал(а): Конечная задача к теме отношения не имеет.
...
станок всё,что нужно обмерил и пошёл в работу.
так он когда обмерять будет, вот тогда можно и нужно абсолютные координаты и брать.
зачем туда сюда гонять G54 да ещё и с поворотами.
потом от результатов измерения (снятых в G53) сделать смещение и поворот СК.

так что мне всё равно не понятно, зачем бы это нужно было решать именно поставленную задачу.
kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

alex_sar писал(а): зачем туда сюда гонять G54 да ещё и с поворотами.
Для упрощения УП и повышения читабельности. Сложные расчёты в УП плохо читаются.
Я уже сказал, что постановка задачи к теме отношения не имеет. Мне понадобилось - я спросил. Кому-то это за всю жизнь не понадобится. Мне нужно.
Аватара пользователя
hmnijp
Мастер
Сообщения: 1722
Зарегистрирован: 20 авг 2017, 15:02
Репутация: 526
Настоящее имя: Константин
Откуда: Ульяновск
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение hmnijp »

kharpost писал(а): 27 дек 2023, 12:47 Пока придумал так:

Код: Выделить всё


#<yo5x>=#[5202+20*#<ncs>]

Я начинающий пользователь около 2 мес. Может кто знает как это делать правильнее
Да в целом все +- так и считают в линуксе, по этой формуле с умножением на 20... ты на правильном пути.
#probeZAbs = #probeZ(#5063) + #[5203 + [20 * #5220]]


Можешь здесь ещё глянуть как пример макросы неплохие для измерений (начальные переменные там заполняются из специального gui при активации)
https://github.com/kcjengr/probe_basic/ ... ubroutines

или вот как пример мой код простой для поворота системы координат по двум точкам ортогонально заготовке, тебе наверное оно и нужно?:
o<autorot> call [1] - сохранение первой точки, она же будет центр вращения.
o<autorot> call [2] - сохраняем вторую точку на прямой прямой стороне заготовки
[3] - считает угол поворота, вектор смещения wcs (тк поворот вокруг точки, а не просто нуля), автоматом выравнивает систему координат вдоль ближайшей по углу оси координат.
[0] - возвращаем сохраненную wcs обратно как было

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

Код: Выделить всё

o<autorot> sub

(o<autorot> call [n])
(n=1 - save 1st center point)
(n=2 - save 2nd point)
(n=3 - auto alignment X or Y axis)
(n=4 - manual rotation around 1st point. 0 anagle = X+ axis  )
(n=0 - restore offsets)



O102 if [#1 EQ 1]
#<_p1x> = #<_x>
#<_p1y> = #<_y>
(debug, save 1st point = #<_p1x> ; #<_p1y>)


O102 elseif [#1 EQ 2]
#<_p2x> = #<_x>
#<_p2y> = #<_y>
(debug, save 2nd point = #<_p2x> ; #<_p2y>)

O102 elseif [[#1 EQ 3] OR [#1 EQ 4]] 
#<_wcsnum>  = #5220 
#<_wcsstartind> = [5201 + 20 * #<_wcsnum> ] 
#<_wcsoffx> = #[#<_wcsstartind>]
#<_wcsoffy> = #[1+#<_wcsstartind>]
#<_wcsoffr> = #[10+#<_wcsstartind>]

(debug, WCS=#<_wcsnum>, Xoff=#<_wcsoffx>, Yoff=#<_wcsoffy>)

#<_dx> = [#<_p2x> - #<_p1x>]
#<_dy> = [#<_p2y> - #<_p1y>]
#<_ang> = atan[#<_dy>]/[#<_dx>]


(automatic detection of the alignment axis)
O103 if [#1 EQ 3]

O104 if [[#<_ang> GT 135]  OR [#<_ang> LT -135]] 
#<_ang> = [180 + #<_ang> ]
O104 elseif [[#<_ang> GT 45]  AND [#<_ang> LT 135]]
#<_ang> = [ #<_ang> - 90]
O104 elseif [[#<_ang> LT -45]  AND [#<_ang> GT -135]]
#<_ang> = [90 + #<_ang> ]
O104 endif
(debug, auto change rot angle = #<_ang>)

O103 else
(debug, rot angle = #<_ang>)
O103 endif



#<_vx> = [#<_p1x> * COS[#<_ang>] - #<_p1y> * SIN[#<_ang>] - #<_p1x>]
#<_vy> = [#<_p1x> * SIN[#<_ang>] + #<_p1y> * COS[#<_ang>] - #<_p1y>]
(debug, wcf off vector = #<_vx>;#<_vy>)

#<_newwcsoffx> = [#<_wcsoffx> - #<_vx>]
#<_newwcsoffy> = [#<_wcsoffy> - #<_vy>]
#<_newwcsoffr> = #<_ang>

G10 L2 P0 X[#<_newwcsoffx>] Y[#<_newwcsoffy>]
G10 L2 P0 R[#<_newwcsoffr>]


O102 elseif     [#1 EQ 0]
(debug, restore wcs)
G10 L2 P0 X[#<_wcsoffx>] Y[#<_wcsoffy>]
G10 L2 P0 R0

O102 endif


o<autorot> endsub
m2


kharpost
Кандидат
Сообщения: 72
Зарегистрирован: 03 дек 2023, 09:37
Репутация: 0
Настоящее имя: kharpost
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение kharpost »

hmnijp писал(а): или вот как пример мой код простой для поворота системы координат по двум точкам ортогонально заготовке, тебе наверное оно и нужно?
Это решается просто и было сделано за 10 мин. Потом выяснилось центроискатель не поцентру и это надо компенсировать, Потом выяснилось, что заготовки очень кривые и центровочное отверстие не по центру и это тоже надо компесировать. Пока доволен. Удаётся мерить с погрешностью не более 0,003, при биении центроискателя 0,15
Есть какой нибудь способ подавить сообщение, что ось z выходит за пределы? не даёт пошагово ходить.
Аватара пользователя
hmnijp
Мастер
Сообщения: 1722
Зарегистрирован: 20 авг 2017, 15:02
Репутация: 526
Настоящее имя: Константин
Откуда: Ульяновск
Контактная информация:

Re: Преобразование координат из локальных в машинные и обратно

Сообщение hmnijp »

kharpost писал(а): Есть какой нибудь способ подавить сообщение, что ось z выходит за пределы? не даёт пошагово ходить.
сообщения от того что у вас концевиков нет и нормально нстароенных софтлимитов, или из-за того что у вас от скриптов измерений накапливаются длинные хода в интерпретаторе и на это ругается?
если второе, то делается это так:
(для просмотра содержимого нажмите на ссылку)
В общем, если хотите чтобы ваши скрипты "remap/измерения инструмента/пробинга" и тп не показывали свою траекторию в окне gcode preview, не ломали предпросмотр из-за g38, не засоряли предпросмотр программы своими многочисленными переходами, добавляйте в начало вашего скрипта:

Код: Выделить всё

o100 if [#<_task> EQ 0]
o<your-script-name> return
o100 endif
либо

Код: Выделить всё

o100 if [#<_task> EQ 0]
    (какой-нибудь код для "симуляции" действий, только чтобы обмануть предпросмотр)
o100 else
    (реальный код измерения)
O100 endif
Работает по прицнипу: пропускаем подпрограмму если она вызвана не процессом milltask (#<_task> ≠ 1) , то есть не во время реального выполнения программы. Cоответственно интерпретатор предпросмотра будет их пропускать и не будет отрисовывать.
Ответить

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