diff --git a/README.md b/README.md index 58e490a..bf62098 100644 --- a/README.md +++ b/README.md @@ -138,10 +138,10 @@ You can see a user-contributed [variant of complete circuit diagram](https://mir |Motor|Position|Direction|Prop type|Motor wires|GPIO| |-|-|-|-|-|-| - |Motor 0|Rear left|Counter-clockwise|B|Black & White|GPIO12 (*TDI*)| - |Motor 1|Rear right|Clockwise|A|Blue & Red|GPIO13 (*TCK*)| - |Motor 2|Front right|Counter-clockwise|B|Black & White|GPIO14 (*TMS*)| - |Motor 3|Front left|Clockwise|A|Blue & Red|GPIO15 (*TD0*)| + |Motor 0|Rear left|Counter-clockwise|B|Black & White|GPIO12 *(TDI)*| + |Motor 1|Rear right|Clockwise|A|Blue & Red|GPIO13 *(TCK)*| + |Motor 2|Front right|Counter-clockwise|B|Black & White|GPIO14 *(TMS)*| + |Motor 3|Front left|Clockwise|A|Blue & Red|GPIO15 *(TD0)*| Clockwise motors have blue & red wires and correspond to propeller type A (marked on the propeller). Counter-clockwise motors have black & white wires correspond to propeller type B. diff --git a/docs/assembly.md b/docs/assembly.md index 5f5d6d5..b23c113 100644 --- a/docs/assembly.md +++ b/docs/assembly.md @@ -41,10 +41,10 @@ Motors connection table: |Motor|Position|Direction|Prop type|Motor wires|GPIO| |-|-|-|-|-|-| -|Motor 0|Rear left|Counter-clockwise|B|Black & White|GPIO12 (*TDI*)| -|Motor 1|Rear right|Clockwise|A|Blue & Red|GPIO13 (*TCK*)| -|Motor 2|Front right|Counter-clockwise|B|Black & White|GPIO14 (*TMS*)| -|Motor 3|Front left|Clockwise|A|Blue & Red|GPIO15 (*TD0*)| +|Motor 0|Rear left|Counter-clockwise|B|Black & White|GPIO12 *(TDI)*| +|Motor 1|Rear right|Clockwise|A|Blue & Red|GPIO13 *(TCK)*| +|Motor 2|Front right|Counter-clockwise|B|Black & White|GPIO14 *(TMS)*| +|Motor 3|Front left|Clockwise|A|Blue & Red|GPIO15 *(TD0)*| ## Motors tightening diff --git a/docs/book/geometry.md b/docs/book/geometry.md index 3523725..65df08d 100644 --- a/docs/book/geometry.md +++ b/docs/book/geometry.md @@ -110,7 +110,7 @@ float angle = Vector::angleBetween(a, b); // 1.57 (90 градусов) #### Скалярное произведение -Скалярное произведение векторов (*dot product*) — это произведение длин двух векторов на косинус угла между ними. В математике оно обозначается знаком `·` или слитным написанием векторов. Интуитивно, результат скалярного произведения показывает, насколько два вектора *сонаправлены*. +Скалярное произведение векторов *(dot product)* — это произведение длин двух векторов на косинус угла между ними. В математике оно обозначается знаком `·` или слитным написанием векторов. Интуитивно, результат скалярного произведения показывает, насколько два вектора *сонаправлены*. В Flix используется статический метод `Vector::dot()`: @@ -124,7 +124,7 @@ float dotProduct = Vector::dot(a, b); // 32 #### Векторное произведение -Векторное произведение (*cross product*) позволяет найти вектор, перпендикулярный двум другим векторам. В математике оно обозначается знаком `×`, а в прошивке используется статический метод `Vector::cross()`: +Векторное произведение *(cross product)* позволяет найти вектор, перпендикулярный двум другим векторам. В математике оно обозначается знаком `×`, а в прошивке используется статический метод `Vector::cross()`: ```cpp Vector a(1, 2, 3); @@ -144,9 +144,9 @@ Vector crossProduct = Vector::cross(a, b); // -3, 6, -3 В прошивке углы Эйлера сохраняются в обычный объект `Vector` (хоть и, строго говоря, не являются вектором): -* Угол по крену (*roll*) — `vector.x`. -* Угол по тангажу (*pitch*) — `vector.y`. -* Угол по рысканию (*yaw*) — `vector.z`. +* Угол по крену *(roll)* — `vector.x`. +* Угол по тангажу *(pitch)* — `vector.y`. +* Угол по рысканию *(yaw)* — `vector.z`. Особенности углов Эйлера: @@ -162,8 +162,8 @@ Vector crossProduct = Vector::cross(a, b); // -3, 6, -3 Помимо углов Эйлера, любую ориентацию в трехмерном пространстве можно представить в виде вращения вокруг некоторой оси на некоторый угол. В геометрии это доказывается, как **теорема вращения Эйлера**. В таком представлении ориентация задается двумя величинами: -* **Ось вращения** (*axis*) — единичный вектор, определяющий ось вращения. -* **Угол поворота** (*angle* или *θ*) — угол, на который нужно повернуть объект вокруг этой оси. +* **Ось вращения** *(axis)* — единичный вектор, определяющий ось вращения. +* **Угол поворота** *(angle* или *θ)* — угол, на который нужно повернуть объект вокруг этой оси. В Flix ось вращения задается объектом `Vector`, а угол поворота — числом типа `float` в радианах: @@ -177,7 +177,7 @@ float angle = radians(45); ### Вектор вращения -Если умножить вектор *axis* на угол поворота *θ*, то получится **вектор вращения** (*rotation vector*). Этот вектор играет важную роль в алгоритмах управления ориентацией летательного аппарата. +Если умножить вектор *axis* на угол поворота *θ*, то получится **вектор вращения** *(rotation vector)*. Этот вектор играет важную роль в алгоритмах управления ориентацией летательного аппарата. Вектор вращения обладает замечательным свойством: если угловые скорости объекта (в собственной системе координат) в каждый момент времени совпадают с компонентами этого вектора, то за единичное время объект придет к заданной этим вектором ориентации. Это свойство позволяет использовать вектор вращения для управления ориентацией объекта посредством управления угловыми скоростями. @@ -198,7 +198,7 @@ Vector rotation = radians(45) * Vector(1, 2, 3); quaternion.h.
-Вектор вращения удобен, но еще удобнее использовать **кватернион**. В 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) \\] diff --git a/docs/book/gyro.md b/docs/book/gyro.md index 5034343..e5dc223 100644 --- a/docs/book/gyro.md +++ b/docs/book/gyro.md @@ -177,7 +177,7 @@ imu.setDLPF(imu.DLPF_MAX); ## Калибровка гироскопа -Как и любое измерительное устройство, гироскоп вносит искажения в измерения. Наиболее простая модель этих искажений делит их на статические смещения (*bias*) и случайный шум (*noise*): +Как и любое измерительное устройство, гироскоп вносит искажения в измерения. Наиболее простая модель этих искажений делит их на статические смещения *(bias)* и случайный шум *(noise)*: \\[ gyro_{xyz}=rates_{xyz}+bias_{xyz}+noise \\] diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 918116c..1d5293e 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -13,10 +13,10 @@ Do the following: Do the following: * **Check the battery voltage**. Use a multimeter to measure the battery voltage. It should be in range of 3.7-4.2 V. -* **Check if there are some startup errors**. Connect the ESP32 to the computer and check the Serial Monitor output. Use the Reset button to make sure you see the whole ESP32 output. +* **Check if there are some startup errors**. Connect the ESP32 to the computer and check the Serial Monitor output. Use the Reset button to make sure you see the whole ESP32 startup output. * **Check the baudrate is correct**. If you see garbage characters in the Serial Monitor, make sure the baudrate is set to 115200. * **Make sure correct IMU model is chosen**. If using ICM-20948/MPU-6050 board, change `MPU9250` to `ICM20948`/`MPU6050` in the `imu.ino` file. -* **Check if the console is working**. Perform `help` command in Serial Monitor. You should see the list of available commands. You can also access the console using QGroundControl (*Vehicle Setup* ⇒ *Analyze Tools* ⇒ *MAVLink Console*). +* **Check if the console is working**. Perform `help` command in Serial Monitor. You should see the list of available commands. You can also access the console using QGroundControl *(Vehicle Setup* ⇒ *Analyze Tools* ⇒ *MAVLink Console)*. * **Configure QGroundControl correctly before connecting to the drone** if you use it to control the drone. Go to the settings and enable *Virtual Joystick*. *Auto-Center Throttle* setting **should be disabled**. * **If QGroundControl doesn't connect**, you might need to disable the firewall and/or VPN on your computer. * **Check the IMU is working**. Perform `imu` command and check its output: diff --git a/docs/usage.md b/docs/usage.md index 5265fa9..3e993ed 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -250,8 +250,8 @@ You can configure the Wi-Fi using parameters and console commands. The Wi-Fi mode is chosen using `WIFI_MODE` parameter in QGroundControl or in the console: * `0` — Wi-Fi is disabled. -* `1` — Access Point mode (*AP*) — the drone creates a Wi-Fi network. -* `2` — Client mode (*STA*) — the drone connects to an existing Wi-Fi network. +* `1` — Access Point mode *(AP)* — the drone creates a Wi-Fi network. +* `2` — Client mode *(STA)* — the drone connects to an existing Wi-Fi network. * `3` — *ESP-NOW (not implemented yet)*. > [!WARNING] diff --git a/tools/pyflix/README.md b/tools/pyflix/README.md index c336275..4ffb794 100644 --- a/tools/pyflix/README.md +++ b/tools/pyflix/README.md @@ -92,17 +92,17 @@ Full list of events: |-----|-----------|----------------| |`connected`|Connected to the drone|| |`disconnected`|Connection is lost|| -|`armed`|Armed state update|Armed state (*bool*)| -|`mode`|Flight mode update|Flight mode (*str*)| -|`landed`|Landed state update|Landed state (*bool*)| +|`armed`|Armed state update|Armed state *(bool)*| +|`mode`|Flight mode update|Flight mode *(str)*| +|`landed`|Landed state update|Landed state *(bool)*| |`print`|The drone prints text to the console|Text| -|`attitude`|Attitude update|Attitude quaternion (*list*)| -|`attitude_euler`|Attitude update|Euler angles (*list*)| -|`rates`|Angular rates update|Angular rates (*list*)| -|`channels`|Raw RC channels update|Raw RC channels (*list*)| -|`motors`|Motor outputs update|Motor outputs (*list*)| -|`acc`|Accelerometer update|Accelerometer output (*list*)| -|`gyro`|Gyroscope update|Gyroscope output (*list*)| +|`attitude`|Attitude update|Attitude quaternion *(list)*| +|`attitude_euler`|Attitude update|Euler angles *(list)*| +|`rates`|Angular rates update|Angular rates *(list)*| +|`channels`|Raw RC channels update|Raw RC channels *(list)*| +|`motors`|Motor outputs update|Motor outputs *(list)*| +|`acc`|Accelerometer update|Accelerometer output *(list)*| +|`gyro`|Gyroscope update|Gyroscope output *(list)*| |`mavlink`|Received MAVLink message|Message object| |`mavlink.`|Received specific MAVLink message|Message object| |`mavlink.`|Received specific MAVLink message|Message object| @@ -277,7 +277,3 @@ logger = logging.getLogger('flix') logger.setLevel(logging.DEBUG) # be more verbose logger.setLevel(logging.WARNING) # be less verbose ``` - -## Stability - -The library is in development stage. The API is not stable.