ArduCopter Mega: порт на обычную Arduino (тестим)
Еще идея прорезалась, снимать показания с сонара только при нулевом левеле, ± сколько нибудь, чтобы совсем уж не перестал работать.
Так нельзя делать! во всяком случае, пока у вас включен автопилот (ALT_Hold). Т.к. если в какой то момент не снимать показания с сонара, то откуда брать высоту? На барометр нельзя резко переходить, т.к. может оказаться, что коптер висит в 15 см от земли, а баро скажет что 50см… и автопилот благополучно воткнет его в землю.
Если что то и делать, так это ограничивать угол наклона коптера при работе с сонаром. Т.е. на малой высоте не давать наклонять коптер больше 15гр. (Но при этом, возможна ситуация, когда вы не сможете удерживать коптер на одном месте (при сильном ветре))
Брать предыдущее показание. Все равно высота не меняется резко. Обновлять при переходе через ноль
снимать показания с сонара только при нулевом левеле, ± сколько нибудь, чтобы совсем уж не перестал работать.
Смотрите место в ArdupirateMega.pde, где вычисляется высота. Там кусок кода закомментирован, который корректирует высоту по cos\sin наклонов. Переменные наклонов можете использовать для своих целей, их можно вывести в Serial и понаблюдать, какие у них значения. if (sonar_alt < 600) and ( (round(x)>30 degree) OR (round(y) > 30 degree) ) {alt = 0.5*baro_alt + 0.5*sonar_alt; //при сильном наклоне подмешиваем баро_высоту, потому что сонар отваливается }- на словах. Только баро дрейфует на 50 см!
Сейчас в коде на сверхмалой высоте коэффициент_баро -> 0, если пропадает и sonar_alt, то морковка.
Не совсем то. Не учитываются показания сонара вообще при крене. Нужно учитывать постоянно, но обновлять переменную с сонара только вблизи левел = 0
Явно ложные показания будут игнорироваться.
Не совсем то. Не учитываются показания сонара вообще при крене. Нужно учитывать постоянно, но обновлять переменную с сонара только вблизи левел = 0 Ответить с цитированием Ответить с цитированием Поблагодарить автора Спасибо! Кинуть помидором
А надо ли вообще учитывать крен? Там высота будет незначительно изменятся (мне кажется). А вот не учитывать текущую высоту нельзя - т.к. если вы например летите куда то, естественно коптер будет наклонен - а высота то старая будет все время - в итоге краш.
при крене
Только проблема, что при крене коптер теряет высоту, поэтому будет точно не 1 метр. А на сильном крене он сваливается.
Предлагаю при сильном крене и отваливающемся сонаре “подмешивать” baro_alt. Как только уровень выровняется, влияние баро_альт сильно ослабить, и использовать сонар_альт на 98%
level>=30: alt = 0.8* alt_предыдущая + 0.2*baro_alt
level<30: alt = 0.98* sonar_alt + 0.02*baro_alt
Борис, именно так забудьте метры, граммы, паскали, считайте в “штуках”.
Все, что можно в константы, все, что считаеттся 1 раз в статические переменные.
level>=30: alt = 0.8* alt_предыдущая + 0.2*baro_alt
0.2* baro_alt будет считаться до скончания веков, запись (baro_alt>>2) эквивалентна 0.25 *baro_alt, а работает 2 такта.
я бы сделал так:
alt = (alt_предыдущая>>1)+(alt_предыдущая>>2)+(baro_alt>>2); //alt = 0.75* alt_предыдущая + 0.25*baro_alt
Только проблема, что при крене коптер теряет высоту, поэтому будет точно не 1 метр. А на сильном крене он сваливается.
Предлагаю при сильном крене и отваливающемся сонаре “подмешивать” baro_alt. Как только уровень выровняется, влияние баро_альт сильно ослабить, и использовать сонар_альт на 98%
level>=30: alt = 0.8* alt_предыдущая + 0.2*baro_alt level<30: alt = 0.98* sonar_alt + 0.02*baro_alt
Кто же будет заниматься высшим пилотажем у земли то? Речь ведь идет о висении на сверхнизких высотах. При болтанке скольжение минимальное, стики по нулям. А про высоты, где сонар не работает вообще другой разговор. В идеале вообще нужно автоматическую посадку вводить. Что бы сам садился в точке взлета, а не болтался над точкой. Подразумевается, что сигнал управления потерян и кренов со скольжением вообще быть не должно.
Можно умножать коэффициенты типа (0.000019876) на 100 000 000 и хранить как int32_t. Только немного повозиться с библиотекой.
Собственно 100 000 000 и будет масштабом в данном случае. Можно так и работать. Если хочется выжать из int32 все, до последнего бита, то масштаб придется в виде степени двойки вычислять, исходя из максимального (разумного) значения величины.
Alex_from_Israel, давно пора эхолот привязывать к коптеру. 😃 И слежение за рыбой реализовать.
кстати, как мегапират будет вести себя если сигнал от пульта ДУ заглушить? Просто рухнет на землю?
Отчед: Начал портировать 2.0.43
Alex_from_Israel, давно пора эхолот привязывать к коптеру. 😃 И слежение за рыбой реализовать.
кстати, как мегапират будет вести себя если сигнал от пульта ДУ заглушить? Просто рухнет на землю?
Вроде файлсейв есть… По идее должен плавно снизить обороты мотором и приземлиться более-менее плавно. Хотя, кто его знает? Я еще и не летал то, как следует. Усе упереди, Козлодоев!
Не, за рыбой не хочу! Я рыбу уважаю с пивом, но не прямо из моря! Проще прикупить в магазине, благо выбор есть. От тараньки до деликатесной семги. А прям из моря тоже можно. На Марине (это у нас так яхт клубы называют) есть ресторанчик в котором рыбу жарят через полчаса после отлова. Рыбаки прямо с катера своего в ресторанчик этот отгружают. Будете в наших краях, обязательно посетите! Классно жарят! Лучше только в Эйлате, в ресторане рыбном. Название странное, что то вроде последний толи причал, толи приют. Не помню точно. Сети и штурвалы по стенам и чудная запеченная в сметане рыбка!
Сильные отличия от 40 в коде?
кстати, как мегапират будет вести себя если сигнал от пульта ДУ заглушить? Просто рухнет на землю?
Тестировал, держа дрона в руке, главное файл сейв чтоб дернул канал и включил РТЛ 😃 При удержании высоты, лойт и РТЛ даже если газ в ноль движки продолжают работать, так что в теории если РТЛ работает нормально, квадрик долетит до места взлета 😃
Измерил время цикла delta_ms_fast_loop = 6…12 мс.
Но, все-равно, я разочаровался в ВМР085. Даже с float математикой он медленно дрейфует на 50 см.
Кому интересно: wmrx00.sourceforge.net/Arduino/BMP085-Calcs.pdf
И архив с библиотекой: narod.ru/disk/25791982001/APM_BMP085.rar.html
Попробую с int_32t и масштабированием давления. Но хочу заказать MS5611-01 MS5611 Barometric Pressure Sensor Variometer.
Что-то не удается Tes8 скомпилировать. Удалил либы по фен-шую, скопировал те, что в архиве, а он мне:
ArduCopterMega.cpp:59:39: error: Wire.h: No such file or directory
Пробовал родную Wire подкидывать - начинают другие зависимости вылезать.
Сегодня выехал в поле с ноутбуком. Отлетал два пака. Настромл алт-холд. Без ветра и руления держит вусоту + - 50 см. Лучше настроить не смог. Летал на высоте 5-6 м, те без сонара. Если начинал рулить коптер уходил в раскачку. при остановке прыгал раза два и дальше висел почти ровно. Еще раз испытал ртл. Домой возвращает, но возвращает не передом, а той стороной которая к дому ближе, те коптер носом к дому не разворачивает. Полетал в лойтере. В этом режиме коптер, оказывается, рулится. Подлетел куда надо, повисел, подлетел дальше. Но колбасит его в этом режиме в диаметре метров пяти. Но самый стабильный режим это стабиле. Коптер стоит как вкопаный. Из любого режима при колбасне включаешь стабиле и коптер тут же останавливается
Пробовал родную Wire подкидывать
У меня скомпилилась с родной
У меня скомпилилась с родной
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:28:24: error: …/SPI/SPI.h: No such file or directory
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp: In member function ‘virtual bool AP_OpticalFlow_ADNS3080::init(bool)’:
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:69: error: ‘SPI’ was not declared in this scope
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp: In member function ‘byte AP_OpticalFlow_ADNS3080::backup_spi_settings()’:
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:93: error: ‘SPI’ was not declared in this scope
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:94: error: ‘SPI_MODE3’ was not declared in this scope
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:95: error: ‘SPI_CLOCK_DIV8’ was not declared in this scope
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp: In member function ‘virtual byte AP_OpticalFlow_ADNS3080::read_register(byte)’:
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:133: error: ‘SPI’ was not declared in this scope
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp: In member function ‘virtual void AP_OpticalFlow_ADNS3080::write_register(byte, byte)’:
C:\arduino-0022\libraries\AP_OpticalFlow\AP_OpticalFlow_ADNS3080.cpp:161: error: ‘SPI’ was not declared in this scope
Вот что с родной Wire
Если подкинуть еще и SPI, то получаем новую кучу сообщений.
Что-то не удается Tes8 скомпилировать
Аржуино IDE 022 и выше? Я установил ее, залил в папку либы из архива, и все компилируется.
Без ветра и руления держит высоту + - 50 см. Лучше настроить не смог.
Из ВМР085 больше не выжать…
Лучше всего держать архив с 022. Чистый
Я тоже держу “чистые” library в отдельном месте и заливаю их перед новой версией Пирата.
Что-то не удается Tes8 скомпилировать. Удалил либы по фен-шую, скопировал те, что в архиве, а он мне:
Пробовал родную Wire подкидывать - начинают другие зависимости вылезать.
Лучше всего держать архив с 022. Чистый. Новую прошивку без проблем компильнуть можно, если свеженькую 022 распаковать. Не с заменой старой, а со стиранием. Скопируйте ВНУТРЬ библиотеки 022 библиотечные файлы. Заменятся только нужные. При такой технологии любая новая прошивка компилируется без проблем.
но возвращает не передом, а той стороной которая к дому ближе, те коптер носом к дому не разворачивает.
пофигу как возрвщается =) главное что возвращается вообще
А новый алгоритм для баро кто нить вклячит в прошивку 😃? Для меня 50см было бы мега супер, сейчас плавает метра 2…
пофигу как возрвщается =) главное что возвращается вообще
Гы, а по точкам интересно он то же жопой летать будет 😃))