Поворот вектора на угол python

Матрицы поворота, углы Эйлера и кватернионы (Rotation matrices, Euler angles and quaternions)

Объект обычно определяется в удобной для его описания локальной системе координат (ЛСК), а его положение в пространстве — в глобальной системе координат (ГСК).

В трёхмерном пространстве переход из одной СК в другую описывается в общем случае системой линейных уравнений:

Поворот вектора на угол python

Уравнения могут быть записаны через матрицы аффинных преобразований в однородных координатах одним из 2-х способов:

Поворот вектора на угол python

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

Поворот вектора на угол python

На рисунке справа большой палец определяет направление оси, остальные пальцы — положительное направление вращения относительно этой оси.

Все три вектора направлений есть единичными.

Поворот вектора на угол python

Ниже приводится единичная матрица для 2-х способов записи уравнений геометрических преобразований. Такая матрица не описывает ни перемещения, ни вращения. Оси ЛСК и ГСК совпадают.

Поворот вектора на угол python

Далее рассматривается матрица для второго способа матричной записи уравнений (матрица справа). Этот способ встречается в статьях значительно чаще.

При использовании матрицы вы можете игнорировать нижнюю строку. В ней всегда хранятся одни и те же значения 0, 0, 0, 1. Она добавлена для того, чтобы мы могли перемножать матрицы (напомню правило перемножения матриц и отмечу, что всегда можно перемножать квадратные матрицы). Подробнее см. Композиция матриц. Однородные координаты.

Остальные 12 значений определяют координатную систему. Первый столбец описывает компоненты направления оси X(1,0,0). Второй столбец задает направление оси Y(0,1,0), третий – оси Z (0,0,1). Последний столбец определяет положение начала системы координат (0,0,0).

Как будет выглядеть матрица Евклидового преобразования (преобразование движения) для задания ЛСК , с началом в точке (10,5,0) и повёрнутой на 45° вокруг оси Z глобальной СК, показано на рисунке.

Поворот вектора на угол python

Рассмотрим сначала ось X. Если новая система координат повернута на 45° вокруг оси z, значит и ось x повернута относительно базовой оси X на 45° в положительном направлении отсчета углов. Таким образом, ось X направлена вдоль вектора (1, 1, 0), но поскольку вектор системы координат должен быть единичным, то результат должен выглядеть так (0.707, 0.707, 0). Соответственно, ось Y имеет отрицательную компоненту по X и положительную по Y и будет выглядеть следующим образом (-0.707, 0.707, 0). Ось Z направления не меняет (0, 0, 1). Наконец, в четвертом столбце вписываются координаты точки начала системы координат (10, 5, 0).

Частным случаем матриц геометрических преобразований есть матрицы поворота ЛСК относительно базовых осей ГСК. Вектора осей ЛСК здесь выражены через синусы и косинусы углов вращения относительно оси, перпендикулярной к плоскости вращения.

Поворот вектора на угол python

От матрицы преобразований размером 4*4 можно перейти непосредственно к матрице поворота 3*3, убрав нижний ряд и правый столбец. При этом, система линейных уравнений записывается без свободных элементов (лямда, мю, ню), которые определяют перемещение вдоль осей координат.

Путем перемножения базовых матриц можно получать комбинированные вращения. Ниже рассмотрены возможности комбинировать вращениями через матрицы поворота на примерах работы с углами Эйлера.

Содержание
  1. Матрицы поворота и углы Эйлера
  2. Axis Angle представление вращения
  3. Кватернионы
  4. Основные операции над кватернионами
  5. Сложение, вычитание и умножение на скаляр.
  6. Норма и модуль
  7. Обратный кватернион или сопряжение ( conjugate )
  8. Инверсный (inverse) кватернион
  9. Тождественный кватернион
  10. Скалярное произведение
  11. Вращение 3d вектора
  12. Умножение кватернионов
  13. Конвертирование между кватернионом и Axis Angle представлением
  14. Конвертирование кватерниона в матрицу поворота
  15. Конвертирование матрицы поворота в кватернион
  16. Основы линейной алгебры с Numpy (часть 1)
  17. Что такое вектор?
  18. 1. Добавление вектора
  19. 2. Скалярное Умножение
  20. 3. Точечный продукт
  21. 4. Векторная норма
  22. 5. Единица Вектор
  23. 6. Угол между векторами
  24. Вывод
  25. Заметки о вращении вектора кватернионом
  26. Структура публикации
  27. Получение кватерниона из вектора и величины угла разворота
  28. Обратный кватернион
  29. Умножение кватернионов
  30. Поворот вектора
  31. Рысканье, тангаж, крен
  32. Серия поворотов

