admin / 19.11.2017

Крен тангаж рыскание

Крен, тангаж и рыскание

Основные динамические силы

 

Прыжок – это комплексное понятие: результат взаимодействия двух или более переменных величин, действие законов физики и человека. Чтобы понять, как происходит такое взаимодействие, надо рассмотреть каждую величину по отдельности.

«Магнит под столом»

Если бы я разбросал металлические опилки по столу, вы бы, наверное, посмотрели на меня с удивлением. Но если бы я разместил под поверхностью стола магнит и стал бы двигать его, вы бы подумали, что я волшебник. Конечно, здесь нет никаких чудес. Это простое действие законов физики. Очевидная реальность – это движение металлических опилок по поверхности стола без всякой видимой причины. На самом же деле магнит действует на опилки так, как он и должен действовать без какого-либо вмешательства потусторонних сил. Приблизительно то же самое происходит и с полетом. Пока мы не разберемся с основными динамическими силами, мы будем считать, что происходит какое-то чудо. Чтобы научиться летать, вы должны понять, как действуют эти силы.

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

Язык пространственной ориентации

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

Крен, тангаж и рыскание

Ориентирование или местоположение должно пониматься только по отношению к чему-либо. Это «что-либо» – ближайшее к нам небесное тело, т.е Земля. Когда мы начнем прыгать с парашютом на другие небесные тела с меньшей гравитацией, чем, у земли, мы будем определять свое местоположение по отношению к ближайшим планетам. При системе, которую мы применяем для определения нашего местоположения, требуется построение трех осей ориентации. Давайте упростим себе задачу, приняв человеческое тело за летящее тело. Если вы разведете руки в стороны, ваши руки будут представлять собой «Ось тангажа». Отклонение от оси можно продемонстрировать, наклоняя тело вперед и назад. «Ось Крена» – это шест, проходящий через вашу грудь. Отклонением от этой оси будут наклоны в стороны. Третья ось – «Ось Рыскания» (ось поворота в горизонтальной плоскости вокруг вертикальной оси). Ее можно представить как шест, проходящий через ваше тело от макушки до ног. Отклонением от этой оси будет поворот-пируэт вправо или влево.

Давайте проверим правильность понимания вами этих терминов на конкретных примерах. Представьте, что вы – самолет, летящий на определенной высоте. Если вас попросят отклониться от оси тангажа вниз, вы заставите самолет опустить нос. Увеличение оси заставит вас поднять нос вверх по отношению к хвосту. Если надо сделать крен вправо, вы опустите правое крыло и поднимите левое. «Рыскание» вправо будет простым поворотом вправо в горизонтальной плоскости.


Дата добавления: 2018-05-10; просмотров: 51;


Похожие статьи:

 
   Страница 1 из 1  [ Сообщений: 2 ] 

Модераторы: Karan, PAV, Toucan, maxal, Супермодераторы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Внимание! Данный сайт не обновляется. Новая версия: shatalov.su

Преобразования: Последняя битва

Дата создания: 2009-10-20 03:43:37
Последний раз редактировалось: 2012-02-08 09:36:52

    Предварительные уроки:

  1. Тригонометрия. Перейти.
  2. Векторы. Перейти.
  3. Матрицы. Перейти.
  4. Координатные пространства. Перейти.
  5. Преобразования координатных пространств. Перейти.
  6. Перспективная проекция. Перейти.

Что-то мы давненько не вспоминали о преобразованиях! Наверное, мой дорогой читатель, ты уже соскучился по ним? Как показывает практика, преобразования — самая любимая тема у изучающих трёхмерное программирование.

На данный момент вы уже должны хорошо разбираться в преобразованиях.

45. Принцип действия каналов крена, тангажа и рыскания автопилота.

Если же нет, то смотрите предварительные уроки.

Когда мы только начинали изучать преобразования, я писал, что с помощью матриц можно манипулировать предметами в пространстве: перемещать, вращать, увеличивать. Если вы изучили все предыдущие уроки и попытались применить полученные знания на практике, то скорее-всего вам пришлось столкнуться с определёнными трудностями: как передвигать предметы в произвольном направлении, как же всё-таки составить матрицу для преобразования в пространство камеры, как вращать предметы в произвольном направлении?

Рассмотрением этих вопросов мы и займёмся сегодня.

Перемещение в пространстве

Небольшое замечание: мировое пространство координат мы будем обозначать осями x,y,z. Базисные векторы, образующие локальное (объектное, камеры) пространство мы будем обозначать как i=(1,0,0), j=(0,1,0), k=(0,0,1) (названия векторов читаются как: и, жи, ка). Вектор i — параллелен оси x, вектор j — оси y, вектор k — оси z.

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

Теперь смотрим на картинку:

Для простоты мы отбросили одно измерение — вертикальное. Соответственно на картинках изображён вид сверху.

