Недавно я узнал о проецировании из 3D в 2D и обратном проецировании. Одна из самых запутанных вещей, которые я обнаружил, - это построение матриц преобразования от камеры к миру с использованием углов Эйлера. Хотя вращение как концепцию легко понять, построение матриц преобразований и их использование может быть чрезвычайно запутанным. В этой статье я объясню, как создавать матрицы преобразования и использовать их для преобразования из одной системы отсчета в другую. Мы также визуализируем преобразования и несколько точек выборки, построив их.

Вступление

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

Справочные рамки:

Это система координат для измерения точек в трехмерном (или N-D) пространстве. Его можно как угодно ориентировать и переводить на любую сумму по курсу. другие системы отсчета. Например, для автономного автомобиля мы можем иметь систему отсчета автомобиля, систему отсчета камеры, систему отсчета IMU и т. д. Но важно отметить, что точка остается в физически одно и то же место, независимо от того, как числа меняются в разных кадрах. Мотивация перемещения между различными системами отсчета заключается в том, что в локальной системе отсчета вы можете измерять точки относительно друг друга. происхождение и ориентация этой системы отсчета, которой легче управлять. Скажем, проще сказать 1 м вперед, 2 м вправо, 3 м над уровнем моря. робот, чем определение того же пространства в глобальной системе отсчета со смещенными и повернутыми координатами.

Соглашение:

Это только порядок значений x, y и z и то, как они соотносятся с фактическими физическими направлениями. Это не справочная информация, и ее не следует путать с ней. Хотя нам необходимо обеспечить соблюдение соглашений, используемых в используемой вами библиотеке / приложении / уравнениях, это не имеет никакого отношения к самой системе ссылок. Примером соглашения может быть NED (Север, Восток, Вниз), который подразумевает, что x - вперед, y - вправо, а z - вниз. Другой - ENU (Восток, Север, Вверх), что означает, что x - вправо, y - вперед, а z - вверх. OpenCV использует соглашение EDN (Easting, Down, Northing), которое подразумевает, что x прав, y - вниз, а z - вперед. Таким образом, кто-то в системе ENU, говоря (1,2,3), будет подразумевать 1 метр вправо, 2 метра вперед и 3 метра вверх. Но если бы эти числа были включены, скажем, в соглашение EDN без надлежащих вращений, мы получили бы 1 метр вправо, 2 метра вниз и 3 метра вперед, что не входило бы в намерение этих чисел. По возможности используйте в коде только одно соглашение, чтобы было понятнее. В противном случае имейте четкую документацию, в которой указано, какие различные соглашения соблюдаются и какие конкретные вращения применяются для преобразования между ними.

Правосторонняя система против Левосторонней системы

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

Правосторонняя система:

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

Система для левшей:

x x y = -z (в условном обозначении правой руки), где x, y, z - ортогональные единичные векторы для координатной оси. Направление z можно определить по направлению, полученному путем сгибания пальцев левой руки из направления x к y, и большой палец будет указывать в + ve z -направление. Направление положительного вращения можно получить, поместив нашу согнутую левую руку вдоль z-направления. Положительное вращение происходит по часовой стрелке, если смотреть сверху в положительном направлении оси вращения в этой системе.

Матрица трансформации

Я буду придерживаться однородных координат для построения матриц преобразования. Объяснение этих координат выходит за рамки данной статьи. Но главное, что эти координаты позволяют представить проективные преобразования в виде матрицы 4х4. Кроме того, в этой системе красиво различаются точки и векторы (направления). Подробнее об этом можно прочитать здесь: Однородные координаты.

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

Прежде чем начать построение матрицы, я кратко расскажу об обозначениях векторов строк и столбцов и их влиянии на использование матрицы преобразования. Матрица размером nx1 называется вектором-столбцом, а матрица размером 1xn - вектором-строкой. В зависимости от того, как вы определяете свои точки x, y, z, это может быть вектор-столбец или вектор-строка.

Для вектора-столбца мы предварительно умножаем матрицу вращения / преобразования, которая имеет формат основного столбца. Результатом является линейная комбинация столбцов матрицы вращения.

