Minor fixes in book

This commit is contained in:
Oleg Kalachev 2025-05-31 16:56:05 +03:00
parent 963cbe09dd
commit 2d77317abc

View File

@ -57,7 +57,7 @@ v.z = 15;
В прошивке в виде векторов представлены, например: В прошивке в виде векторов представлены, например:
* `acc` — истинное ускорение с акселерометра. * `acc` собственное ускорение с акселерометра.
* `gyro` — угловые скорости с гироскопа. * `gyro` — угловые скорости с гироскопа.
* `rates` — рассчитанная угловая скорость дрона. * `rates` — рассчитанная угловая скорость дрона.
* `accBias`, `accScale`, `gyroBias` — параметры калибровки IMU. * `accBias`, `accScale`, `gyroBias` — параметры калибровки IMU.
@ -124,7 +124,7 @@ float dotProduct = Vector::dot(a, b); // 32
#### Векторное произведение #### Векторное произведение
Векторное произведение (*cross product*) позволяет найти вектор, перпендикулярный двум другим векторам. В математике оно обозначается знаком `×`, а в прошивке статический метод `Vector::cross()`: Векторное произведение (*cross product*) позволяет найти вектор, перпендикулярный двум другим векторам. В математике оно обозначается знаком `×`, а в прошивке используется статический метод `Vector::cross()`:
```cpp ```cpp
Vector a(1, 2, 3); Vector a(1, 2, 3);
@ -136,7 +136,7 @@ Vector crossProduct = Vector::cross(a, b); // -3, 6, -3
### Ориентация в трехмерном пространстве ### Ориентация в трехмерном пространстве
В отличие от позиции и скорости, у ориентации в трехмерном пространстве нет универсального для всех случаев способа представления. В зависимости от задачи ориентация может быть представлена в виде углов Эйлера, матрицы поворота, вектора вращения или кватерниона. Рассмотрим используемые в полетной прошивке способы представления ориентации. В отличие от позиции и скорости, у ориентации в трехмерном пространстве нет универсального для всех случаев способа представления. В зависимости от задачи ориентация может быть представлена в виде *углов Эйлера*, *матрицы поворота*, *вектора вращения* или *кватерниона*. Рассмотрим используемые в полетной прошивке способы представления ориентации.
### Углы Эйлера ### Углы Эйлера
@ -198,13 +198,13 @@ Vector rotation = radians(45) * Vector(1, 2, 3);
<a href="https://github.com/okalachev/flix/blob/master/flix/quaternion.h"><code>quaternion.h</code></a>.<br> <a href="https://github.com/okalachev/flix/blob/master/flix/quaternion.h"><code>quaternion.h</code></a>.<br>
</div> </div>
Вектор вращения удобен, но для математических расчетов еще удобнее использовать **кватернион**. В Flix кватернионы представляются объектами `Quaternion` из библиотеки `quaternion.h`. Кватернион состоит из четырех значений: *w*, *x*, *y*, *z* и рассчитывается из вектора оси вращения (*axis*) и угла поворота (*θ*) по следующей формуле: Вектор вращения удобен, но еще удобнее использовать **кватернион**. В Flix кватернионы задаются объектами `Quaternion` из библиотеки `quaternion.h`. Кватернион состоит из четырех значений: *w*, *x*, *y*, *z* и рассчитывается из вектора оси вращения (*axis*) и угла поворота (*θ*) по формуле:
\\[ q = \left( \begin{array}{c} w \\\\ x \\\\ y \\\\ z \end{array} \right) = \left( \begin{array}{c} \cos\left(\frac{\theta}{2}\right) \\\\ axis\_x \cdot \sin\left(\frac{\theta}{2}\right) \\\\ axis\_y \cdot \sin\left(\frac{\theta}{2}\right) \\\\ axis\_z \cdot \sin\left(\frac{\theta}{2}\right) \end{array} \right) \\] \\[ q = \left( \begin{array}{c} w \\\\ x \\\\ y \\\\ z \end{array} \right) = \left( \begin{array}{c} \cos\left(\frac{\theta}{2}\right) \\\\ axis\_x \cdot \sin\left(\frac{\theta}{2}\right) \\\\ axis\_y \cdot \sin\left(\frac{\theta}{2}\right) \\\\ axis\_z \cdot \sin\left(\frac{\theta}{2}\right) \end{array} \right) \\]
На практике оказывается, что **именно такое представление наиболее удобно для математических расчетов**. На практике оказывается, что **именно такое представление наиболее удобно для математических расчетов**.
Проиллюстрируем кватернион и остальные описанные выше способы представления ориентации с помощью интерактивной визуализации. Изменяйте угол поворота *θ* с помощью ползунка (ось вращения константна) и изучите, как меняется ориентация объекта, вектор вращения и кватернион: Проиллюстрируем кватернион и описанные выше способы представления ориентации на интерактивной визуализации. Изменяйте угол поворота *θ* с помощью ползунка (ось вращения константна) и изучите, как меняется ориентация объекта, вектор вращения и кватернион:
<div id="rotation-diagram" class="diagram"> <div id="rotation-diagram" class="diagram">
<p> <p>
@ -269,7 +269,7 @@ Quaternion q = Quaternion::fromBetweenVectors(v1, v2); // в виде квате
Vector rotation = Vector::rotationVectorBetween(v1, v2); // в виде вектора вращения Vector rotation = Vector::rotationVectorBetween(v1, v2); // в виде вектора вращения
``` ```
Шорткаты для работы с вращением по рысканию (удобно для алгоритмов управления полетом): Шорткаты для работы с углом Эйлера по рысканью (удобно для алгоритмов управления полетом):
```cpp ```cpp
float yaw = q.getYaw(); float yaw = q.getYaw();