Допустим мы находимся в какой-то точке мирового пространства. В данном случае под местоимением «мы» можно подразумевать что угодно: объект в игровом мире, персонаж, камеру. В данном случае (рис.а) мы смотрим в сторону точки A. Откуда мы знаем, что «взгляд» направлен в сторону точки A? Ну, когда мы обсуждали камеры, то договорились, что вектор k указывает направление взгляда.

От центра мира (мирового пространства координат) нас отделяет вектор v. И вдруг! Нам страшно захотелось подойти к точке A. Первая мысль: снять со стрелочки «вперёд» значение (dz) и прибавить к третьей компоненте вектора v. Результат этого недоразумения можно увидеть на рис.б. Казалось бы, всё пропало — прощайте мечты о собственном квейке. Отставить панику! Нужно просто тщательно обдумать сложившуюся ситуацию.

Представим, что мы уже находимся в точке A — посмотрим на рис.в. Как видно из рисунка, после перемещения векторы k и i не изменились. Соответственно мы их трогать и не будем.

Смотрим на оставшуюся часть картинки: вектор v после перемещения — это сумма двух векторов: вектора v до перемещения и неизвестного нам вектора, совпадающего по направлению с вектором k… А ведь мы теперь можем легко найти неизвестный вектор!

Если вы внимательно изучали урок про векторы, то вы помните, что умножение скаляра на вектор увеличивает (если скаляр больше единицы) вектор. Поэтому неизвестный вектор равен k*dz. Соответственно вектор v после перемещения можно найти по формуле:

v = v + k*dz

Ну разве не просто?

Вращение вокруг осей

Мы уже знаем формулы вращения вокруг осей. В этом разделе я просто более наглядно их поясню. Рассмотрим вращение двух векторов вокруг центра координат в двухмерном пространстве.

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

i.x = cos(a); i.z = sin(a); k.x = -sin(a); k.y = cos(a);

Теперь посмотрим на матрицы вращения вокруг осей в трёхмерном пространстве и на соответствующие иллюстрации.

Вращение вокруг оси x:

Вращение вокруг оси y:

Вращение вокруг оси z:

На рисунках показано какие именно векторы меняют свои координаты.

Небольшое замечание: неверно говорить о вращении вокруг осей. Вращение происходит вокруг векторов. Мы не умеем представлять прямые (оси) в памяти компьютера. А вот векторы — запросто.

И ещё одно: как определяется положительный и отрицательный угол вращения? Это легко: нужно «встать» в центр координат и смотреть в сторону положительного направления оси (прямой). Вращение против часовой стрелки — положительное, по часовой — отрицательное. Соответственно на рисунках выше углы вращения вокруг x и y — отрицательные, а угол вращения вокруг оси z — положительный.

Вращение вокруг произвольной прямой

Представьте такую ситуацию: вы поворачиваете камеру с помощью матрицы вокруг оси x (наклоняете камеру) на двадцать градусов. Теперь вам нужно повернуть камеру на двадцать градусов вокруг оси y. Да без проблем, скажете вы… Стоп! А вокруг чего теперь нужно поворачивать объект? Вокруг оси y, которая была до предыдущего поворота или после? Ведь это две совершенно разные оси. Если вы просто создадите две матрицы вращения (вокруг оси x и вокруг оси y) и перемножите их, то второй поворот будет осущетсвлён вокруг первоначальной оси y. А что если нам необходим второй вариант? В данном случае нам нужно будет научиться вращать объекты вокруг произвольной прямой. Но сначала небольшой тест:

Сколько векторов на следующей картинке?

Правильнй отвект — три вектора. Помните: векторы — это длина и направление. Если в пространстве два вектора имеют одинаковую длину и направление, но находятся в разных местах, то можно считать, что это один и тот же вектор. Кроме того, на рисунке я изобразил сумму векторов. Вектор v = v1 + v2.

В уроке по векторам мы кратко рассмотрели скалярное и векторное произведение векторов. К сожалению, мы не изучили эту тему более подробно. В формуле ниже будет использоваться и скалярное, и векторное произведение. Поэтому буквально пару слов: значение скалярного произведение — это проекция первого вектора на второй. При векторном произведении двух векторов: a x b = c, вектор c перпендикулярен векторам a и b.

Смотрим на следующий рисунок: в пространстве определён вектор v. И данный вектор нужно повернуть вокруг прямой l (эль):

Мы не умеем представлять прямые в программах. Поэтому прямую мы представим в виде единичного вектора n, который совпадает по направлению с прямой l (эль). посмотрим на более подробный рисунок:

Что у нас есть:
1. Прямая l представленная вектором единичной длины n. Как уже писалось выше, вращение вектора v будет осуществляться вокруг вектора, а не прямой.
2. Вектор v, который нужно повернуть вокруг вектора n. В результате вращения у нас должен получиться вектор u (читается как у).
3. Угол, на который нужно осуществить вращение вектора v.