Видео:Матрица поворотаСкачать

Матрица поворота

Матрицы поворота и углы Эйлера

Поворот вектора на угол pythonПоворот вектора на угол python

От выбора осей и последовательности вращения зависит конечный результат. На рисунках отображена следующая последовательность вращения относительно осей ЛСК:

  • оси Z (угол alpha);
  • оси X (угол beta);
  • оси Z (угол gamma).

Поворот вектора на угол python

Получил от читателя этой статьи вопрос: «Как понять, из каких углов поворота вокруг осей X,Y,Z можно получить текущее положение объекта, когда в качестве задания мы уже имеем повернутый объект, а нужно вывести его в это положение, последовательно повернув его из какого-то начального положения до полного совмещения с заданным?»

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

Начну с аналогии. Это как в шахматах. Мы знаем как ходит конь. Необходимо переместить его в результате многоходовки в нужную клетку на доске — при условии, что это возможно.

Подробно эта проблематика рассмотрена в статье Преобразование координат при калибровке роботов.

Умение правильно выбирать последовательность элементарных геометрических преобразований помогает в решении множества других задач (см. Примеры геометрических преобразований).»

Можно получить результирующую матрицу, которая определяет положение ГСК относительно ЛСК. Для этого необходимо перемножить матрицы с отрицательными углами в последовательности выполнения поворотов:

Поворот вектора на угол python

Поворот вектора на угол python

Почему знак угла поворота меняется на противоположный? Объяснение этому простое. Движение относительно. Абстрагируемся и представим, что ГСК меняет положение относительно неподвижной ЛСК. При этом направление вращения меняется на противоположное.

Перемножение матриц даст следующий результат:

Поворот вектора на угол python

Результирующую матрицу можно использовать для пересчета координат из ГСК в ЛСК:

Поворот вектора на угол python

Для пересчета координат из ЛСК в ГСК используется результирующая обратная матрица.

Поворот вектора на угол python

В обратной матрице последовательность поворота и знаки углов меняются на противоположные (в рассматриваемом примере снова на положительные) по сравнению с матрицей определения положения ГСК относительно ЛСК.

Поворот вектора на угол python

Поворот вектора на угол python

Перемножение матриц даст следующий результат:

Поворот вектора на угол python

Выше был рассмотрен случай определения углов Эйлера через вращение относительно осей ЛСК. То же взаимное положение СК можно получить, выполняя вращение относительно осей ГСК:

  • оси z (угол (gamma+pi/2));
  • оси y (угол угол beta);
  • оси z (угол (-alpha)).

Поворот вектора на угол python

Определение углов Эйлера через вращение относительно осей ГСК позволяет также просто получить зависимости для пересчета координат из ЛСК в ГСК через перемножение матриц поворота.

Поворот вектора на угол python

В рамках рассматриваемой задачи вместо угла gamma в матрицe Az используем угол gamma+pi/2.

Также легко можно перейти к зависимостям для пересчета координат из ГСК в ЛСК.

Поворот вектора на угол python

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

Детально с теоретическими основами аффинных преобразований (включая и вращение) можно ознакомиться в статье Геометрические преобразования в графических приложениях

Примеры преобразований рассмотрены в статьях:

Видео:Векторы на пальцах. Операции с векторами в Python [Математика для машинного обучения]Скачать

Векторы на пальцах. Операции с векторами в Python [Математика для машинного обучения]

Axis Angle представление вращения

Выбрав подходящую ось (англ. rotation axis) и угол (англ. rotation angle) можно задать любую ориентацию объекта.

Поворот вектора на угол python

Обычно хранят ось вращения в виде единичного вектора и угол поворота вокруг этой оси в радианах или градусах.

q = [ x, y, z, w ] = [ v, w ]

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

q = [ x, y, z]; w=sqrt (x*x +y*y +z*z)

В физике, таким образом хранят угловую скорость. Направление вектора совпадает с направлением оси вращения, а длина вектора равна скорости (в радианах в секунду).

Можно описать рассмотренные выше углы Эйлера через Axis Angle представление в 3 этапа:

