Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

Notice: Undefined index: HTTP_ACCEPT in /home/n/newavtjc/radiocopter.ru/public_html/wp-content/plugins/realbig-media/textEditing.php on line 823

Mavic pro отключается в середине полета

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

Вот некоторые из причин, по которым он может отключаться:

  • Возможно, USB-кабель, соединяющий ваше устройство с пультом дистанционного управления, подключен неправильно, что может привести к потере зрения.
  • Если вы не войдете в приложение DJI GO, соединение может прерваться во время полета.
  • Поврежденный USB-порт на телефоне или планшете может привести к проблемам с подключением.
  • Еще одна причина, по которой во время полета отключается визуальное изображение, с которым столкнулись многие пилоты, заключается в неисправной SD-карте. многие пилоты начали удалять SD-карту, чтобы избавиться от этой проблемы.
  • Во многих случаях проблемы с подключением вызваны неполадками с телефоном или планшетом, используемым для управления дроном.
  • Файлы кэша в приложении DJI GO 4 могут быстро заполняться, и они могут даже быть повреждены. Это может вызвать проблемы с подключением между устройством и дроном.
  • Возможно, вы об этом не знаете, но проблема может заключаться в пульте дистанционного управления. Порты и кабели могут быть загрязнены или антенна может быть повернута не в ту сторону.

Если ваш Mavic отключается от приложения DJI GO, но вы все еще можете управлять дроном с помощью RC-контроллера, вам все равно нужно знать, что делать, чтобы снова восстановить видеосвязь.

Смотрите про коптеры:  Обзор квадрокоптера WLtoys V303 Seeker - Разборка квадрокоптера WLtoys V303 Seeker

Но помните, что в этом случае у Mavic есть функция «возвращение домой», которая позволяет дрону вернуться в точку, с которой он взлетел, если он потеряет связь с приложением GO или контроллером.

Problem with gyro calibration on arm (2.5.4) · issue #301 · betaflight/betaflight

Before heading off to fly today I updated my fleet from 2.5.3 to 2.5.4 – mainly because I wanted the improved gyro calibration with faster loop times and the automatic calibration on arm. All of my quads are x-frames with the battery on the bottom so I’m always careful about using stick command to recalibrate before arming and wanted the automatic option instead.

One of the quads was brand new and being maidened (Shen Drones Mixuko). First couple of flights were fine. On the third flight after arming and moving the throttle above min_check the quad flipped out and went into a high-speed yaw spin (tasmanian devil!). Got it disarmed and it landed 25 feet away! After repairing the damage, tried again and it again flipped out but not nearly so violently. Bench tested without props and the motors were all normal, sensors looked normal in the configurator, etc. Triple-checked that the props were on correctly, and even changed them again to be sure there wasn’t excessive vibration (they were new on the first flip-out). Note that there were no crashes on this brand new quad before the first occurrence. Since this was a new build, I begrudgingly assumed that I had some bad part or a problem with the flight controller (X-Racer F303 v2 with VBAT) and set it aside to fly my other quads. Other specs: Littlebee 20a, Sunnysky 2204 2300kv, FrSky X4R-SB. Completely default PID’s (luxfloat), loop time 375 with accelerometer enabled.

Смотрите про коптеры:  Новый 4DRC M1 Pro 2 Ось Gimbal Профессиональный 4K HD Камера бесщеточный мотор GPS 5G WI FI FPV Дрон Квадрокоптер с дистанционным управлением 2 км дальность полета|Радиоуправляемые вертолеты| | АлиЭкспресс

First flight on the next quad was fine (RMRC Goby 180). Next flight the quad did the same flip-out as soon as I got the throttle above min_check. Intermittently it happened a couple more times. Nearly identical config to first quad, just tuned PID’s/rates.

So I moved on the the third quad (BeeRotor X200). Same behavior, couple of good flights and then intermittent flip-outs on initial throttle up. Once again, same config.

Having the same symptom on 3 different rigs negates a hardware problem possibility and the only common was that I upgraded all to 2.5.4. So I went back to 2.5.3 and the problems completely went away.

Began to troubleshoot again later in the day and found that one of my flying buddies had also upgraded to 2.5.4 but wasn’t having any problems (also with a X-Racer F303 FC). The difference I found was that he was not using the auto calibration on arm. So at the risk of more damage, I re-flashed back to 2.5.4 but this time set gyro_cal_on_first_arm = OFF. No more problems. Flew another 15 packs and everything was perfectly normal.