Зная эти три величины, мы должны выразить вектор u.

Вектор v можно представить как сумму из двух векторов: v = v + v||. При этом вектор v|| — параллелен вектору n (можно даже сказать: v|| — проекция v на n), а вектор v перпендикулярен n. Как несложно догадаться, поворачивать нужно только перпендикулярную вектору n часть вектора v. То есть — v.

На рисунке присутствует ещё один вектор — p. Этот вектор перпендикулярен плоскости образованной векторами v|| и v, |v| = |p| (длины этих векторов равны) и p = n x v.

u&#8869 = vcosa + psina

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

Теперь нужно из последнего уравнения убрать v и p. Делается это с помощью простых подстановок:

v|| = n(v · n) v = vv|| = vn(v · n) p = n x vu|| = v||u&#8869 = vcosa + psina = (vn(v · n))cosa + (n x v)sina u = u&#8869 + v|| = (vn(v · n))cosa + (n x v)sina + n(v · n)

Вот такая вот загогулина!

Это формула поворота вектора v на угол a (альфа) вокруг вектора n. Теперь с помощью этой формулы мы можем вычислить базисные векторы:

Упражнения

1. Обязательное: подставьте базисные векторы в формулу вращения вектора вокруг произвольной прямой. Посчитайте (с помощью карандаша и листка бумаги). После всех упрощений у вас должны получиться базисные векторы как на последней картинке. Упражнение займёт у вас минут десять.

Вот и всё.


Роман Шаталов 2009-2012

Введение.
Кватернион
Основные операции над кватернионами.
  Кватернионы единичной длины
  Интерполяция
  Преобразование из двух направлений
Композиция вращений
Физика

Введение.

Давайте коротко определимся с терминологией. Каждый представляет себе, что такое ориентация объекта. Термин "ориентация" подразумевает, что мы находимся в некоторой заданной системе отсчета. Например, фраза "он повернул голову влево" осмыслена только тогда, когда мы представляем, где находится "лево" и где находилась до этого голова. Это важный для понимания момент, ведь если бы это был монстр с головой на животе макушкой вниз то фраза "он повернул голову влево" уже не покажется такой однозначной.

Трансформацию, которая определенным образом вращает из одной ориентации в другую, назовем поворотом. С помощью поворота можно описать и ориентацию объекта, если ввести некую ориентацию по умолчанию как точку отсчета. Например, любой объект, описанный с помощью набора треугольников, уже имеет ориентацию по умолчанию. Координаты его вершин описываются в локальной системе координат этого объекта. Произвольную ориентацию этого объекта можно описать матрицей поворота относительно его локальной системы координат. Также можно выделить такое понятие как "вращение". Под вращением будем понимать изменение ориентации объекта заданным образом во времени. Чтобы однозначно задать вращение, надо, чтобы в любой момент времени мы могли определить точную ориентацию вращаемого объекта. Другими словами вращение задает "путь", пройденный объектом при изменении ориентации. В такой терминологии поворот не задает однозначного вращения объекта. Важно понимать что, к примеру, матрица не задает однозначного вращения тела, одну и ту же матрицу поворота можно получить, повернув объект на 180 градусов вокруг фиксированной оси и на 180 + 360 или 180 — 360. Эти термины я применяю для демонстрации различий в понятиях, и ни в коей мере не настаиваю на использовании. В дальнейшем оставлю за собой право говорить "матрицы вращения".

При слове ориентация часто возникают ассоциация с направлением. Часто можно услышать фразы подобные "он повернул голову в сторону приближающегося локомотива". Например, ориентацию автомобиля можно было бы описать направлением, в котором смотрят его фары. Однако направление задается двумя параметрами (например, как в сферической системе координат), а объекты в трехмерном пространстве имеют три степени свободы (вращения). В случае с автомобилем он может смотреть в одном направлении как стоя на колесах, так и лежа на боку или на крыше. Ориентацию действительно можно задать направлением, но их потребуется два. Давайте рассмотрим ориентацию на простом примере головы человека.

Договоримся про исходное положение, в котором голова ориентирована по умолчанию (без вращения). За исходное примем положение, в котором голова смотрит лицом по направлению оси "z", а вверх (макушкой) смотрит по направлению оси "y". Назовем направление, в котором повернуто лицо "dir" (без вращения совпадает с "z"), а направление, куда смотрит макушка "up" (без вращения совпадает с "y"). Теперь у нас есть точка отсчета, есть локальная координатная система головы "dir", "up" и глобальная с осями x, y, z. Произвольно повернем голову и отметим, куда смотрит лицо. Глядя в этом же направлении можно вращать голову вокруг оси, совпадающей с направлением взгляда "dir".