Для вектора-строки мы постмножаем матрицу вращения / преобразования, которая имеет формат строкового типа. В результате получается линейная комбинация строк матрицы вращения.

Поэтому, если вы строите свою матрицу в формате с основными столбцами, вам необходимо транспонировать матрицу вращения перед последующим умножением на вектор-строку.

В этой статье я буду придерживаться векторов-столбцов. Далее мы посмотрим, как построить матрицу преобразования. Я буду использовать библиотеку scipy для создания матриц вращения из углов Эйлера. Вы можете прочитать о том, как работают эти углы, здесь: Лучшее представление вращения для точной оценки позы от Дмитрия Костяева и посмотрите это видео: Углы Эйлера и последовательность вращения Эйлера [Замечательное объяснение!]. Итак, предположим, что вам известны три значения угла Эйлера вашего кадра B относительно. кадр A и перенос (tx, ty, tz) начала кадра B из кадра A в координаты кадра A. Матрица преобразования для преобразования из системы отсчета B в A задается как:

Обратите внимание на порядок AB в имени матрицы преобразования. Это потому, что эти матрицы перемножаются справа налево. Так что, если бы нам пришлось каскадировать некоторые из них, мы бы знали из этого соглашения, соблюдаем ли мы правильный порядок преобразования. В следующем примере мы каскадируем три матрицы преобразования, чтобы взять точку p0 из системы отсчета D в систему отсчета A. Обратите внимание, что точка в однородных координатах представлена ​​как [x, y, z, 1] (Все масштабированные версии эти координаты эквивалентны, т.е. [wx, wy, wz, w]).

Теперь давайте посмотрим на код, необходимый для этого на Python. Я буду использовать scipy для построения матрицы вращения и pytransform3d [7] для визуализации различных преобразований. Сначала давайте посмотрим, какие все библиотеки необходимо импортировать.

Затем мы определяем матрицы преобразования для нескольких различных кадров. Обратите внимание, что имена в коде не соответствуют условным обозначениям на бумаге. Я использую A2B, чтобы обозначить, что я перехожу от системы отсчета A к B. Ключевая функция, которую мы используем, - Rotation.from_euler, она принимает строку допустимых углов вращения Эйлера и список углов поворота. Вы можете указать угол поворота в градусах или радианах. Если вы хотите использовать радианы, установите градусы = Ложь. В этом коде я использую последовательность вращения «XYZ». Я определяю четыре системы отсчета A, B, C и D относительно друг друга. Наконец, я также определяю несколько точек для построения в системе отсчета A и B.

Мы конструируем менеджер трансформации из этих матриц трансформации, а затем строим точки и кадры относительно системы отсчета B и A. Pytransform3d - удобный пакет для работы с трехмерными трансформациями. Цветовая кодировка осей RGB соответствует XYZ соответственно.

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

Если вы хотите увидеть классное применение матриц трансформации в действии, посмотрите: Практическое применение гомографии Дэрила Тана.

Заключение

Работа с матрицами преобразования - основной шаг для различных областей, таких как робототехника, аэрокосмическая промышленность, автономное вождение, эпиполярная геометрия и т. Д. В этой статье мы рассмотрели несколько концепций, а именно систему отсчета, соглашение, правосторонние и левосторонние системы. Мы увидели, как обрабатывать векторы столбцов и строк в матрицах преобразования. И, наконец, как создать эти матрицы в Python и визуализировать их в виде графиков. Надеюсь, вам понравилось читать эту статью так же, как мне понравилось ее писать. Если вы заметили какие-либо ошибки или у вас есть другие вопросы или предложения, пожалуйста, оставьте комментарий здесь или напишите мне в LinkedIn.

использованная литература

  1. Правило правой руки
  2. Scipy.spatial.transform.Rotation - Руководство SciPy v1.7.0
  3. Углы Эйлера
  4. Матрица вращения
  5. Https://phas.ubc.ca/~berciu/TEACHING/PHYS206/LECTURES/FILES/euler.pdf
  6. Http://www.cse.psu.edu/~rtc12/CSE486/lecture12.pdf
  7. Pytransform3d - документация pytransform3d 1.9