ArduCopter Mega: порт на обычную Arduino (тестим)

Musgravehill
iBat:

Т.е. направление на север теряет. Кстати вспомнил: пока с голой платкой игрался - не вводил declination и offsets компаса. И оно как-то работало. Похоже на правду. А сейчас настроил и то и другое, и получил такую бяку

tusik:

Я ввожу только деклинейшин, офсет не делал.

В Планнере на вкладке HardWare есть изображение компаса с галкой в чекбоксе и значение деклинации. У меня оно 11,3 градуса. Но в таблице слева, где показаны все параметры, это значение деклинации преобразуется в 0,197 единиц. Компас показывает правильно. Поэтому не надо вписывать в таблицу “11,3” - компас с ума сойдет, эти градусы надо вводить справа рядом с картинкой компаса и ссылкой на сайт деклинации.

Я думаю, что оффсет вычисляется автоматически после “колбасни” коптера. Я делаю erase, выставляю все с нуля. Покручу плату во всех направлениях - компас стабильно показывает правильное направление.

Нашел интересные данные, как повысить точность ВМР085 до 1.5 дюйма (во что слабо верится). Вечером испытаю алгоритм, который использует калибровочные коэффициенты и текущую температуру датчика.
Давление в состоянии покоя до и после использования нового алгоритма. Неужели правда(?)

Alex_from_Israel

Почему то после установок в Хардвере, хотя данные и запоминаются в таблице (но теряются после перезагрузки, но далеко не всегда) на экране с авиагоризонтом не всегда изменения заметны. Как будто система учитывает только то, что вписано в КЛИ режиме.

И Левел после установки в КЛИ работает, вроде, но стоит в Хардвере нажать на Левел и авиагоризонт перекашивает. Вправо на 35-45 градусов.

Musgravehill
Alex_from_Israel:

Почему то после установок в Хардвере, хотя данные и запоминаются в таблице (но теряются после перезагрузки, но далеко не всегда) на экране с авиагоризонтом не всегда изменения заметны. Как будто система учитывает только то, что вписано в КЛИ режиме.

И Левел после установки в КЛИ работает, вроде, но стоит в Хардвере нажать на Левел и авиагоризонт перекашивает. Вправо на 35-45 градусов.

Тоже замечал такое! В hardware прописывал несколько раз и проверял на refresh. Левел тоже чудит иногда.

Ar2r

Товарищи, через APC220 вообще возможно пиды записывать во время работы коптера?

Мне он пишет ошибку Failed set ИМЯ_ПАРАМЕТРА
А я брал эту фиговину именно с расчетом, что можно будет настраивать не подключая по усб.

tusik
Ar2r:

он пишет ошибку

Попробуй в другой версии планера. И проверь пиды: у меня ругался, но пиды менял

Sir_Alex

Напоминаю, что для MegaPiratesNG 2.0.40 подходит планер версии 66 (не выше).

Musgravehill:

Нашел интересные данные, как повысить точность ВМР085 до 1.5 дюйма (во что слабо верится).

Точные данные получить наверное можно, только вот с какой задержкой, мы их получим?

Alex_from_Israel:

Почему то после установок в Хардвере, хотя данные и запоминаются в таблице (но теряются после перезагрузки, но далеко не всегда) на экране с авиагоризонтом не всегда изменения заметны. Как будто система учитывает только то, что вписано в КЛИ режиме.

Да, я то же заметил этот косячок в планере. Там совершенно неочевидно, когда деклинейшен записывается в коптер, кнопки “Сохранить” там нету. Возможно деклинейшн записывается, когда мы например PIDы меняем или еще при каких то действиях…

Я тут подумал, что наш дешевый сонар, можно применить разве что для автопосадки. При полетах на низкой высоте, велика вероятность оказаться в земле. Особенно в ветреною погоду. Т.к. при относительно небольшом наклоне коптера относительно земли, сонар перестает работать…
Либо как вариант, на низкой высоте, ограничивать максимальный угол наклона коптера…

Musgravehill
Ar2r:

Товарищи, через APC220 вообще возможно пиды записывать во время работы коптера?