q1 = [ 0, 0, 1, alpha]; q2 = [ 1, 0, 0, beta]; q3 = [ 0, 0, 1, gamma ]

Здесь каждое вращение выполняется относительно осей текущего положения ЛСК. Такое преобразование равнозначно рассмотренному выше преобразованию через матрицы поворота:Поворот вектора на угол python

Возникает вопрос, а можно ли 3 этапа Axis Angle представления объединить в одно, подобно матрицам поворота? Попробуем решить геометрическую задачу по определению координат последнего вектора вращения в последовательности преобразований через Axis Angle представления:

q = [ x, y, z, gamma ]

Поворот вектора на угол python

Есть ли представление q= [x, y, z, gamma] композицией последовательности из 3-х этапов преобразований? Нет! Координаты x, y, z определяют всего лишь положение оси Z ЛСК после первого и второго этапов преобразований:

Поворот вектора на угол python

При этом ось Z, отнюдь, не есть вектор вращения для Axis Angle представления, которое могло бы заменить рассмотренные 3-х этапа преобразований.

Еще раз сформулирую задачу, которая математически пока не решена: «Необходимо найти значение угла (rotation angle) и положение оси (rotation axis), вращением относительно которой на этот угол можно заменить комбинацию из 3-х поворотов Эйлера вокруг осей координат».

К сожалению, никакие операции (типа объединения нескольких преобразований в одно) с Axis Angle представлениями нельзя выполнить. Не будем расстраиваться. Это можно сделать через кватернионы, которые также определяют вращение через параметры оси и угол.

Видео:4.5 Поворот матрицы. "Поколение Python": курс для продвинутых. Курс StepikСкачать

4.5 Поворот матрицы. "Поколение Python": курс для продвинутых. Курс Stepik

Кватернионы

Кватернион (как это и видно по названию) представляет собой набор из четырёх параметров, которые определяют вектор и угол вращения вокруг этого вектора. По сути такое определение ничем не отличается от Axis Angle представления вращения. Отличия лишь в способе представления. Как же хранят вращение в кватернионе?

q = [ V*sin(alpha/2), cos(alpha/2) ]

В кватернионе параметры единичного вектора умножается на синус половины угла поворота. Четвертый компонент — косинус половины угла поворота.

Таблица с примерами значений кватернионов:

Поворот вектора на угол python

Представление вращения кватернионом кажется необычным по сравнению с Axis Angle представлением. Почему параметры вектора умножаются на синус половины угла вращения, четвертый параметр — косинус половины угла вращения, а не просто угол?

Откуда получено такое необычное представление кватерниона детально можно ознакомиться в статье Доступно о кватернионах и их преимуществах. Хотя программисту не обязательно знать эти детали, точно также как и знать, каким образом получены матрицы преобразования пространства. Достаточно лишь знать основные операции с кватернионами, их смысл и правила применения.

Видео:А.7.19 Поворот в трехмерном пространствеСкачать

А.7.19 Поворот в трехмерном пространстве

Основные операции над кватернионами

Кватернион удобно рассматривать как 4d вектор, и некоторые операции с ним выполняются как над векторами.

Видео:Математика это не ИсламСкачать

Математика это не Ислам

Сложение, вычитание и умножение на скаляр.

Смысл операции сложения можно описать как «смесь» вращений, т.е. мы получим вращение, которое находится между q и q’.

Что-то подобное сложению кватернионов выполнялось при неудачной попытке объединить 3 этапа Axis Angle представления.

Умножение на скаляр на вращении не отражается. Кватернион, умноженный на скаляр, представляет то же самое вращение, кроме случая умножения на 0. При умножении на 0 мы получим «неопределенное» вращение.

Пример сложения 2-х кватернионов:

Видео:§35 Формулы поворота координатных осейСкачать

§35 Формулы поворота координатных осей

Норма и модуль

Следует различать (а путают их часто) эти две операции:

Модуль (magnitude), или как иногда говорят «длина» кватерниона:

Через модуль кватернион можно нормализовать. Нормализация кватерниона — это приведение к длине = 1 (так же как и в векторах):

Видео:Вращение и перемещение 3D объекта при помощи кватернионов (Python, Pyquaternion) [Субтитры]Скачать

Вращение и перемещение 3D объекта при помощи кватернионов (Python, Pyquaternion) [Субтитры]