So I’m thinking there’s a problem with the gyro calibration not completing completely or correctly when done during the arming sequence. Thinking back on all the flip-outs each one was a little different in there intensity and although I can’t prove it they all seemed to be in the yaw axis.

Possibly something unusual that may be contributing: I have motor_stop enabled and also have air mode enabled when I’m in rate mode and disabled in angle/horizon. That way I can use angle mode for landings with lots of camera tilt and have motor stop working for easily killing the motors on landing (love this feature!). Maybe there’s some interaction with motor_stop and the new automatic gyro calibration on arm?

I normally take off in rate mode (with air mode enabled which overrides motor_stop) so when I switch arm the motors spin. The flip-outs occurred immediately after the throttle reached min_check (no other stick inputs). I also tested in LOS in both angle and horizon mode and saw the same behavior. Since I had motor_stop enabled the motors weren’t spinning after armed and once throttle advanced past min_check the motors started spinning and the flip-out occurred.

Tapfly

TapFly включает в себя два подрежима «Track» и «Point»:

Track — предлагает пользователю автоматический полёт дрона по нарисованной кривой. Иначе говоря после выбора режима, система дрона предложит пользователю в открывшемся поле карты нарисовать любую кривую, после чего коптер послушно пролетит в рамках этой кривой.

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

Point — предлагает пользователю автоматический полёт дрона по точкам. Иначе говоря система дрона предложит пользователю в открывшемся поле карты отметить точки, по которым в последствии будет осуществлён автоматический полёт.

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

На практике функция TapFly работает относительно исправно, однако опять же из-за применения простых технологий её работа далека от того уровня, что предлагают более дорогие и технологичные модели. Активируется через иконку в правом нижнем углу, которая появляется при переходе из FPV режима в режим отображения карты.

Зарядка

Заряжается от любого стандартного ЗУ (мощностью до 45 Вт), которым обычно заряжают смартфон, либо просто от USB порта любого устройства (ПК, Ноутбук, Power Bank; Рекомендуемое напряжение: 5В/2А-2.1А). Для зарядки аккумуляторной батареи дрона в комплекте идут два кабеля обеспечивающие различную по скорости зарядку:

USB ⟷ USB-C кабель: с таким кабелем время зарядки батареи до 100% займёт около 5.5 часов. На процесс зарядки укажет мигающий светодиод. Аккумулятор заряжен, когда светодиод осуществляет стабильное свечение.

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

PD кабель (Power Delivery; сокр. PD): данный кабель разработчик рекомендует использовать в тандеме с зарядным блоком питания (PD-адаптером; в комплект не входит) мощностью до 45 Вт. В таком случае время зарядки батареи до 100% сократится до 70 минут. На процесс зарядки укажет мигающий светодиод. Аккумулятор заряжен, когда светодиод осуществляет стабильное свечение.

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

К сведению! Зарядный PD кабель (Power Delivery; сокр. PD) — предназначен для работы с более высокой мощностью. Поддерживает подачу питания до 100 Вт).

Как заново настроить гироскоп на xiaomi

К счастью, разработчики предусмотрели подобное развитие событий, и встроили механизм калибровки в системное приложение «Компас».

Найдите иконку компаса на рабочем столе, удерживайте на ней нажатие, пока не появится всплывающее меню «О приложении», нажмите на него.
Вход в настройки приложения Компас на Xiaomi

Вы попадёте в меню приложения, в нижней панели найдите кнопку

«Очистить»Очистить данные приложения Компас на Xiaomi

Нажмите на неё и во всплывающем меню выберите

«Очистить всё»Очистить данные приложения Компас на Xiaomi

Эта команда удалит калибровочные данные гироскопа из памяти телефона, что позволит запустить процедуру настройки на Xiaomi заново.

Теперь запустите компас.

Программа запросит различные разрешения, дайте их ей. После чего вы увидите окно и инструкцию о том, как правильно провести калибровку. Следуйте инструкции на экране.
Разрешение для приложения Компас на Xiaomi

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

Процедура калибровки компаса на Xiaomi

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

Если вы всё сделали правильно, настройка закончится успешно и гироскоп вновь начнёт давать верные данные.

