Перейти к публикации

G-POST, много вопросов. Хочется понять логику работы.


DJ Astro

Рекомендованные сообщения

Bastion, немного непонятен вопрос - где выводится угол А? В последующих кадрах перемещений или после обработки КАМЕРЫ в цикле PLANE SPATIAL ? Вопрос в том, зачем выводится А0, если поворот только по B-90, так?

 

DJ Astro, после обработки КАМЕРЫ. Обрабатываю деталь с циклом PLANE SPATIAL (в Sinumerik - CYCLE800). Наклоняю деталь на -90 по оси B и потом по оси А на 23 градуса - выводит в цикле только B-90, А0, наклоняю по В на -90, по А на 45, выводит только В-90 и так далее. 

Может какой-то предельный случай с 90 градусами? Потому что ради эксперимента поставил -89,9 градуса - вывел и А23 и В-89,9. Вопрос - как усовершенствовать алгоритм, чтобы обойти это ограничение? 

 

Да, все верно - cos90 равен нулю и поэтому atan2f(YK,ZK) не считается и значение обнуляется ((( Есть идеи как это победить? 

 

П.С. Всех с Днем Победы!!! 

Ссылка на сообщение
Поделиться на других сайтах


Bastion, еще раз перепроверил, сделал обработку на кубике на всех гранях - все углы выводит, всё правильно рассчитывает.

Пробовал 2 варианта:

1. СК всей операции в центре верхней грани (плоскости XY, YZ, ZX системы координат параллельны ребрам кубика), локальные СК на вертикальных ребрах ниже верхней грани. В этом случае все повороты кратны 90.

2. СК всей операции в центре верхней грани (СК дополнительно повернута относительно Z на некоторый угол), локальные СК на вертикальных ребрах ниже верхней грани. В этом случае в выводимых углах появляется этот небольшой угол.


вот модель, правда в Creo 3.0. Не знаю, сможете открыть или нет.

camera.ZIP

Изменено пользователем DJ Astro
Ссылка на сообщение
Поделиться на других сайтах

Можете посмотреть мою обработку (тоже в Крео 3)? part1.rar А вашей модели почему-то не видно, может вы её не загрузили? 

 

Ссылка на сообщение
Поделиться на других сайтах

Да, в моём варианте обработки для проверки правильности работы кода таких вариантов не встретилось (когда B=+-90). А проверка правильности расчетов в экселе оказалась не совсем правильной. Для проверки я задавал углы, по ним вычислял матрицу поворота и затем обратно по матрице вычислял углы. Раз значения совпадали значит всё ОК!  Только теперь, когда начал разбираться понял, что при вычислении матрицы, там где должны были быть нули получались очень маленькие числа типа 0,11Е-17, (но не ноль!). И поэтому при обратных вычислениях исходные углы вычислялись правильно, а не обнулялись. А я сразу не придал значения этому... :(

 

Bastion, добавил в код для CAMERA такие условия для проверки предельных случаев:

теперь ваша обработка работает правильно

....

.....

AVAL=ATAN2F(YK,ZK) $$ plane spatial A
BVAL=ASINF(-XK) $$ plane spatial B
CVAL=ATAN2F(XJ,XI) $$ plane spatial C
IF (XK.EQ.-1) THEN $$ if B=90
 CVAL=ASINF(YI)
ELSE
  IF (XK.EQ.1) THEN $$ if B=-90
    CVAL=ASINF(-YI)
  ENDIF

ENDIF 

AVAL=TEXT/CONVF,AVAL,10,5,1,0,5 $$ convert to text
BVAL=TEXT/CONVF,BVAL,10,5,1,0,5
CVAL=TEXT/CONVF,CVAL,10,5,1,0,5

.....

...

В этих случаях А будет всегда =0, а С будет вычисляться правильно.

Или, если хотите, то можно поменять наоборот - А -вычисляется, С=0. Результат работы цикла PLANE SPATIAL будет одинаковый.

 

Ссылка на сообщение
Поделиться на других сайтах

Спасибо.

Я сам тоже начал разбираться с матрицами поворотов и вот что вычитал здесь http://www.gamedev.ru/code/articles/faq_matrix_quat?page=4

"Что такое фиксация оси?

  Фиксация - проблема, появляющаяся при использовании углов Эйлера. 
  Так как конечный поворот зависит от порядка умножения, может произойти так, 
  что одна ось вращения отобразиться на другую ось.

  Из-за чего станет невозможно повернуть объект в нужной оси.

  К примеру, если вращать объект в порядке Z,Y,X и повернуть 
  по оси Y на 90 градусов. 
  
  В этом случае, вращение по оси Z будет произведено первым, 
  а значит, будет проведено, верно. По оси Y также корректно. 
  Однако после вращения по Y, ось X будет вращаться по оси Z. 

  Так что любое вращение по X на самом деле будет вращать по Z."

Также можно посмотреть здесь - http://habrahabr.ru/post/183116/

Где-то читал (не могу найти где), что эта проблема решается сменой последовательности поворотов и, следовательно, сменой порядка перемножения матриц. В связи с этим вопрос: почему у вас именно такая последовательность - сначала вокруг Z, потом вокруг Y, и потом вокруг Х?  

Ссылка на сообщение
Поделиться на других сайтах

Где-то читал (не могу найти где), что эта проблема решается сменой последовательности поворотов и, следовательно, сменой порядка перемножения матриц. В связи с этим вопрос: почему у вас именно такая последовательность - сначала вокруг Z, потом вокруг Y, и потом вокруг Х?  

Именно в такой последовательности ProE рассчитывает матрицу для команды CAMERA. 

 

Про кватернионы читал ещё в самом начале, как только занялся этими матрицами. Но так и не понял, как и куда их тут применить. 

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

Ссылка на сообщение
Поделиться на других сайтах

Эх, нет у меня знакомых специалистов по теоретической механике (это же термех, правильно?). Хорошо бы было получить их консультацию по данному вопросу. 

Ссылка на сообщение
Поделиться на других сайтах

Эх, нет у меня знакомых специалистов по теоретической механике (это же термех, правильно?). Хорошо бы было получить их консультацию по данному вопросу. 

Мне по термеху в универе было 3 балла :blush:  :biggrin: 

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

Ссылка на сообщение
Поделиться на других сайтах

Bastion, будем развивать тему кватернионов? Или вариант с рассмотрением предельных углов решает задачу полностью? А то я тут уже закопался в формулах перевода матриц в кватернионы и обратно :biggrin:

Ссылка на сообщение
Поделиться на других сайтах
DJ Astro, т.е. мы должны сначала перевести матрицу в кватернион, а затем из кватерниона вычислить углы Эйлера, так? Или не углы Эйлера, а  сферические углы (для начала бы понять какая между ними разница)? 

Попробовать можно, хуже от этого не будет, но результат не гарантирован (т.е. может ничего не получиться :smile: ).

Ссылка на сообщение
Поделиться на других сайтах

Компоненты матрицы поворота, выраженные через кватернион:

fcbc131b2d84e50262f2709afbc155fa.png

Преобразование в углы Эйлера:

a2925987257bc7469187cfc3c18da853.png

Конечный код:

heading = atan2(2*qy*qw-2*qx*qz , 1 - 2*qy2 - 2*qz2)
attitude = asin(2*qx*qy + 2*qz*qw) 
bank = atan2(2*qx*qw-2*qy*qz , 1 - 2*qx2 - 2*qz2)

except when qx*qy + qz*qw = 0.5 (north pole)
which gives:
heading = 2 * atan2(x,w)
bank = 0
and when qx*qy + qz*qw = -0.5 (south pole)
which gives:
heading = -2 * atan2(x,w)
bank = 0

Теперь остается все это перевести в FIL и увидеть, что по сути вы и раньше все в кватернионах делали, только без лишнего преобразования, так? Или я что-то не понял? 

Ссылка на сообщение
Поделиться на других сайтах

Да не, это с википедии английской ))) А так - на бумажке пишу, ибо маткадом не владею  :sad:

Ссылка на сообщение
Поделиться на других сайтах

Слегка собрал мысли в кучу  :doh: ..

 



DJ Astro, т.е. мы должны сначала перевести матрицу в кватернион, а затем из кватерниона вычислить углы Эйлера, так? Или не углы Эйлера, а  сферические углы (для начала бы понять какая между ними разница)? 

Попробовать можно, хуже от этого не будет, но результат не гарантирован (т.е. может ничего не получиться :smile: ).

 

Мы ищем пространственные углы, т.е. последовательные повороты относительно всех осей СК: сначала повернули относительно оси Z, потом повернули относительно нового положения оси Y, потом повернули относительно нового положения оси X.

В углах Эйлера поворот 2 раза через Z - сначала повернули относительно оси Z, потом повернули относительно нового положения оси X, потом повернули относительно нового положения Z.

 

Я в маткаде тоже не умею, на бумажке пробовал - неудобно, пилил в ворде  :biggrin:

Расписал оба варианта.

1. Формулы матрицы поворота, в которой есть нужные углы, перевел в кватернион. 

2. Формулы каждой матрицы поворота вокруг каждой оси перевел в кватернионы, их перемножил, получил конечный кватернион.

 

Оба варианта вычисляют одинаково (ну оно как-бы и логично :rolleyes:). 

Как теперь из этих выражений найти углы? :doh:  :doh: Знатоки маткада, help!!!

 

 

 

 

 

Теперь остается все это перевести в FIL и увидеть, что по сути вы и раньше все в кватернионах делали, только без лишнего преобразования, так? Или я что-то не понял?

Вобщем-то сейчас наш FIL работает именно так, как написано в этом коде. Только хочется знать - это полное решение, или есть еще какие-то случаи, когда решение не может быть найдено?

matrix.doc

Изменено пользователем DJ Astro
Ссылка на сообщение
Поделиться на других сайтах
Вобщем-то сейчас наш FIL работает именно так, как написано в этом коде. Только хочется знать - это полное решение, или есть еще какие-то случаи, когда решение не может быть найдено?

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


Самому хочется знать, но похоже решение полное... 

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

не факт...

обработка всякая бывает

я сталкивался что ПроЕ при выводе начинал путать октанты, и пост приходилось корректировать

Ссылка на сообщение
Поделиться на других сайтах

Такой вопрос. Можно ли как-то сделать, чтобы в программе, при коррекции, в шаге подхода вставлялась функция G44 (вместо g41/g42), а в начале следующего кадра G41/G42.

%
T18
M06
S1000 M03
G00 X-9 Y8.5
Z-19.2
G01 G44 Y-.5 F100
G41 X2.231
G03 X3.76 Y-.382 R10
G01 X5.471 Y-.118
G02 X7 Y0 R10
G01 X8.3
G02 X10.3 Y-2 R2
G01 Y-4
G02 X8.3 Y-6 R2
G01 X7
G02 X5.471 Y-5.882 R10
G01 X3.76 Y-5.618
G03 X2.231 Y-5.5 R10
G01 X0
Y8.5
G40 X-9
G00 Z10
M30
N9999 %
Изменено пользователем moovi
Ссылка на сообщение
Поделиться на других сайтах

moovi, можно попробовать таким способом:

(предварительно в настройках поста Machine Codes - Cutter Compensation назначить коррекциям слева-справа одинаковый код G44)

 

ARG=0

LOOP=1

 

CIMFIL/ON,CUTCOM
ARG=POSTF(7,4)
IF (ARG.NE.ICODEF(OFF)) THEN
LOOP=1
ELSE
LOOP=3
ENDIF
DMY=POSTF(13)
CIMFIL/OFF

CIMFIL/ON,GOTO
DMY=POSTF(20)
IF (LOOP.EQ.2) THEN
IF (ARG.EQ.ICODEF(LEFT)) THEN
PREFUN/41,NEXT
DMY=POSTF(21)
DMY=POSTF(13)
ENDIF
IF (ARG.EQ.ICODEF(RIGHT)) THEN
PREFUN/42,NEXT
DMY=POSTF(21)
DMY=POSTF(13)
ENDIF
ELSE
DMY=POSTF(13)
ENDIF
LOOP=LOOP+1
CIMFIL/OFF

Ссылка на сообщение
Поделиться на других сайтах
  • 2 недели спустя...

Или чуть попроще: оставляете G41/G42 как и было на левом и правом корректорах, а в FIL пишете:

FLG44=0

CIMFIL/AT,CUTCOM,LEFT

 FLG44=1

CIMFIL/OFF

 

CIMFIL/AT,CUTCOM,RIGHT

 FLG44=2

CIMFIL/OFF

 

CIMFIL/ON,GOTO

 DMY=POSTF(20)

 IF (FLG44.NE.0) PREFUN/44,NEXT

 DMY=POSTF(21)

 DMY=POSTF(13)

 IF (FLG44.EQ.1) CUTCOM/LEFT

 IF (FLG44.EQ.2) CUTCOM/RIGHT

 FLG44=0

CIMFIL/OFF

 

 

Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.
Примечание: вашему сообщению потребуется утверждение модератора, прежде чем оно станет доступным.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.



×
×
  • Создать...