Обратный кватернион или сопряжение ( conjugate )

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

Например, если разворот вокруг оси Y на 90 градусов = (w=0,707; x = 0; y = 0,707; z=0), то обратный = (w=0,707; x = 0; y = -0,707; z=0).

Казалось бы, можно инвертировать только компоненту W, но при поворотах на 180 кватернион представляется как (w=1; x = 0; y = 0; z=0), то есть, у него длина вектора оси = 0.

Фрагмент программной реализации:

Видео:#11. Произведение матриц и векторов, элементы линейной алгебры | NumPy урокиСкачать

#11. Произведение матриц и векторов, элементы линейной алгебры | NumPy уроки

Инверсный (inverse) кватернион

Существует такой кватернион, при умножении на который произведение дает нулевое вращение и соответствующее тождественному кватерниону (identity quaternion), и определяется как:

Видео:Машинное обучение. Метод опорных векторов. Python.// Machine Learning. SVM. PythonСкачать

Машинное обучение. Метод опорных векторов. Python.// Machine Learning. SVM. Python

Тождественный кватернион

Записывается как q[0, 0, 0, 1]. Он описывает нулевой поворот (по аналогии с единичной матрицей), и не изменяет другой кватернион при умножении.

Видео:3D Game Engine | 21 | Матрица трансформацииСкачать

3D Game Engine | 21 | Матрица трансформации

Скалярное произведение

Скалярное произведение полезно тем, что дает косинус половины угла между двумя кватернионами, умноженный на их длину. Соответственно, скалярное произведение двух единичных кватернионов даст косинус половины угла между двумя ориентациями. Угол между кватернионами — это угол поворота из q в q’ (по кратчайшей дуге).

Видео:Формула поворота РодригаСкачать

Формула поворота  Родрига

Вращение 3d вектора

Вращение 3d вектора v кватернионом q определяется как

причем вектор конвертируется в кватернион как

и кватернион обратно в вектор как

Видео:Матрицы масштабирования, переноса и поворотаСкачать

Матрицы масштабирования, переноса и поворота

Умножение кватернионов

Одна из самых полезных операций, она аналогична умножению двух матриц поворота. Итоговый кватернион представляет собой комбинацию вращений — сначала объект повернули на q, а затем на q’ (если смотреть из глобальной системы координат).

Примеры векторного и скалярного перемножения 2-х векторов Поворот вектора на угол python Поворот вектора на угол pythonвекторное произведение — вектор: Поворот вектора на угол pythonСкалярное произведение — число: Поворот вектора на угол python

Пример умножения 2-х кватернионов:

Видео:ВРАЩЕНИЕ В КООРДИНАТАХ. КВАТЕРНИОНЫ И УГЛЫ ЭЙЛЕРА - С++ OpenGL ЧАСТЬ #3Скачать

ВРАЩЕНИЕ В КООРДИНАТАХ. КВАТЕРНИОНЫ И УГЛЫ ЭЙЛЕРА - С++ OpenGL ЧАСТЬ #3

Конвертирование между кватернионом и Axis Angle представлением

Поворот вектора на угол python

В разделе Axis Angle представление вращения была сделана неудачная попытка объединить 3 Axis Angle представления в одно . Это можно сделать опосредовано. Сначала Axis Angle представления конвертируются в кватернионы, затем кватернионы перемножаются и результат конвертируется в Axis Angle представление.

Пример конвертирования произведения 2-х кватернионов в Axis Angle представление:

Фрагмент программы на C:

Видео:Поворот матрицы на 90 градусов 1/3Скачать

Поворот матрицы на 90 градусов 1/3

Конвертирование кватерниона в матрицу поворота

Матрица поворота выражается через компоненты кватерниона следующим способом:

Поворот вектора на угол pythonгде

Поворот вектора на угол python

Проверим формулы конвертирования на примере конвертирования произведения 2-х кватернионов в матрицу поворотов:

Определяем элемент матрицы m[0][0] через параметры кватерниона:

Поворот вектора на угол python

Соответствующее произведению кватернионов (q1 и q2) произведение матриц поворотов было получено ранее (см. Матрицы поворота и углы Эйлера):

Поворот вектора на угол python

Как видим, результат m[0][0], полученный через конвертирование, совпал с значением в матрице поворота.

Фрагмент программного кода на С для конвертирования кватерниона в матрицу поворота:

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

