Xan> Нет. Это просто перевод прочитанных из мемсов значений в радианы/с2.
Опять апучатка — радианы в секунду, конечно.
SashaMaks> Дальше, у меня идёт запоминание нуля в простейшем виде и вероятно оно совпадает с твоим кодом?
У меня перед стартом, вместо "усреднить за большой интервал", сделано "подкручивать маленькими шагами, чтоб получился ноль".
if (BEFORE_START)
{
if (x > 0.0)
zero_x += 0.00001; // Настройка нулей перед стартом.
else
zero_x -= 0.00001;
...
}
SashaMaks> Потом корректируем начальное положение:
Нет, у меня сначала делается промежуточное значение
x = (float)gyro_x - zero_x;
значение int из гиры превратилось во float (и минус ноль),
а потом, с учетом преобразования в радианы/с, превратилось в угол за квант времени
x = k_x * x * dt;
Это потому что у меня привычка сложные вычисления расписывать в несколько простых строчек. От древних компиляторов осталась.
SashaMaks> Вот это непонятно зачем и какие данные должны быть в этих коэффициентах, если не с потолка?
float k_xy, k_xz, k_yx, k_yz, k_zx, k_zy; // Поправки на неотогональность осей гироскопов.
k_xy = 0.001;
...
x += k_xy * y + k_xz * z; // Поправка на взаимное влияние осей гироскопов.
...
Правильные производители не только стараются сделать оси мемсов ортогональными, но и пишут, какая кривизна может быть в их устройствах, когда одна ось немного чувствует другую.
Вот чтоб взаимную чувствительность довести до нуля, надо это делать.
Возможно, в некоторых мемсах корректировка уже делается во внутренних мозгах индивидуальными заводсками настройками. Тогда в проге это не нужно.
Но это надо проверять на каждой собранной самоделке.
SashaMaks> Косинусы с синусами:
...
SashaMaks> Я опустил приближенный расчёт тригонометрии пока. Вроде все правильно переписал?
Тут у меня глаза разбежались.