Калибровка сенсорных систем

Для обеспечения заявленной работоспособности, разработчик заложил в стандартный перечень обслуживания дрона обязательную калибровку сенсорных систем. Далее подробно:

Калибровка гироскопа

Калибровка гироскопа заблаговременно проведена разработчиком на этапе проверки работоспособности продукта и соответственно не требует дополнительного проведения. Однако, если в процессе эксплуатации пилотирование дроном становится не комфортным, например его постоянно тянет в одну из сторон или наблюдается отсутствие былой стабильности, как правило это случается после краша/аварии/жёсткой посадки, то вполне возможно исправить такое поведение сможет процедура калибровки гироскопа. Для этого проделайте следующие шаги:

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

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

Геомагнитная калибровка

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

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

Горизонтальная

LED подсветка на передних и задних лучах попеременно мигает жёлтым цветом, что указывает на вход в режим горизонтальной калибровки. Возьмите дрон в руки и расположите его так, как показано на изображении ниже и начните вращать в горизонтальном положении вокруг своей оси, до тех пор, пока LED подсветка на лучах не начнёт попеременно мигать зелёным цветом (как правило достаточно 3 оборотов). Горизонтальная геомагнитная калибровка завершена.

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

Вертикальная

Следом после успешной горизонтальной калибровки, расположите дрон так, как показано на изображении ниже и продолжите вращать его вокруг свой оси до тех пор, пока LED подсветка не перейдёт из мигающего режима в режим стабильного свечения (как правило достаточно 3 оборотов). Вертикальная геомагнитная калибровка завершена.

Problem with gyro calibration on arm (2.5.4) · Issue #301 · betaflight/betaflight · GitHub

Метод калибровки гироскопа из инженерного меню xiaomi

https://www.youtube.com/watch?v=M2d-qFlX0UQ

Этот способ работает не всегда и не на всех моделях смартфонов Xiaomi или Redmi, я лишь приведу его, как один из вариантов, попробуйте, возможно, у вас получится.

Откройте общие настройки телефона, найдите пункт «О телефоне».
Меню О Телефоне на Xiaomi

Если вы не видите строки

«Версия ядра»

, нажмите на кнопку

«Все параметры»Версия ядра в настройках Xiaomi

Теперь вы точно должны видеть

«Версия ядра»

, нажмите на неё 8 раз подряд, чтобы попасть в инженерное меню.

В списке найдите «Gyroscope».
Настройки гироскопа в инженерном меню на Xiaomi

Положите смартфон на твёрдую горизонтальную поверхность. Показатели по осям X, Y, Z должны быть равны

«0»

. Если это так, то гироскоп работает верно, т.к. он правильно определил положение телефона в пространстве.

Правильные данные работы гироскопа на Xiaomi

Если же цифры отличаются от

«0»

, значит, требуется калибровка. Тут же должны быть кнопка

«Calibrate»

. Но в моём случае, как вы видите на скриншоте, её нет, потому что гироскоп работает верно.

Работа с arduino и mpu6050 | alexgyver

Для достижения максимальной точности измерений нужно откалибровать акселерометр и гироскоп. Калибровка акселерометра позволяет выставить “ноль” для вектора силы тяжести, а калибровка гироскопа уменьшает его “дрифт”, то есть статическое отклонение в режиме покоя. Идеально откалиброванный и лежащий горизонтально датчик должен показывать ускорение ~16384 по оси Z и нули по всем остальным осям ускорения и угловой скорости. Но это фантастика =)
Максимально правильно использовать калибровку в проекте нужно так: калибровка по запросу (кнопка, меню, и т.д.), затем запись калибровочных значений в EEPROM. При запуске – чтение и настройка оффсетов. Да, можно замерить значения по всем 6 осям в покое, сохранить их в переменные, а затем вычитать из свежих прочитанных в процессе работы. Такой способ работает для каких-то базовых операций с датчиком (определение перегрузок, тряски, наличия вращения, и т.д.). Для использования MPU6050 с целью максимально точного определения углов поворота платы такой вариант к сожалению не подходит: калибровать нужно

рекурсивно

.
Рассмотрим несколько примеров калибровки, первый – из библиотеки. Калибрует долго, но максимально точно. 

При малых вибрациях и движениях датчика в процессе калибровки (даже от громкого звука) калибровка может не закончиться

