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

Кинематические уравнения в обобщенных координатах. Углы Эйлера, Крылова, кватернионы.

В курсе теоретической механики сферическое движение задавалось углами Эйлера (рис. 1.2) – углом прецессии y (поворот вокруг неподвижной оси Oz ), углом нутации q (поворот вокруг полуподвижной оси ОК – линии пересечения плоскостей Oxy и O ξη, называемой линией узлов) и углом собственного вращения j (поворот вокруг связанной с телом оси Oz ).

Рис. 1.2. Система ориентационных углов Эйлера твердого тела

Углы Эйлера перечислены здесь в порядке поворотов, которые надо совершить над неподвижной СК Oxyz чтобы она совместилась с подвижной СК O ξηζ. Использование углов Эйлера в сферическом движении делалось для демонстрации принципиальной возможности решения соответствующих задач кинематики. Здесь же у нас стоит задача более оптимально описать такое движение. Кинематические соотношения, выражающие проекции угловой скорости тела на оси связанной СК через угловые скорости указанных углов представляются для углов Эйлера формулами (сверены с программой КИДИМ):

(1.1)

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

(1.2)

Более предпочтительным является использование параметров Родрига-Гамильтона, кватернионов, параметров Кейли-Клейна.

Докажем теорему д’Аламбера-Эйлера .

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

Движение тела полностью определяется движением любого треугольника, принадлежащего телу. Поэтому для сферического движения это эквивалентно движению двух точек на некоторой сфере, центр которой совпадает с неподвижной точкой, или движению дуги, соединяющей эти точки. Предположим, что в результате перемещения тела за время Dt некоторая точка А переместилась по сфере в положение В (рис. 1.3). В то же самое время точка, которая находилась в положении В , заняла новое положение С .

Рис. 1.3. Плоскость ABC пересекает неподвижную сферу по окружности (малого или большого круга). Если D один из полюсов этого круга на сфере, то , т.к. они равнобедренные сферические и , так как они являются двумя положениями одной и той же дуги сферы АВ . по построению (равноудалены от полюса). Следовательно, может быть совмещена с при помощи вращения вокруг оси OD на угол ADB . Теорема доказана.

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

Воспользуемся для задания таких четырех величин параметрами Родрига-Гамильтона, которые обозначим здесь λ 0 , λ 1 , λ 2 , λ 3 . Последние три параметра обычно объединяют в вектор ={λ 1 , λ 2 , λ 3 } T . Таким образом, будем рассматривать совокупность скалярной и векторной величин λ 0 , . Эти параметры вводятся через элементы конечного поворота и могут быть определены следующим образом. Пусть ‑ направляющий орт оси, вокруг которой поворот совершается, а ψ ‑ величина угла поворота. Тогда

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

Число степеней свободы свободно движущегося в пространстве твердого тела равно шести. Если во время движения тела одна его точка остается неподвижной, то число степеней свободы такого тела при его вращении вокруг этой неподвижной точки будет равно трем и для оценки его положения необходимо задать три независимых параметра. Сделать это можно различными способами. Например, А.Н. Крылов в качестве таких параметров предложил так называемые корабельные углы, определяющие положение твердого тела (корабля) относительно системы координат, связанной своим началом с его центром тяжести (рис. 3.1).

За оси неподвижной системы координат приняты CXYZ, а за оси жестко связанные с кораблем – Cxyz (рис. 3.1). Ось СХ направлена от кормы к носу корабля, ось CZ –к его правому борту, а ось CY образует с ними правую систему координат (вертикально вверх). Положение подвижной системы координат Cxyz , неизменно связанной с кораблем, относительно неподвижной CXYZ для каждого момента времени определяется тремя углами Крылова: углом дифферента , углом крена , углом рыскания (рис. 3.2).

Как видно на рис. 3.2, плоскость CXY пересекает плоскость Cxy по некоторой прямой , образующей угол с осьюCX и угол с осью Cx . Плоскость CYZ пересекает плоскость Cхy полинии Cy 1 , образующей угол с осью Cy . Рассмотрим переход от системы CXYZ к системе Cxyz , выполненный с помощью трех поворотов.

Для совмещения системы CXYZ с системой Cxyz достаточно:

1) повернуть систему CXYZ вокруг третьей из координатных осей CZ на угол дифферента , в результате чего получим систему Cx 1 y 1 z 1 , причем Cz 1 =CZ (рис. 3.3);

