4.5 KiB
4.5 KiB
Принятые термины
Psi (фи) - угол рысканья
Gam (гамма) - угол крена
Tan - угол тангажа
Структура Skywalker2015PacketTelemetry
Входные данные с симулятора
| Поле | Описание | Ед. измерения |
|---|---|---|
L |
Координата Х (север) | м |
Z |
Координата Z (восток) | м |
H |
Координата Y (высота) | м |
Psi |
Угол рысканья | градусы |
Gam |
Угол крена | градусы |
Tan |
Угол тангажа | градусы |
V |
Скорость полета БПЛА | м/с |
Vx1 |
Продольная скорость | м/с |
Vy1 |
Поперечная скорость | м/c |
Vz1 |
Вертикальная скорость | м/c |
wx |
Угловая скорость вокруг продольной оси | 1°/с |
wy |
Угловая скорость вокруг вертикальной оси | 1°/с |
wz |
Угловая скорость вокруг поперечной оси | 1°/с |
Структура SignalBody
Меняется от задания к заданию
| Поле | Описание | Ед. измерения |
|---|---|---|
Gamma_direct |
Целевой угол крена | м |
Tang_direct |
Целевой угол тангажа | м |
Комментарий SIM
#define SIM
Иногда используется для отладки на симуляторе, необходимо отключить при переходе на стэнд.
Вывод в консоль
void printtoDebugSerial(String s)
Используется для вывода в консоль. Необходимо приводить аргумент к строке.
Вычитание углов
float AngDefines(float angleDelta)
Принимает разность углов и нормализует её (обрабатывает переход через 360 и т. п. вещи)
Регуляровка курса
Регулируем тангаж
#include <iostream>
#include <cmath>
template <typename T>
constexpr T constrain(T value, T low, T high) {
if (value < low) {
return low;
} else if (value > high) {
return high;
} else {
return value;
}
}
/**
* Нормализует угловую ошибку в диапазон [-180°, 180°).
* @param error Угловая ошибка в градусах.
* @return Нормализованная ошибка.
*/
float AngDefines(float error) {
error = fmod(error, 360.0f);
if (error < 0) {
error += 360.0f;
}
if (error > 180.0f) {
error -= 360.0f;
}
return error;
}
// Reference: GammaReg, page 141
// Description: Keep yaw angle target
class YawRegulator final {
public:
YawRegulator(float P = 2.f, float D = 35.f) {
_p = P;
_d = D;
}
float Calc(float yaw, float target_yaw) {
float roll_err = AngDefines(yaw - target_yaw);
float roll_cmd = _p * roll_err + _d * (roll_err - _roll_err_last);
_roll_err_last = roll_err;
roll_cmd = constrain(roll_cmd, -30.f, 30.f);
return roll_cmd;
}
private:
float _roll_err_last = 0.f;
float _p = 0.f;
float _d = 0.f;
};
int main() {
YawRegulator yawRegulator;
// Не забывайте про инверсию угла
std::cout << yawRegulator.Calc(-30.f, 15.f) << std::endl;
return EXIT_SUCCESS;
}