Например, наклонив голову на бок (прижавшись щекой к плечу) мы будем смотреть в том же направлении, но ориентация головы поменяется. Чтобы зафиксировать поворот вокруг направления взгляда, используем еще и направление "up" (направленно к макушке). В этом случае мы однозначно описали ориентацию головы и не сможем ее повернуть, не изменив направления осей "dir" и "up".

Мы рассмотрели достаточно естественный и простой способ задания ориентации с помощью двух направлений. Как же описать наши направления в программе, чтобы ими было удобно пользоваться? Простой и привычный способ хранить эти направления в виде векторов. Опишем направления с помощью векторов длиной в единицу (единичных векторов) в нашей глобальной системе координат xyz. Первый важный вопрос, как бы наши направления передать в понятном виде графическому API? Графические API работают в основном с матрицами. Нам бы хотелось получить матрицу поворота из имеющихся векторов. Два вектора описывающие направление "dir" и "up" и есть та самая матрица поворота, а точнее два компонента матрицы поворота 3×3. Третий компонент матрицы мы можем получить из векторного произведения векторов "dir" и "up" (назовем его "side"). В примере с головой вектор "side" будет смотреть в направлении одного из ушей. Матрица поворота это и есть координаты трех векторов "dir", "up" и "side" после поворота. Эти вектора до поворота совпадали с осями глобальной системы координат xyz. Именно в виде матрицы поворота  очень часто и хранят ориентацию объектов (иногда матрицу хранят в виде трех векторов). Матрицей можно задать ориентацию (если известна ориентация по умолчанию) и поворот.

Похожий способ представления ориентации, называется углы Эйлера (Euler Angles), с тем лишь отличием, что направление "dir" задается в сферических координатах, а "up" описывается одним углом поворота вокруг "dir". В итоге получим три угла вращения вокруг взаимно перпендикулярных осей. В аэродинамике их называют Крен, Тангаж, Рысканье (Roll, Pitch, Yaw или Bank, Heading, Attitude). Крен (Roll) — это наклон головы вправо или влево (к плечам), поворот вокруг оси проходящей через нос и затылок. Тангаж (Pitch) — это наклон головы вверх и вниз, вокруг оси проходящей через уши. И Рысканье (Yaw) — это повороты головы вокруг шеи. Надо помнить, что повороты в трехмерном пространстве не коммутативны, а значит, на результат влияет порядок поворотов. Если мы повернем на R1 а потом на R2, ориентация объекта не обязательно совпадет с ориентацией при  повороте на R2 и затем на R1. Именно поэтому при использовании Углов Эйлера важен порядок поворотов вокруг осей. Обратите внимание, что математика углов Эйлера зависит от выбранных осей (мы использовали только один из возможных вариантов), от порядка поворота вокруг них, а также от того в какой системе координат совершаются повороты, в мировой или локальной объекта. В углах Эйлера можно хранить и вращение и поворот.

Огромный недостаток такого представления, отсутствие операции комбинации поворота. Не пытайтесь складывать покомпонентно углы Эйлера. Итоговый поворот не будет комбинацией исходных поворотов. Это одна из самых распространенных ошибок начинающих разработчиков. Чтобы повернуть объект, храня вращение в углах Эйлера, нам придется перевести вращение в другую форму, например в матрицу. Затем  перемножить матрицы двух поворотов и из итоговой матрицы извлечь углы Эйлера. Проблема усложняется еще и тем что в частных случаях прямое сложение углов Эйлера работает. В случае комбинации вращений вокруг одной и той же оси, этот метод математически верен. Повернув на 30 градусов вокруг оси X, а затем еще раз вокруг X на 40 градусов мы получим поворот вокруг X на 70 градусов. В случае вращений по двум осям простое сложение углов может давать некий "ожидаемый" результат.

Крен, тангаж и рыскание

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

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

Кватернион

После краткого обзора о представлениях ориентации можно перейти к знакомству с кватернионом.

Кватернион — это четверка чисел, которые ввел в обращение (как считают историки) Уильям Гамильтон в виде гиперкомплексного числа. В этой статье я предлагаю рассматривать кватернион как четыре действительных числа, например как 4d вектор или 3d вектор и скаляр.

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

Существуют и другие представления кватерниона, которые я не буду рассматривать.
Как же хранят вращение в кватернионе? Практически также как и в "Axis Angle" представлении, первые три компонента представляют вектор, лежащий на оси вращения, причем длина вектора зависит от угла поворота. Четвертый компонент зависит только от величины угла поворота. Зависимость довольно простая — если взять единичный вектор V за ось вращения и угол alpha за вращение вокруг этой оси, тогда кватернион представляющий это вращение
можно записать как:

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

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

Страницы: 123Следующая »

4 июня 2004

#кватернионы, #математика

Обновление: 7 декабря 2011

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

.

.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*