Мне он пишет ошибку Failed set ИМЯ_ПАРАМЕТРА

Да, проверено много раз! И не только ПИД, но и Левел, деклинацию. Ругается, если в качестве разделителя ставить “,”, а не точку: 2.887

Sir_Alex:

Точные данные получить наверное можно, только вот с какой задержкой, мы их получим?

Используется не фильтрация, а калибровочные данные датчика, текущая температура и MSB, LSB и XLSB.
s = T − 25
x = x2*s^2 + x1*s + x0
y = y2*s^2 + y1*s + y0
z = pu − x \ y, где Pu - измеренное давление без корректировки
p2, p1, p0 - коэффициенты из мат.модели датчика.

P = p2*z^2 + p1*z + p0 = истинное давление.

Sir_Alex
Musgravehill:

Да, проверено много раз! И не только ПИД, но и Левел, деклинацию. Ругается, если в качестве разделителя ставить “,”, а не точку: 2.887

Не знаю, как именно планер передает значения, но если в текстовом виде, то тогда понятно откуда ноги растут. В зависимости от региональных настроек винды, числа могу вводится с точкой или запятой. А коптер понимает всегда только с точкой (или с запятой, надо проверить). Поэтому у некоторых людей, наблюдаются глюки с планером (если разделитель не совпадают).

Musgravehill:

Используется не фильтрация, а калибровочные данные датчика, текущая температура и MSB, LSB и XLSB. s = T − 25 x = x2*s^2 + x1*s + x0 y = y2*s^2 + y1*s + y0 z = pu − x \ y, где Pu - измеренное давление без корректировки p2, p1, p0 - коэффициенты из мат.модели датчика. P = p2*z^2 + p1*z + p0 = истинное давление.

если так, то почему сам датчик не вычисляет давление по этим калибровочным данным?

Musgravehill
Sir_Alex:

если так, то почему сам датчик не вычисляет давление по этим калибровочным данным?

не знаю точно. Сказано, что калибровочные данные уникальны для каждого датчика (в его EEPROM хранятся коэффициенты смещения, температурной компенсации…всего 176 бит). Он выплевывает калибровки, raw_ температуру и давление. Остальное - сам, ручками. Наверное, в датчике простая логика, которую не нагружают дополнительными вычислениями.

Кстати, желательно обращаться к датчику с частотой не более 40Гц, лучше 20Гц (50 мс). Если oss=3 (максимальное разрешение), то время обработки запроса 25.5 мс.

Нужно или выставить малое oss и самому фильтровать\усреднять, зато иметь частоту опроса до 128Гц. Или использовать высокое разрешение oss=3, но частота опроса падает.

Температура сенсора используется только для корректировки показаний (она влияет на сам сенсор, а не на давление), поэтому не играет роли, где стоит барометр. Еще, чтоб не забыть: “при делении на степени двойки путем сдвига вправо не мультиплицировал знаковый разряд, а просто посылал туда 0. Это приводило к тому, что отрицательные числа при делении на степени двойки становились положительными! Для положительных чисел все работает нормально. Спасибо, ошибка была вызвана скорее невнимательностью: не привел тип unsigned к signed до вычислений, оставив это компилятору (avr-gcc). И самое удивительное, что при комнатной температуре ошибка почти не проявляла себя.”

Sir_Alex
Musgravehill:

не знаю точно. Сказано, что калибровочные данные уникальны для каждого датчика (в его EEPROM хранятся коэффициенты смещения, температурной компенсации…всего 176 бит). Он выплевывает калибровки, raw_ температуру и давление. Остальное - сам, ручками. Наверное, в датчике простая логика, которую не нагружают дополнительными вычислениями.

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

Musgravehill:

Кстати, желательно обращаться к датчику с частотой не более 40Гц, лучше 20Гц (50 мс). Если oss=3 (максимальное разрешение), то время обработки запроса 25.5 мс.

Обновление барометра идет с частотой 10Hz - что вполне достаточно. OSS=3.

Кстати, можно еще подключить вывод готовности барометра к ардуине, тогда можно будет не ждать окончания измерения данных (В АрдуКоптере так и работает)

