2015-09-09 2 views
4

У меня возникли проблемы с пониманием того, как векторы поворота оси используются при вращении вектора в трехмерном пространстве. Почему они используются и как они относятся к матрицам вращения?Как работают векторы поворота оси и как они сравниваются с матрицами вращения?

Я также нашел функцию под названием vrrotvec2mat, которая, кажется, делает то, что я хочу, но я не могу понять документацию. В частности, может ли кто-нибудь дать более ясное объяснение (с некоторым примером) входных аргументов r и options?

MathWorks explanations очень ограничены, следующим образом: вращение

Преобразовать от оси угла в матричном представлении

m = vrrotvec2mat(r) возвращает матричное представление вращения, определяемой вектором поворота оси угол, r.

m = vrrotvec2mat(r,options) возвращает матричное представление вращения, определяемое вектором поворота по оси, с параметрами алгоритма по умолчанию, замененными значениями, определенными в параметрах.

Структура опций содержит параметр epsilon, который представляет значение, ниже которого число будет считаться нулем (значение по умолчанию - 1e-12).

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

Чтобы повернуть вектор столбца из трех элементов, умножьте его на матрицу вращения. > Чтобы повернуть вектор строки из трех элементов, умножьте его на транспонированную матрицу вращения.

+0

Как я вижу, это '' vrrotvec' (http://mathworks.com/help/sl3d/vrrotvec.html) должно дать вам 'r' необходимо – Adriaan

ответ

10

Если вы хотите понять функцию vrrotvec2mat, вам необходимо знать, как работают осевые углы вращения, прежде чем мы углубимся в эту функцию. В частности, вы понимаете значение Rodrigues Rotation formula, которое также называется формулой с поворотным углом поворота. Я объясню это вам с некоторым введением.

В линейной алгебре, наиболее стандартным способом, чтобы повернуть точку, будь то 2D или 3D является использование rotation matrix где вы предварительно многократно (т.е. y = A*x где x ваша точка представлена ​​в вектор-столбец) 2D-или 3D координаты с этой матрицей вращения. Это вращает точку вокруг начала координат. Вы можете также думать об этом как о повороте вектора v, где хвост находится в начале координат, а голова находится в точке в 2D или 3D пространстве.

Однако, еще один способ сделать это - предоставить то, что известно как ось-угол, действительное только в трехмерном пространстве. Ось описывается единичным вектором k, который описывает ось вращения, вокруг которой вектор v вращается на угол вокруг этой оси на right-hand rule.

Вот наглядный пример, который я получил из Википедии:

Источник: Rodrigues' Rotation formula

Вектора k в нашем случае направлен прямо вверх, а вектор v указует на 45 степень угол северо-запад. Мы хотим повернуть этот вектор на угол 180 градусов вокруг оси, определяемой вектором k, и поэтому, если вы сделаете это, vrot будет результирующим вектором. v|| и v_|_ - это параллельные и перпендикулярные выступы v относительно вектора k. Показано, что они приводят формулу Родригеса, которую я не буду здесь проходить. Я напишу вам статью, если вы хотите получить полный вывод.

Причина, почему формула вращения Rodrigues была предложена повернуть вещи, потому что очень часто, есть приложения, где вы вращающиеся вокруг оси, которая не с центром в начале координат, ни вы вращающиеся по стандарту x, y и z ось.

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

Источник: Rodrigues' Rotation formula

Причина vrrotvec2mat существует потому, что вы можете преобразуется между представлением осевого угла поворота вектора и матрицы вращения с поворотом относительно начала в линейной алгебре. Затем вы можете применить ту же линейную алгебраическую теорию для поворота вектора/точки в трехмерном пространстве с учетом этой матрицы вращения. Вы можете конвертировать назад и вперед между нормальной матрицей вращения и представлением формулы Родригеса, используя vrrotvec2mat и vrrotmat2vec соответственно.

Представление оси угла, по существу, вектор 4 элемента, где первые три элемента являются компонентами единичного вектора k, который определяет ось вращения и последний элемент в x, y и z угол theta вращения, который вращается ваш вектор относительно этой оси. vrrotvec2mat здесь не отличается и требует 4-элементного вектора в том порядке, о котором я только что говорил. Однако, быстро взглянув на источник, theta - , определенный в радианах.


Если вы хотите получить конкретный пример этой работы, воспользуйтесь приведенной выше диаграммой в качестве примера. Единичный вектор k направлен вверх на ось z, поэтому первые три компонента составляют (0,0,1). Мы хотим повернуть на 180 градусов, поэтому четвертый аргумент - pi ...и так:

>> M = vrrotvec2mat([0 0 1 pi]) 

M = 

    -1.0000 -0.0000   0 
    0.0000 -1.0000   0 
     0   0 1.0000 

Это точно определяет поворот на 180 градусов вокруг z оси Оу, если вы посмотрите на стандартную матрицу вращения в декартовой пространстве вокруг z оси. Если вспомнить матрицу вращения для этого, это:

enter image description here

Если вы заменяете theta = pi в приведенной выше матрице, вы получите то же самое, M, как показано в функции vrrot2vec2mat. Однако игнорируйте знак первой строки, второй столбец, поскольку это связано с числовой точностью ... что приводит нас ко второму параметру options. В принципе, при вычислении значений матрицы вращения с использованием формулы Rotrigues Rotation будут времена, когда значения в матрице будут довольно малы. Структура options имеет поле epsilon, где вы можете указать что-либо меньшее, чем этот порог, считается нулевым после вычисления матрицы. По умолчанию 1e-12 вполне подходит ИМХО.

Если вы хотите изменить значение по умолчанию epsilon, просто создать структуру, которая имеет один элемент epsilon, который изменяет этот порог и вызвать функцию с этим дополнительным вторым аргументом ... так что-то вроде:

>> options.epsilon = 1e-15; 
>> M = vrrotvec2mat([0 0 1 pi], options); 

в любом случае, возвращаясь к тому, что мы говорим о, скажем, наш заданный вектор v является относительно рисунке выше, и что он на северо-запад, указывая - в частности, на (x,y,z) = (1,0,1). Если мы используем эту матрицу поворота и повернуть эту точку, мы должны получить его, чтобы быть параллельна xz плоскости и направлен в противоположном направлении, и поэтому мы должны получить (x,y,z) = (-1,0,1):

>> M*[1;0;1] 

ans = 

    -1.0000 
    0.0000 
    1.0000 

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

>> v = [1;0;1]; 
>> k = [0;0;1]; 
>> theta = pi; 
>> vrot = v*cos(theta) + cross(k,v)*sin(theta) + k*(k.'*v)*(1-cos(theta)) 

vrot = 

    -1.0000 
    0.0000 
    1.0000 

в общем, это просто еще один способ вращения вектора вокруг произвольной оси, а не только ограничивает до стандарта x, y или z.

+0

Спасибо за очень подробный и хорошо объясненный ответ! – Pedro77

+0

@ Pedro77 - Никаких проблем :) Удачи! – rayryeng

 Смежные вопросы

  • Нет связанных вопросов^_^