. Второй вариант – мой упрощённый алгоритм калибровки, калибрует быстро, без возможности зависнуть при тряске, но даёт менее точный результат. Я делюсь примерами, в свой проект их нужно будет переносить вручную и аккуратно =)

Калибровка из примера библиотеки

// положи датчик горизонтально, надписями вверх
// ДАЖЕ НЕ ДЫШИ НА НЕГО
// отправь любой символ в сериал, чтобы начать калибровку
// жди результатов
// --------------------- НАСТРОЙКИ ----------------------
const int buffersize = 70; // количество итераций калибровки
const int acel_deadzone = 10; // точность калибровки акселерометра (по умолчанию 8)
const int gyro_deadzone = 6; // точность калибровки гироскопа (по умолчанию 2)
// --------------------- НАСТРОЙКИ ----------------------
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"
MPU6050 mpu(0x68);
int16_t ax, ay, az, gx, gy, gz;
int mean_ax, mean_ay, mean_az, mean_gx, mean_gy, mean_gz, state = 0;
int ax_offset, ay_offset, az_offset, gx_offset, gy_offset, gz_offset;
/////////////////////////////////// SETUP ////////////////////////////////////
void setup() { Wire.begin(); Serial.begin(9600); mpu.initialize(); // ждём очистки сериал while (Serial.available() && Serial.read()); // чистим while (!Serial.available()) { Serial.println(F("Send any character to start sketch.n")); delay(1500); } while (Serial.available() && Serial.read()); // чистим ещё на всякий Serial.println("nMPU6050 Calibration Sketch"); delay(2000); Serial.println("nYour MPU6050 should be placed in horizontal position, with package letters facing up"); delay(3000); // проверка соединения Serial.println(mpu.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed"); delay(1000); // сбросить оффсеты mpu.setXAccelOffset(0); mpu.setYAccelOffset(0); mpu.setZAccelOffset(0); mpu.setXGyroOffset(0); mpu.setYGyroOffset(0); mpu.setZGyroOffset(0);
}
/////////////////////////////////// LOOP ////////////////////////////////////
void loop() { if (state == 0) { Serial.println("nReading sensors for first time..."); meansensors(); state ; delay(1000); } if (state == 1) { Serial.println("nCalculating offsets..."); calibration(); state ; delay(1000); } if (state == 2) { meansensors(); Serial.println("nFINISHED!"); Serial.print("nSensor readings with offsets:t"); Serial.print(mean_ax); Serial.print("t"); Serial.print(mean_ay); Serial.print("t"); Serial.print(mean_az); Serial.print("t"); Serial.print(mean_gx); Serial.print("t"); Serial.print(mean_gy); Serial.print("t"); Serial.println(mean_gz); Serial.print("Your offsets:t"); Serial.print(ax_offset); Serial.print(", "); Serial.print(ay_offset); Serial.print(", "); Serial.print(az_offset); Serial.print(", "); Serial.print(gx_offset); Serial.print(", "); Serial.print(gy_offset); Serial.print(", "); Serial.println(gz_offset); Serial.println("nData is printed as: acelX acelY acelZ giroX giroY giroZ"); Serial.println("Check that your sensor readings are close to 0 0 16384 0 0 0"); Serial.println("If calibration was succesful write down your offsets so you can set them in your projects using something similar to mpu.setXAccelOffset(youroffset)"); while (1); }
}
/////////////////////////////////// FUNCTIONS ////////////////////////////////////
void meansensors() { long i = 0, buff_ax = 0, buff_ay = 0, buff_az = 0, buff_gx = 0, buff_gy = 0, buff_gz = 0; while (i < (buffersize 101)) { // read raw accel/gyro measurements from device mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); if (i > 100 && i <= (buffersize 100)) { //First 100 measures are discarded buff_ax = buff_ax ax; buff_ay = buff_ay ay; buff_az = buff_az az; buff_gx = buff_gx gx; buff_gy = buff_gy gy; buff_gz = buff_gz gz; } if (i == (buffersize 100)) { mean_ax = buff_ax / buffersize; mean_ay = buff_ay / buffersize; mean_az = buff_az / buffersize; mean_gx = buff_gx / buffersize; mean_gy = buff_gy / buffersize; mean_gz = buff_gz / buffersize; } i ; delay(2); }
}
void calibration() { ax_offset = -mean_ax / 8; ay_offset = -mean_ay / 8; az_offset = (16384 - mean_az) / 8; gx_offset = -mean_gx / 4; gy_offset = -mean_gy / 4; gz_offset = -mean_gz / 4; while (1) { int ready = 0; mpu.setXAccelOffset(ax_offset); mpu.setYAccelOffset(ay_offset); mpu.setZAccelOffset(az_offset); mpu.setXGyroOffset(gx_offset); mpu.setYGyroOffset(gy_offset); mpu.setZGyroOffset(gz_offset); meansensors(); Serial.println("..."); if (abs(mean_ax) <= acel_deadzone) ready ; else ax_offset = ax_offset - mean_ax / acel_deadzone; if (abs(mean_ay) <= acel_deadzone) ready ; else ay_offset = ay_offset - mean_ay / acel_deadzone; if (abs(16384 - mean_az) <= acel_deadzone) ready ; else az_offset = az_offset (16384 - mean_az) / acel_deadzone; if (abs(mean_gx) <= gyro_deadzone) ready ; else gx_offset = gx_offset - mean_gx / (gyro_deadzone 1); if (abs(mean_gy) <= gyro_deadzone) ready ; else gy_offset = gy_offset - mean_gy / (gyro_deadzone 1); if (abs(mean_gz) <= gyro_deadzone) ready ; else gz_offset = gz_offset - mean_gz / (gyro_deadzone 1); if (ready == 6) break; }
}

Мой вариант калибровки

#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
#define BUFFER_SIZE 100
int16_t ax, ay, az;
int16_t gx, gy, gz;
void setup() { Wire.begin(); Serial.begin(9600); mpu.initialize(); mpu.setXAccelOffset(0); mpu.setYAccelOffset(0); mpu.setZAccelOffset(0); mpu.setXGyroOffset(0); mpu.setYGyroOffset(0); mpu.setZGyroOffset(0); Serial.println(F("Send any character to start sketch")); delay(100); while (1) { //входим в бесконечный цикл if (Serial.available() > 0) { //если нажата любая кнопка Serial.read(); //прочитать (чтобы не висел в буфере) break; //выйти из цикла } } delay(1000);
}
void loop() { // выводим начальные значения mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); Serial.print(ax); Serial.print(" "); Serial.print(ay); Serial.print(" "); Serial.print(az); Serial.print(" "); Serial.print(gx); Serial.print(" "); Serial.print(gy); Serial.print(" "); Serial.println(gz); calibration(); // выводим значения после калибровки mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); Serial.print(ax); Serial.print(" "); Serial.print(ay); Serial.print(" "); Serial.print(az); Serial.print(" "); Serial.print(gx); Serial.print(" "); Serial.print(gy); Serial.print(" "); Serial.println(gz); delay(20); while (1);
}
// ======= ФУНКЦИЯ КАЛИБРОВКИ =======
void calibration() { long offsets[6]; long offsetsOld[6]; int16_t mpuGet[6]; // используем стандартную точность mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2); mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_250); // обнуляем оффсеты mpu.setXAccelOffset(0); mpu.setYAccelOffset(0); mpu.setZAccelOffset(0); mpu.setXGyroOffset(0); mpu.setYGyroOffset(0); mpu.setZGyroOffset(0); delay(10); Serial.println("Calibration start. It will take about 5 seconds"); for (byte n = 0; n < 10; n ) { // 10 итераций калибровки for (byte j = 0; j < 6; j ) { // обнуляем калибровочный массив offsets[j] = 0; } for (byte i = 0; i < 100 BUFFER_SIZE; i ) { // делаем BUFFER_SIZE измерений для усреднения mpu.getMotion6(&mpuGet[0], &mpuGet[1], &mpuGet[2], &mpuGet[3], &mpuGet[4], &mpuGet[5]); if (i >= 99) { // пропускаем первые 99 измерений for (byte j = 0; j < 6; j ) { offsets[j] = (long)mpuGet[j]; // записываем в калибровочный массив } } } for (byte i = 0; i < 6; i ) { offsets[i] = offsetsOld[i] - ((long)offsets[i] / BUFFER_SIZE); // учитываем предыдущую калибровку if (i == 2) offsets[i] = 16384; // если ось Z, калибруем в 16384 offsetsOld[i] = offsets[i]; } // ставим новые оффсеты mpu.setXAccelOffset(offsets[0] / 8); mpu.setYAccelOffset(offsets[1] / 8); mpu.setZAccelOffset(offsets[2] / 8); mpu.setXGyroOffset(offsets[3] / 4); mpu.setYGyroOffset(offsets[4] / 4); mpu.setZGyroOffset(offsets[5] / 4); delay(2); } /* // выводим в порт Serial.println("Calibration end. Your offsets:"); Serial.println("accX accY accZ gyrX gyrY gyrZ"); Serial.print(mpu.getXAccelOffset()); Serial.print(", "); Serial.print(mpu.getYAccelOffset()); Serial.print(", "); Serial.print(mpu.getZAccelOffset()); Serial.print(", "); Serial.print(mpu.getXGyroOffset()); Serial.print(", "); Serial.print(mpu.getYGyroOffset()); Serial.print(", "); Serial.print(mpu.getZGyroOffset()); Serial.println(" "); Serial.println(" "); */
}

Мой вариант калибровки запись в EEPROM

// калибровка и запись в EEPROM
// при запуске настраиваем оффсеты
// послать символ в сериал - начать повторную калибровку
#include "Wire.h"
#include "I2Cdev.h"
#include "MPU6050.h"
MPU6050 mpu;
#define BUFFER_SIZE 100
#define START_BYTE 1010
int16_t ax, ay, az;
int16_t gx, gy, gz;
void setup() { Wire.begin(); Serial.begin(9600); mpu.initialize(); //----------------- ВСПОМИНАЕМ ОФФСЕТЫ ------------------------ int offsets[6]; EEPROM.get(START_BYTE, offsets); // ставим оффсеты из памяти mpu.setXAccelOffset(offsets[0]); mpu.setYAccelOffset(offsets[1]); mpu.setZAccelOffset(offsets[2]); mpu.setXGyroOffset(offsets[3]); mpu.setYGyroOffset(offsets[4]); mpu.setZGyroOffset(offsets[5]); //----------------- ВСПОМИНАЕМ ОФФСЕТЫ ------------------------ Serial.println(F("Send any character to start sketch")); delay(100); while (1) { //входим в бесконечный цикл if (Serial.available() > 0) { // если нажата любая кнопка Serial.read(); // прочитать (чтобы не висел в буфере) break; // выйти из цикла } } delay(1000);
}
void loop() { calibration(); Serial.println("Current offsets:"); Serial.println("accX accY accZ gyrX gyrY gyrZ"); Serial.print(mpu.getXAccelOffset()); Serial.print(", "); Serial.print(mpu.getYAccelOffset()); Serial.print(", "); Serial.print(mpu.getZAccelOffset()); Serial.print(", "); Serial.print(mpu.getXGyroOffset()); Serial.print(", "); Serial.print(mpu.getYGyroOffset()); Serial.print(", "); Serial.print(mpu.getZGyroOffset()); Serial.println(" "); Serial.println(" "); // выводим значения после калибровки Serial.println("Readings:"); mpu.getMotion6(&ax, &ay, &az, &gx, &gy, &gz); Serial.print(ax); Serial.print(" "); Serial.print(ay); Serial.print(" "); Serial.print(az); Serial.print(" "); Serial.print(gx); Serial.print(" "); Serial.print(gy); Serial.print(" "); Serial.println(gz); delay(20); while (1);
}
// ======= ФУНКЦИЯ КАЛИБРОВКИ И ЗАПИСИ В ЕЕПРОМ =======
void calibration() { long offsets[6]; long offsetsOld[6]; int16_t mpuGet[6]; // используем стандартную точность mpu.setFullScaleAccelRange(MPU6050_ACCEL_FS_2); mpu.setFullScaleGyroRange(MPU6050_GYRO_FS_250); // обнуляем оффсеты mpu.setXAccelOffset(0); mpu.setYAccelOffset(0); mpu.setZAccelOffset(0); mpu.setXGyroOffset(0); mpu.setYGyroOffset(0); mpu.setZGyroOffset(0); delay(5); for (byte n = 0; n < 10; n ) { // 10 итераций калибровки for (byte j = 0; j < 6; j ) { // обнуляем калибровочный массив offsets[j] = 0; } for (byte i = 0; i < 100 BUFFER_SIZE; i ) { // делаем BUFFER_SIZE измерений для усреднения mpu.getMotion6(&mpuGet[0], &mpuGet[1], &mpuGet[2], &mpuGet[3], &mpuGet[4], &mpuGet[5]); if (i >= 99) { // пропускаем первые 99 измерений for (byte j = 0; j < 6; j ) { offsets[j] = (long)mpuGet[j]; // записываем в калибровочный массив } } } for (byte i = 0; i < 6; i ) { offsets[i] = offsetsOld[i] - ((long)offsets[i] / BUFFER_SIZE); // учитываем предыдущую калибровку if (i == 2) offsets[i] = 16384; // если ось Z, калибруем в 16384 offsetsOld[i] = offsets[i]; } // ставим новые оффсеты mpu.setXAccelOffset(offsets[0] / 8); mpu.setYAccelOffset(offsets[1] / 8); mpu.setZAccelOffset(offsets[2] / 8); mpu.setXGyroOffset(offsets[3] / 4); mpu.setYGyroOffset(offsets[4] / 4); mpu.setZGyroOffset(offsets[5] / 4); delay(2); } // пересчитываем для хранения for (byte i = 0; i < 6; i ) { if (i < 3) offsets[i] /= 8; else offsets[i] /= 4; } // запись в память EEPROM.put(START_BYTE, offsets);
}

Также в библиотеке есть готовые функции для калибровки акселя и гиро, они принимают количество итераций калибровки (до 15):

mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6);

Функции блокирующие, выполняются и автоматически выставляют оффсеты, т.е. датчик сразу калибруется. Для чтения оффсетов (например для записи в EEPROM) можно воспользоваться тем же способом, что и раньше:

mpu.getXAccelOffset();
mpu.getYAccelOffset();
mpu.getZAccelOffset();
mpu.getXGyroOffset();
mpu.getYGyroOffset();
mpu.getZGyroOffset();

Способ первый

Чтобы откалибровать квадрокоптер перед первым запуском, нужно перевести оба стика пульта управления в нижнее положение, а затем влево до упора. Когда прозвучит длинный звуковой сигнал, а светодиодная подсветка на дроне перестанет мелко моргать, дрон откалиброван и готов к запуску.

Это важно:

  • чтобы режим «Headless mode» правильно сработал, перед его включением убедитесь, что пульт дистанционного управления находится точно сзади беспилотника.

Если после калибровки датчиков, квадрокоптер все-таки тянет в сторону, для его качественной стабилизации нужно произвести триммирование (точную настройку). 

Для этого используем триммеры снизу и слева от правого стика на пульте ДУ.

Если квадрик уводит влево, кликните несколько раз на кнопку триммера «вправо». Если замечаете крен вправо, то нажмите на триммере «влево» несколько раз. По аналогии настройте полет дрона вперед/назад.

В идеале, при запуске двигателей дрон должен подниматься в воздух и удерживать положение «без заносов». Добиться этого можно только в закрытом помещении или в абсолютно безветренную погоду.

Опытные пилоты производят триммирование в полете (нужно поднять дрон на высоту не менее 0,5 метра). Как начинающий летчик, можете пробовать настроить коптер на земле. То есть взлететь, увидеть в какую сторону заносит дрон, приземлиться, сделать несколько кликов на нужную кнопку триммера, а затем снова подняться в воздух, чтобы ощутить разницу. И так до тех пор, пока квадрокоптер не зависнет идеально в воздухе.

Медленно, но уверенно. 

Как правильно откалибровать квадрокоптер

Если не получается…

Если точная настройка квадрокоптера (триммирование) не дает нужного эффекта, возможно дело не в гироскопах. Может случиться, что двигатели расположены не симметрично или повреждены лопасти. Еще одна возможная причина – какому-то из моторчиков не хватает тяги, чтобы ровно поднять дрон в воздух. В этом случае не обойтись без опытного помощника или даже мастера.

Как пожелание…

Не спешите выжать из нового квадрика все соки в первый же день полетов!

Помните, что первые запуски, это для него всего лишь тестирование и проверка работоспособности, а для вас – проверка на выдержку.

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

Внутренняя система позиционирования дрона основана на работе гироскопа. В зависимости от показаний датчика, электроника автоматически регулирует обороты двигателей машины для поддержки стабильного положения. Система тестируется и запоминает настройки автоматически. Чтобы калибровать квадрокоптер, обычно достаточно:

  • поставить устройство на ровную поверхность;
  • включить питание или подсоединить аккумулятор;
  • дождаться окончания тестирования.

Об окончании калибровки свидетельствует звуковой сигнал или световая индикация. Как делается настройка квадрокоптера, подробно изложено в инструкции по эксплуатации модели. У некоторых дронов процедура может быть сложнее. Например, чтобы откалибровать квадрокоптер, его нужно не только установить на ровную поверхность, но и покрутить в определенном положении по и против часовой стрелки.

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

  • при смещении вперед или назад, нажимается триммер сбоку от левого джойстика вверх или вниз;
  • при вращении в какую-либо сторону недостаток устраняется триммером под левым джойстиком;
  • смещения вперед-назад регулируются триммером сбоку от правого джойстика;
  • уход влево-вправо компенсируется триммером под правым джойстиком.

Регулировка производится до тех пор, пока недостатки не будут устранены. Данная операция никак не влияет на работу дрона, делается калибровка только пульта.

Второй способ подходит для владельцев моделей без триммеров на пульте управления.

Совет! Пользоваться таким вариантом калибровки стоит только в тех случаях, когда машину тянет в сторону или ведет по направлению очень незначительно.

Чтобы компенсировать недостатки, потребуется настроить квадрокоптер. Операция эта долгая и кропотливая: следует подкручивать регуляторы двигателей для компенсации. После каждой попытки дрон поднимается в воздух для проверки правильности поведения.

Для дронов, у которых нет триммеров пульта, и присутствуют сильно выраженные отклонения, предусматривается процедура автоматической калибровки. Она подробно изложена в инструкции по эксплуатации.

Для того чтобы все прошло успешно и с первой попытки, рекомендуется как можно тщательнее выполнить начальную калибровку гироскопа дрона. Устройство устанавливается на ровную поверхность, включается, проходит предусмотренную производителем процедуру. Только после этого делается калибровка пульта.

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

  • включается пульт;
  • левый джойстик устанавливается на максимум вверх;
  • подключается питание дрона;
  • электроника квадрокоптера сигнализирует готовность к базовой калибровке миганием светодиодов;
  • отключается и снова включается питание дрона;
  • после стандартного сигнала о состоянии батареи дрок издает короткий писк, что свидетельствует записи настройки максимальной тяги;
  • левый джойстик опускается вниз до упора.

После того, как дрон издаст долгий сигнал — можно проверить работу двигателей. Затем газ убирают до минимума и отключают питание квадрокоптера для завершения начальной калибровки и установки параметрики по тяге. Дальнейшие тонкие регулировки производятся при помощи программного пакета mission planer.

Наша компания предлагает услугу по настройке многовинтовых летательных аппаратов любого назначения. В зависимости от сферы использования, наши специалисты выполнят настройку квадрокоптера таким образом, чтобы он был максимально отзывчивым и удобным для решения поставленных задач. Обычно услуга включает:

  • Настройку электроники и аппаратуры управления;
  • Настройку компаса, акселерометра и других датчиков;
  • Настройку регуляторов скорости двигателей;
  • Регулировку отзывчивости джойстиков (пульта управления);
  • Прошивку или перепрошивку аппарата (в случае необходимости).

Правильно выполненная настройка квадрокоптера делает его максимально управляемым в любом режиме полета.

Итак, ваш новый квадрокоптер уже перед вами, но вы пока не умеете его запускать. С чего начать?

  1. Первым делом нужно собрать дрон. Почти все они поставляются в частично разобранном виде, поэтому навыки сборки конструктора вам очень пригодятся.
  2. Припасите запасной аккумулятор. Современные модели редко могут протянуть в воздухе больше 10 минут. А для полноценной тренировки этого времени не достаточно.
  3. Обязательно прикупите несколько запасных частей. Аварии неизбежны, а особенно часто ломаются именно пропеллеры.
  4. Далее следует откалибровать и настроить датчики: акселерометр, компас и GPS.

Остается только бегло просмотреть прилагаемую инструкцию и можно попробовать поднять в воздух свой первый аппарат.

Оцените статью
Радиокоптер.ру
Добавить комментарий