Часто для задания вращений используют только кватернионы единичной длины, но это не обязательно и иногда даже не эффективно. Разница между конвертированием единичного и неединичного кватернионов составляет около 6-ти умножений и 3-х сложений, зато избавит во многих случаях от необходимости нормировать (приводить длину к 1) кватернион. Если кусок кода критичен по скорости и вы пользуетесь только кватернионами единичной длины тогда можно воспользоваться фактом что норма его равна 1.

Видео:Транспонирование 2Скачать

Транспонирование 2

Конвертирование матрицы поворота в кватернион

Поворот вектора на угол python

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

Фрагмент программного кода конвертирования матрицы поворота в кватернион:

Видео:Трехмерные линейные трансформации | Сущность Линейной Алгебры, примечаниеСкачать

Трехмерные линейные трансформации | Сущность Линейной Алгебры, примечание

Основы линейной алгебры с Numpy (часть 1)

Дата публикации Sep 21, 2019

Ах, математика Вы не можете избежать этого навсегда. Вы можете попробовать, а затем попробовать больше, но рано или поздно вам понадобится некоторая базовая интуиция, если вы серьезно настроены продвинуться по карьерной лестнице в науке о данных.

Поворот вектора на угол python

Когда дело доходит до линейной алгебры, мне очень нравится эта цитата:

Если бы Data Science был Бэтменом, линейная алгебра была бы Робином. [1]

Это аккуратно отражает суть нетехническим способом.

Почему я должен изучать линейную алгебру?

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

Не только это, но вы также будете считаться крутым ребенком, как эти двое:

Почему я должен читать этот пост?

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

Да, вы правильно прочитали. Я планирую охватить 14 различных тем в двух статьях. Это займет у вас некоторое время, чтобы прочитать его (и я его напишу), но если вы новичок в этом, я настоятельно рекомендую читать не более 2–3 тем в день, а затем искать в Интернете больше практических проблем.

Как устроена статья?

Итак, каждая из тем разделена на 3 части:

  1. Теоретическое объяснение
  2. Пример (ручные расчеты)
  3. Реализация на Python (с Numpy)

Я не буду лгать тебе — это будет много работы. Эта первая часть будет охватыватьвекторыи вот список тем:

  1. прибавление
  2. Скалярное Умножение
  3. Скалярное произведение
  4. Норма
  5. Единичный вектор
  6. Угол между векторами

Теперь, когда введение закончено, давайте не будем откладывать неизбежное. Возьмите чашку кофе (или что-нибудь покрепче) и отправляйтесь со мной в удивительный мир линейной алгебры.

Вы после окончания этой статьи. ПоGIPHY

Видео:Поворот умножением комплексных чисел на PythonСкачать

Поворот умножением комплексных чисел на Python

Что такое вектор?

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

Я имею в виду направлениекуда в космосе указывает стрелкаи величина говорит вамкак далеко вы должны идтив этом направлении. Если у вас есть только величина, но не направление, то вы говорите оскаляры, Как только вы дадите скаляру некоторое направление, он станет вектором.

Я сказал, что вы должны попытаться представить векторы как стрелки — это идеальная терминология, потому что стрелка имеет как четкое направление, так и четкую величину (длину).

Векторы чаще всего обозначаютсястрочная буква и стрелкавыше, указывая вправо:

Поворот вектора на угол python

Просто, правда?
Давайте теперь перейдем к некоторым векторным операциям, я знаю, насколько нетерпеливым вы должны быть (*смеется*).

Видео:Вращение вектораСкачать

Вращение вектора

1. Добавление вектора

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

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

Посмотрите на это фото отWikipedia Commons:

Поворот вектора на угол python

В двух словах, чтобы добавить векторбк вектору (получитьа + б), нарисуйте вектор от начала координат, а затем нарисовать векторбиз кончика вектора , Теперь, чтобы получитьа + б, вам нужно только подключить начало координат к кончику вектораб,

Может показаться излишним, если вы услышите это в первый раз, но просто возьмите ручку и бумагу и нарисуйте это, вы сразу же поймете суть.

А вот общая формула для сложения векторов:

Поворот вектора на угол python

Сейчас я сделаю простой пример вручную, а позже реализую этот же пример на Python.

Поворот вектора на угол python

Еще раз, возьмите лист бумаги и нарисуйте его — это довольно интуитивно понятно.