2) повернуть систему вокруг первой из координатных осей на угол крена , в результате чего получим систему , при этом (рис. 3.4);

3) повернуть систему вокруг второй из координатных осей на угол рыскания (рис. 3.5), в результате чего приходим к системе Cxyz .

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

1) от CXYZ к (рис. 3.3)

X = x 1 cos y - y 1 sin y + 0 ,

Y =x 1 sin y + y 1 cos y + 0 , (3.1)

Z = 0 + 0 + z 1 ,

или в матричной форме:

[X ] ={ a 3 y } т [x 1 ] , или , (3.2)

где - матрица, транспонированная к матрице , описывающей поворот системы CXYZ вокруг третьей координатной оси СZ на угол дифферента y,

; (3.3)

2) от системы к системе (рис. 3.4)

x 1 = x 2 + 0 + 0 ,

y 1 = 0 + y 2 - z 2 , (3.4)

z 1 = 0 + y 2 + z 2 ,

или в матричной форме

[x 1 ] = [x 2 ] , или , (3.5)

где – матрица, транспонированная к матрице , задающей преобразование поворота от осей системы к осям системы вокруг первой из координатных осей на угол крена , при этом = ,

; (3.6)

3) от системы координат к системе Cxyz (рис. 3.5)

x 2 = x cos j + 0 + z sin j,

y 2 = 0 + y + 0 , (3.7)

z 2 = -x sin j + 0 + z cos j,

или в матричной форме [x 2 ]= [x ], или

. (3.8)

Причем поворотная матрица {a 2 j } т – это матрица, транспонированная к матрице { a 2 j }, задающей преобразование поворота от осей системы к осям системы Cxyz на угол рысканияjвокруг второй из координатных осей = , имеет вид

. (3.9)

Для любой точки М тела с координатами x , y , z в подвижной системе координат, жестко связанной с ним, и с ее же координатами X , Y , Z – в неподвижной системе координат можно установить взаимосвязь проекций вектора точки на оси двух систем координат,

, (3.10)

или в матричном виде

или , (3.11)

где углы Крылова являются некоторыми функциями времени: угол дифферента ,угол крена ,угол рыскания .

Матрица транспонирована к матрице направляющих косинусов , задающей преобразование поворота от осей неподвижной системы CXYZ к осям подвижной системы Cxyz , неизменно связанной с кораблем. Очевидно, что при движении тела координаты x , y , z остаются постоянными в отличие от координат X , Y , Z.

Подставляя в (3.2) соотношения (3.5) и (3.8), получаем:

Сравнивая (3.11) и (3.12), находим, что искомая матрица является произведением трех поворотных матриц

=

=

.(3.13)

Подставляя в (3.2) соотношение (3.5), получаем промежуточное соотношение, которое может понадобиться в дальнейшем, [X ] = [x 2 ]. Промежуточная поворотная матрица = находится как произведение двух матриц поворота:

=

= (3.13a )

Углы Эйлера

В тех случаях, когда угловая скорость вращения в одном направлении значительно больше, чем в двух других (генераторы, моторы, турбины, гироскопы), для определения положения тела в качестве трех независимых параметров выбирают три угла Эйлера: угол прецессии y (t ),угол нутацииq (t ) иугол ротации (собственного вращения) j (t ). Их названия заимствованы из астрономии.

Чтобы задать эти углы, рассмотрим вращение твердого тела вокруг неподвижной точки О . Пусть даны некоторая система отсчета и связанная с ней неподвижная система координат ОXYZ , относительно которой движется твердое тело, и связанная с твердым телом система координат Оxyz , которая движется относительно первой (рис. 3.6 … 3.8). Это означает, что первая и вторая системы координат имеют общее начало O , а углы, образуемые осями Оxyz с осями ОXYZ , изменяются, т.е. система Оxyz
поворачивается вместе с твердым телом вокруг неподвижной точки О (рис. 3.5 … 3.8).


Рис. 3.6