Musgravehill
Sir_Alex:

Кстати, можно еще подключить вывод готовности барометра к ардуине, тогда можно будет не ждать окончания измерения данных (В АрдуКоптере так и работает)

Нужно паять проводок. В нашей библиотеке прерывания по INT просто закомментированы.

Sir_Alex:

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

Да, списано 1-к-1. Но нет пауз 4.5мс между Write и Read. Я нашел работу от 25 апреля 2011, где автор предлагает использовать другую мат.модель. Вечером испытаю.

Sir_Alex:

Обновление барометра идет с частотой 10Hz

Алексей, как вы это узнали? И как можно получить время одного цикла работы Мегапирата? (чтобы вывести serial.print(cycle_time, DEC); )

Sir_Alex
Musgravehill:

В нашей библиотеке прерывания по INT просто закомментированы.

Не, там не прерывания. Просто проверяется состояние пина, если там 0, то пропускается текущая итерация, если 1, то считывается текущее значение и запускается следующее измерение.
Кроме того, для оптимизации, температура считывается 1 раз из 4х. Т.е. читается температура, потом 4 раза давление.

Musgravehill:

Алексей, как вы это узнали? И как можно получить время одного цикла работы Мегапирата? (чтобы вывести serial.print(cycle_time, DEC); )

Легко - в коде написано 😃 (см. функцию update_altitude в ArduCopterMega.pde)

Musgravehill
Sir_Alex:

Кроме того, для оптимизации, температура считывается 1 раз из 4х. Т.е. читается температура, потом 4 раза давление.

Еще интересные фильтры в read_pressure и read_temperature, которые сглаживают быстрый сдвиг raw_data. Пошагово тестировал их, пока не понял.

Еще казус был, что АрдуиноIDE показывает список файлов в проекте справа в виде вертикального списка. В нем нет прокрутки, и на экран 22" он не помещается. Я проморгал, что есть файлы ниже read***.pde и перерыл все папки в library. А потом обнаружил sensors.pde в проекте 😁

Sir_Alex
Musgravehill:

Еще интересные фильтры в read_pressure и read_temperature

Обычное усреднение показаний.

SovGVD

как я понял hardware in loop - типа когда всё отрабатывается, но без выхода на моторы чтоли, толи для симуляции, толи для дебага

Sir_Alex
SovGVD:

как я понял hardware in loop - типа когда всё отрабатывается, но без выхода на моторы чтоли, толи для симуляции, толи для дебага

Да, я уже нашел code.google.com/p/ardupilot-mega/wiki/Xplane

Кстати, как тебе новая стартовая страница Wiki?

SovGVD
Sir_Alex:

как тебе новая стартовая страница Wiki?

зашибись! =)

LeonVS
Musgravehill:

Да, проверено много раз! И не только ПИД, но и Левел, деклинацию. Ругается, если в качестве разделителя ставить “,”, а не точку

Если ставить ставить “,” поле вообще становится красным, мол параметр не верный… А “Failed set…” выдает и при верных параметрах, тут дело похоже в АРС220, при УСБ соединении такого нет, а при радио линке выскакивает часто, и чем дальше квадрик от тебя тем сложнее записать параметр, у меня обычно пишется раза с 3…

К стати проверял кто нить на 40 прошивке РТЛ? Сегодня пробовал, чтот ведет себя как в режиме лойт, не разворачивается и летит на базу как в 39 прошивке, а начинает пятится назад возвращаясь домой…

Musgravehill

Переписал код библиотеки ВМР085 под float - переменные, формулы используются другие, отличные от целочисленных как в даташите. В исходном варианте Press = 101300 кПа, и последний разряд мог прыгать, т.е. 1 кПа. Сейчас давление Press = 101300.568785 хватает с запасом.

Если без фильтров и с целочисленными переменными, то дисперсия = 1118, с целочисленными переменными и фильтрами D=533. С плавающей запятой и фильтрами D=127.

Высота прыгает ± 10, реже ± 20. Но надо допиливать код.

Ar2r
Musgravehill:

Переписал код библиотеки ВМР085 под float

в плане производительности это как скажется?