Реализация в Python:

Как видите, Numpy позволяет использовать оператор сложения, довольно аккуратно!

Видео:Векторизация русского текста на Python | Обработка естественного языкаСкачать

Векторизация русского текста на Python | Обработка естественного языка

2. Скалярное Умножение

Позвольте мне процитировать себя из ранее в этой статье:

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

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

Отлично, давайте посмотрим формулу скалярного умножения:

Поворот вектора на угол python

Над,Nпредставляет любое число. Давайте посмотрим на пример. скалярNбудет 2, что означает, что каждый компонент вектора будет умножен на 2.

Поворот вектора на угол python

Реализация в Python:

Круто, давайте перейдем к следующей теме!

3. Точечный продукт

Чтобы рассчитать скалярное произведение двух векторов, сначала нужноумножить соответствующие элементы(x1поy1,x2поy2и тд) а потомсуммировать условия продукта,

Эта концепция на самом деле гораздо проще понять, когда вы видите общую формулу, так что вот она:

Поворот вектора на угол python

Теперь я запишу базовый пример с двумя векторами в 2-мерном пространстве:

Поворот вектора на угол python

Реализация в Python:

Да, это почти все о точечном продукте — не особо о чем говорить.

4. Векторная норма

Норма — это просто еще один термин для длины или величины вектора, который обозначается двойными трубками (||) с каждой стороны. Он определяется как квадратный корень из суммы квадратов для каждого компонента вектора, как вы увидите в формуле ниже.

Расчет состоит из 3 этапов:

  1. Квадрат каждого компонента
  2. Сумма всех квадратов
  3. Взять квадратный корень

Как вы можете себе представить, формула глупо проста:

Поворот вектора на угол python

А вот практический пример вектора в 2-мерном пространстве:

Поворот вектора на угол python

Реализация в Python:

5. Единица Вектор

Основная причина, по которой вы рассчитываете единичные векторы, заключается в том, что вы заботитесь только о направлении, а не о величине. Этот процесс нормализации включает в себя уменьшение величины, чтобы не искажать другие вычисления. [2]

Единичный вектор чаще всего обозначается символом шляпы (^) и вычисляется путем вычисления нормы, а затем деления каждого компонента вектора на норму.

Без лишних слов, вот формула:

Поворот вектора на угол python

В качестве примера я вычислю единичный вектор из произвольного трехмерного вектора:

Поворот вектора на угол python

Вам не нужно делать последний шаг — делить на квадратный корень — но это делает конечный результат более привлекательным.

Реализация в Python будет немного другой здесь. Здесь нетвстроенная функцияв Numpy для вычисления единичных векторов (по крайней мере, я не знаю об этом), но поскольку вы знаете формулу, процесс вычисления тривиален. Я объявил функцию, которая будет принимать вектор как вход, а затем возвращать этот вектор, деленный на его норму:

6. Угол между векторами

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

Расчет углов между векторами имеет много практических применений. Он широко используется вNLP(Обработка естественного языка) при поиске строк, которые очень похожи. Например, когдаTF-IDFиспользуется для некоторых текстовых данных, каждый ввод (попробуйте представить ввод как отдельный текст электронной почты) преобразуется в вектор.

Тем самым вы будете уверены, что все векторы имеют одинаковые размеры, и если вход содержит определенное слово в определенной позиции, значение в соответствующем компоненте вектора будет равно 1, а в противном случае — 0. Если затем вычислить угол между векторами, то те, где угол в наименьшем будет более похожим (в примере с электронной почтой, представьте, что два отдельных письма относятся к одной теме).

Надеюсь, вы сможете увидеть потенциальные варианты использования в вашем проекте, если не будете беспокоиться об этом, вы увидите это в конце концов.

Вот формула для расчета угла. Ничего особенного, вы беретескалярное произведениедвух векторов и разделить это напроизведение норм:

Поворот вектора на угол python

И вот действительно простой пример двух произвольных трехмерных векторов:

Поворот вектора на угол python

Как и с единичными векторами, Numpy не имеет встроенной функции для расчета угла. Но эй, вы знаете формулу,так как трудно это может быть?
Единственная «хитрость» здесь — преобразовать радианы в градусы, потому что Numpy по умолчанию вернет результат в радианах. Все остальное так же просто, как и следовало ожидать.