Углы Эйлера описывают поворот объекта в трёхмерном евклидовом пространстве. При этом рассматриваются две прямоугольные системы координат, имеющие общий центр: неподвижная система и подвижная, связанная с объектом. На рис.1 неподвижная система координат имеет обозначение XYZ (она наклонена), а подвижная система обозначена как xyz. Углы Эйлера представляют собой углы, на которые поворачивается подвижная система координат, связанная с объектом, до совмещения с неподвижной системой. В классическом варианте первый поворот происходит на угол α вокруг оси z, связанной с объектом, до тех пор, пока не произойдет совпадение оси x, связанной с объектом, c плоскостью XY неподвижной системы. Такое совпадение произойдет по линии пересечения плоскостей XY и xy (линия N на рис. 1). Следующий поворот осуществляется на угол β вокруг нового положения оси x, связанной с объектом, до тех пор, пока не совместятся оси аппликат обеих прямоугольных систем. При этом ось y, связанная с объектом, окажется в плоскости xy неподвижной системы координат XYZ. Последний поворот производится на угол γ вокруг нового положения оси аппликат подвижной системы координат (она будет совпадать с такой же осью неподвижной системы), после чего оси координат XY и xy совместятся.

Рис. 1. Углы Эйлера

Такие повороты некоммутативны, и конечное положение подвижной системы координат зависит от порядка, в котором совершаются повороты.

Если известны координаты вектора R(r x , r y , r z) в подвижной системе координат XYZ и известны углы Эйлера (α, β, γ) подвижной системы координат xyz относительно неподвижной, то можно вычислить координаты этого вектора в неподвижной системе координат xyz. Для этого следует построить матрицы трех последовательных поворотов на углы α, β и γ:

Перемножая эти матрицы в обратном порядке, получим итоговую ортогональную матрицу:

T = T 3 × T 2 × T 1 ,

которая преобразует координаты вектора R(r x , r y , r z) подвижной системы координат в координаты вектора N(n x , n y , n z) такой же длины в неподвижной системе координат:

N = R ,

где N и R - матрицы-столбцы соответствующих координат.

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

Рассмотрим другой пример - создание анимации кубика при повороте его вокруг оси Z мировой системы координат на угол, превышающий 360°, например на угол 450°. Попробуем создать два ключевых кадра, между которыми кубик должен повернуться на этот угол. Для этого в программе MaxScript создайте стандартный параллелепипед:

b = box ()

После этого переместите ползунок временной шкалы анимации к кадру 10, включите режим Auto Key, а затем выполните команду:

b. rotation. z_ rotation = 450

Воспроизведите анимацию. Объект повернется только на 90°, поскольку его оборот на 360° будет игнорирован. Теперь то же самое проделайте в окне программы 3ds Max. Анимация объекта между двумя ключевыми кадрами произойдет на угол 450°. Таким образом, применение эйлеровых вращений в программах компьютерной графики, аналогичных MaxScript, ограничивается одновременным вращением на угол, не превышающий 360°. Однако это не мешает создавать анимацию вручную за экраном дисплея.

Другая проблема углов Эйлера заключается в наличии Gimbal lock, или шарнирного замка. Его появление зависит от выбора порядка поворотов объекта. Например, повернем объект вначале вокруг оси Z на угол 140°, затем вокруг оси X на угол 90°, а потом на угол 130° вокруг оси Y (рис. 2).

Рис. 2. Последовательные повороты объекта

Если теперь заново выполнить ту же последовательность поворотов, например, на углы 10° вокруг оси Z, затем на 90° вокруг оси X, а потом на 0° вокруг оси Y, то получим тот же результат. Проблема заключается в том, что когда вращение вокруг оси X становится равным 90° или -90°, то локальная ось вращения Y становится параллельной оси Z, но с обратным направлением, и поэтому вращение вокруг нее вступает в конфликт с предыдущим вращением вокруг оси Z.

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

Литература

  1. Углы Эйлера и Gimbal lock [Электронный ресурс] / http://habrahabr.ru – Хабрахабр, 2006. – Режим доступа: http://habrahabr.ru/post/183116/. – Дата доступа: 10.10.2013.
  2. Кватернионы и вращение пространства [Электронный ресурс] / http://ru.wikipedia.org/ – Википедия - свободная энциклопедия, 2001. – Режим доступа: http://ru.wikipedia.org/wiki/ Кватернионы_и_вращение_пространства. – Дата доступа: 11.10.2013.

По работе у меня возникла необходимость переводить координаты объекта из углов Эйлера в кватернионы и обратно.

Формулы для пересчёта углов Эйлера в кватеринионы и обратно найти можно, но

Опишу коротко суть проблемы:

  1. Тело в трёхмерном пространстве имеет 6 степеней свободы: 3 координаты и 3 угла поворота.
  2. С координатами всё хорошо, например, если они (4,5,2), то это означает, что тело нужно сдвинуть относительно начала координат на +4 единицы по оси X, на +5 единиц по оси Y и на +2 единицы по оси Z. При этом порядок сдвига не важен. Можно сначала сдвинуть по X, потом по Y, потом по Z, а можно в другой последовательности. От перемены мест слагаемых сумма не меняется.
  3. С поворотами всё гораздо хуже. Иногда может сложиться ощущение, что для них тоже просто достаточно задать углы поворота вокруг трёх осей и этого будет достаточно (например: перевернуть предмет на 180 градусов вокруг оси X, потом на 180 градусов вокруг оси Y, а затем на 90 градусов вокруг оси Z - в каком порядке не поворачивай - результат будет один и тот же). Эта ловушка возникает оттого, что нам легче всего оперировать углами типа 90 или 180 градусов, а они-то как раз и представляют из себя очень частный случай. В общем случае порядок поворотов имеет значение.
А как же быть с законом, говорящим, что от перестановки мест слагаемых сумма не меняется? Дело в том, что композиция нескольких поворотов соответствует уже не сумме векторов (как в случае с операциями параллельного переноса), а произведению. И произведению не просто чисел, а специальных объектов - матриц поворота, например - на которые коммутативность «обычного» умножения не распространяется. В зависимости от порядка выбора осей поворота и от того, будут ли поворачиваться оси вместе с объектом или поворачиваться будет только объект, можно выделить 24 типа описаний поворотов. Очень часто углы поворота вокруг осей называются углами Эйлера. Иногда, в некоторых источниках эти углы называются углами Тэйт-Брайана либо углами Эйлера в зависимости от того, все три оси, вокруг которых делается вращение разные (углы Тэйт-Брайана), либо же первая и последняя оси - одна и та же. Также эти углы называют angles of extrinsic rotation - если оси неподвижны или angles of intrinsic rotation - если оси вращаются вместе с объектом.
Чтоб не запутаться, приведу все типы вращений здесь:
Тейт-Брайана, внутренние:
ZYXr; YZXr; XZYr; ZXYr; YXZr; XYZr.
Эйлера, внутренние:
XYXr; XZXr; YZYr; YXYr; ZXZr; ZYZr.
Тейт-Брайана, внешние:
ZYXs; YZXs; XZYs; ZXYs; YXZs; XYZs.
Эйлера, внешние:
XYXs; XZXs; YZYs; YXYs; ZXZs; ZYZs.
Внешние углы комплементарны внутренним, прочитанным задом наперёд, например: внешние углы Эйлера 10, 20, 30 градусов в формате XYXs это то же самое, что и внутренние углы Эйлера 30, 20, 10 градусов в формате XYXr.

Собственно, об этом уже было сказано много раз. Зачем же писать новую статью? Дело в том, что информации о том, как переводить из углов Эйлера в кватернион и обратно - не так уж и много. И в большинстве случаев описывается только 1 или 2, 3, 6 систем углов Эйлера. Но не все 24. И по аналогии вывести остальные (и не ошибиться) не очень-то и просто. Во время «откапывания истины» мне удалось найти несколько онлайн-конвертеров из углов в кватернионы и по тому, в каком направлении увеличивается их возможность по конвертации можно понять, сколько ещё вариантов осталось не охвачено:
quat.zachbennett.com - один тип углов

onlineconversion.com - один тип углов
quaternions.online - три типа углов
andre-gaschler.com - шесть типов углов

Единственное место, где я смог найти описание преобразований для всех 24 типов углов - это книга «Graphics Gems IV». Репозитарий с исходниками от этой книги находится здесь: Исходники к книге Graphics Gems IV . Если говорить про код преобразования из углов Эйлера в кватернионы и обратно, то эти исходники в репозитарии находятся здесь: .../GraphicsGems/gemsiv/euler_angle. Но у них есть один недостаток: с целью сделать максимально общую функцию расчёта углов и кватернионов, автор очень сильно усложнил код. Т.е. код получился очень компактным, но плохо подходящим для перевода на другие языки или для оптимизации под конкретные случаи. Так как мне очень нужно было разобраться со всеми 24-мя случаями, то пришлось этот код немного поисследовать и развернуть его в набор простых случаев. Также я написал небольшие юнит-тесты и проверил, что мой код работает корректно. Т.к. эти юнит-тесты используют код, скомпилированный из исходников от книги Graphics Gems, то выкладывать их (юнит-тесты) я не стал.

Не буду приводить в тексте статьи свои исходники (они написаны на языке Octave). Дам лишь ссылку на репозитарий и прокомментирую его содержимое:

Обеих функций в Octave нет. В Matlab поддерживаются только 6 типов углов Эйлера на неподвижных осях. В моих реализациях поддерживаются все 24 типа. При этом типы с буквой r на конце (например, XYZr) означают, что оси вращаются вместе с объектом. Типы с буквой s на конце (например, XYZs) означают, что оси остаются неподвижными.

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

С некоторой натяжкой именно так работает вращение с помощью углов Эйлера. Немного непредсказуемо и неудобно, не правда ли? Углы Эйлера имеют несколько недостатков, но есть одно особенно нехорошее свойство из-за которого вы не захотите с ними связываться. Его имя - Gimbal lock.

В русском языке gimbal lock называют по-разному: шарнирный замок, блокировка осей, складывание рамок. К сожалению, по запросам в поисковике с такими ключевыми словами выдаётся много мусора, а статья в Википедии оставляет желать лучшего, поэтому я сам расскажу вам об этом феномене и предложу как с ним бороться.

Внимание! Заходя под кат вы подвергаетесь риску поломать голову.

Для начала напомню что такое углы Эйлера. Вы наверное помните, что это что-то вроде набора из трёх углов вращения вокруг осей X, Y и Z? Не совсем так. Предположим, вы хотите повернуть некий объект, и у вас есть набор конечных углов (X: 45°, Y: 45°, Z: 45°). Один из подвохов эйлеровых углов - необходимость выбора какого-то одного порядка поворотов. Если сначала повернуть на 45° вокруг оси X, затем вокруг Y и в конце вокруг Z, то получится результат как на левой половине картинки снизу. Если порядок будет Z-X-Y, то результат будет другой, как на правой половинке.


На самом деле…

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


От выбора порядка поворотов зависит место появления шарнирного замка. Что же это такое? Возьмём к примеру такой порядок поворотов: Z-X-Y. Если вращение вокруг оси X будет равно 90° или -90°, то вращения вокруг Z и Y будут «есть» друг друга и останется только огрызок от большего из вращений. Например (X: 90°, Y: 90°, Z: 90°) превратится в просто (X: 90°, Y: 0°, Z: 0°). Внимание на иллюстрацию.

Так же можно подставить (X: 90°, Y: 130°, Z: 140°) или (X: 90°, Y: 30°, Z: 40°), но в результате всё равно будет получаться (X: 90°, Y: 0°, Z: 10°). Немного не интуитивно, вам не кажется? Это всё из-за шарнирного замка. Когда вращение вокруг оси X становится равным 90° или -90°, ещё не использованная локальная ось вращения Y становится параллельной оси Z, но с обратным направлением, поэтому вращение вокруг неё вступает в конфликт с предыдущим вращением вокруг Z.

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

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

Шарнирный замок появляется в середине иерархии поворотов. Если использовать порядок X-Y-Z или Z-Y-X, то поворот направо или налево будет заклинивать анимацию. Поскольку такой поворот встречается гораздо чаще чем, например, поворот в сторону зенита или надира, то во многих программах используют последовательность Z-X-Y. Такая иерархия поворотов используется в Unity3d, правда внутри все вращения всё равно хранятся в кватернионах. Что такое кватернионы? Об этом лучше рассказать отдельно. Кватернионы и матрицы вращения это один из способов избежать шарнирного замка. Также существуют хитрые алгоритмы, которые плавно обходят замок стороной, но это отражается на качестве анимации. Лучше всего использовать углы Эйлера только для простых случаев: пропеллеры, колёса, маятники. Иногда можно поменять иерархию поворотов, но тогда всё равно придётся помнить о замке.

Последние материалы раздела:

Интересные факты о физике
Интересные факты о физике

Какая наука богата на интересные факты? Физика! 7 класс - это время, когда школьники начинают изучать её. Чтобы серьезный предмет не казался таким...

Дмитрий конюхов путешественник биография
Дмитрий конюхов путешественник биография

Личное дело Федор Филиппович Конюхов (64 года) родился на берегу Азовского моря в селе Чкалово Запорожской области Украины. Его родители были...

Ход войны Русско японская 1904 1905 карта военных действий
Ход войны Русско японская 1904 1905 карта военных действий

Одним из крупнейших военных конфликтов начала XX века является русско-японская война 1904-1905 гг. Ее результатом была первая, в новейшей истории,...