И это в значительной степени заканчивает разговор о векторах.Разве это не плохо?

Вывод

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

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

3Blue1Brown — Сущность плейлиста линейной алгебры

Заметки о вращении вектора кватернионом

Структура публикации

  • Получение кватерниона из вектора и величины угла разворота
  • Обратный кватернион
  • Умножение кватернионов
  • Поворот вектора
  • Рысканье, тангаж, крен
  • Серия поворотов

Получение кватерниона из вектора и величины угла разворота

Ещё раз – что такое кватернион? Для разработчика – это прежде всего инструмент, описывающий действие – поворот вокруг оси на заданный угол:

где v – ось, выраженная вектором;
w – компонента, описывающая поворот (косинус половины угла).

Положительное значение угла разворота означает поворот вдоль вектора по часовой стрелке, если смотреть с конца вектора в его начало.

Например, кватернион поворота вдоль оси Х на 90 градусов имеет следующие значения своих компонент: w = 0,7071; x = 0,7071; y = 0; z = 0. Левая или правая система координат, разницы нет – главное, чтобы все операции выполнялись в одинаковых системах координат, или все в левых или все в правых.

Поворот вектора на угол python

С помощью следующего кода (под рукой был Visual Basic), мы можем получить кватернион из вектора и угла разворота вокруг него:

В коде rotate_vector – это вектор, описывающий ось разворота, а rotate_angle – это угол разворота в радианах. Вектор должен быть нормализован. То есть его длина должа быть равна 1.

Не забывайте про ситуацию, когда длина может быть 0. Вместо ошибки вам может понадобиться обработать эту ситуацию индивидуально.

Обратный кватернион

Для поворота вектора кватернионом требуется уметь делать обратный разворот и правильно выполнять операцию умножения кватернионов. Под обратным разворотом я имею ввиду обратный кватернион, т. е. тот, который вращает в обратную сторону.

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

Например, если разворот вокруг оси Y на 90 градусов = (w=0,707; x = 0; y = 0,707; z=0), то обратный = (w=0,707; x = 0; y = -0,707; z=0). Казалось бы, можно инвертировать только компоненту W, но при поворотах на 180 градусов она = 0. Кватернион, который означает «нет разворота» = (w=1; x = 0; y = 0; z=0), то есть у него длина вектора оси = 0.

Умножение кватернионов

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

Поворот вектора на угол pythonПоворот вектора на угол python

Умножение кватернионов выполняется следующим образом:

Для того, чтобы умножить кватернион на 3D вектор, нужно вектор преобразовать в кватернион присвоив компоненте W = 0 и умножить кватернион на кватернион. Или подставить ноль и выразить это в виде функции:

Поворот вектора

Теперь, собственно, поворот вектора кватернионом:

Вектор описывающий ось (x=1; y=0; z=1). Угол поворота 180 градусов.
Поворачиваемый вектор (x=0; y=0; z=1). Результат равен (x=1; y=0; z=0).

Поворот вектора на угол python

Рысканье, тангаж, крен

Рассмотрим инструмент формирования кватерниона с помощью поворотов вокруг одной из осей:
Рысканье = heading = yaw = вокруг оси Z; тангаж = altitude = pitch = вокруг оси Y; крен = bank = roll = вокруг оси X.

И в обратную сторону, из кватерниона:

Формулы преобразования зависят от принятой системы координат.

Серия поворотов

Рассмотрим пример:
1. Первый поворот – рысканье (вокруг Z) 90 градусов по часовой;
2. Второй поворот – тангаж (вокруг Y) 90 градусов по часовой;
3. Третий поворот – крен (вокруг X) 90 градусов по часовой.

Рисунки, изображающие поворот и подписанные как «global» демонстрируют повороты относительно неподвижных осей XYZ. Такой результат мы получим, если будем использовать кватернионы разворота по отдельности. Четвёртый рисунок демонстрирует, где окажется вектор, если начальные координаты у него были X=1; Y=0; Z=0.

Рисунки, подписанные как «local» демонстрируют вращение осей вместе с самолетом. То есть все вращения происходят относительно пилота, а не относительно неподвижной системы координат. Четвёртый рисунок показывает, где окажется тот же самый вектор (1; 0; 0) в итоге всех трёх поворотов. Такой результат мы получим, перемножив кватернионы разворота и применив полученный кватернион.

Поделиться или сохранить к себе: