1. Уважаемый Гость! При написании вопросов в раздел форума [ArduCopter] Вопросы, проблемы и решения обязательно придерживаться шаблона сообщения, оговоренного в правилах раздела! Если сообщение не будет оформлено должным образом, то и ответ на вопрос будет с наименьшим приоритетом. Старайтесь дать максимально полную информацию по вашей проблеме, чтобы можно было более детально рассматривать вопрос!
    Скрыть объявление
  2. Уважаемый Гость! Хотите получить 200р за регистрацию? Хотите получать кэшбэк с покупок в online-магазинах? Сервис "LetyShops" дает такую возможность!
    Скрыть объявление
  3. Друзья! Для нашего ресурса необходим дополнительный объем пространства в облаке Dropbox. Подробнее.
    Скрыть объявление

Создание собственной прошивки: Ардукоптер на контроллере АПМ

Тема в разделе "Информация и полезные материалы по контроллеру", создана пользователем Alexey Kozin, 17 ноя 2015.

  1. Alexey Kozin

    Alexey Kozin APM Guru Команда форума

    Регистрация:
    26 янв 2015
    Сообщения:
    925
    Город:
    Москва
    Имя:
    Алексей Козин
    Поскольку 3Drobotics отказались от поддержки новых версий ардукоптера для контроллера АПМ - можно сказать что теперь на этом шикарном "железе", используя хорошие части оригинального кода и убирая откровенно лишний функционал можно подчистить, подправить и получить стабильную и функциональную прошивку. Зная особенности и сложные в настройке функциональные модули - исправить и переписать. В результате будет прошивка может быть и не столь напичканая возможностями как Pixhawk но стабильная и надежная.

    Собственно первый шаг я уже сделал, вырезав из прошивки бинарные протоколы навигационных модулей и оставив универсальный NMEA освободил 20кб флеша (и есть еще ряд идей как отжать местечко. если оно понадобится). Это не означает что не будут поддерживаться модули юблокс или сирф. Все навигационные модули умеют работать в протоколе NMEA, нужно их будет только переключить.

    Прежде всего объектом всех бед в версии 3.2 был признан INAV - инерциалка. ардукоптер весьма капризен к настройке компаса, если аппарат собран слегка криворуко и компас показывает с ошибкой градусов в 15 то вместо того чтобы идти к цели по дуге соответствующей этому углу ошибки коптер делает в небе скоростные петли известные как toilet bowl тоесть туалетные воронки. Совместно с моими коллегами по резульатам наблюдений за поведением коптеров сделали предположение, что причиной непредвиденного поведения в удержании позиции может быть инерциалка, поэтому первое то было сделано - возможность ее выключения. Но как показала практика при отключении инерциалки из за разброса точек получаемых от жпс в режиме удержания позиции наблюдаются рывки.

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


    Навигационный фильтр.
    Фильтр называется KPEMF , расшифровывается как Parallel Estimations Median Filter
    состоит фильтр из системы прогнозирования массива вариантов местоположения текущей точки - (составляющих массив данных широты и долготы) и обычного но великолепного медианного фильтра.

    медианный фильтр готовится из алгоритма сортировки
    пример сортировки пузырьковым методом
    http://www.tigoe.com/pcomp/code/arduinowiring/42/
    void bubbleSort() {
    int out, in, swapper;
    for(out=0 ; out < numReadings; out++) { // outer loop
    for(in=out; in<(numReadings-1); in++) { // inner loop
    if( analogValues[in] > analogValues[in+1] ) { // out of order?
    // swap them:
    swapper = analogValues[in];
    analogValues [in] = analogValues[in+1];
    analogValues[in+1] = swapper;
    }​
    } }
    }
    и процедуры извлечения значения элемента оказавшегося в середине.
    в случае нечетного числа элементов
    median = analogValues[numReadings / 2];
    или среднего арифметического серединных элементов если размер массива -четный.

    но для работы этого фильтра нужен массив "параллельных" данных. Данные должны не запаздывать. В противном случае - фильтр будет запаздывающим.

    Итак для приготовления параллельных данных нужен массив навигационных приемников. Штук 10 -15... мда.. это громоздко и дороговато...
    пойдем другим путем... Создадим ряд данных прогноза позиции на основе предыдущих данных.
    к примеру при наличии истории координат за последние несколько секунд и исходя из предположения что коптер в ходе движения имеет непрерывную кривую ускорений
    при этом исходя из точки достоверного прогноза, позиции полученной исходя из округления двух последних сэмплов рассчитываем скорость характерную для этих данных и переносим проекцию перемещения относительно средней точки от среднего двух сэмплов (среднее создает задержку и требует коррекцию на S= Vt) с учетом полученной скорости
    подобным образом вычисляются прогнозы исходя из 3,4,5,6 сэмплов
    таким образом мы получаем массив "параллельных" данных из 6 прогнозов и 1 актуального значения GPS.
    К этим данным применяется медианный фильтр,
    после чего полученная медиана признается "достоверными данными" достоверные данные помещаются в массив и используются для нового цикла построения прогнозов
    собственно реализованный на ардуино алгоритм, при подаче на вход данных навигационного приемника работает примерно так:


    [​IMG]

    тоесть розовый тренд показывает "угловатые" сырые данные. желтым показан результат работы фильтра. Диаграмма указывает на то что фильтр обеспечивает сглаживание. причем при этом не происходит задержки.

    скриншот работы двух АПМ от одного приемника с фильтром и без
    noinav_gpsfilter907.jpg
    (чуть позже уберу под спойлер)

    Специфичные настройки фильтра kpmf.
    в полном списке параметров
    inav_tc_xy = 0 - отключение инерциалки по широте и долготе. не пытайтесь делать тоже самое на других прошивках, значение ноль применимо только к этой версии прошивки.
    GPS_navfilterPE =9 число паралельных пронозов - размер массива. допустимый зиапазон значений 3-19 значение по умолчанию 9. чем больше число прогнозов тем сильнее фильтрация, но больше латентность к ускорениям системы.
    GPS_navfilterSPD=5 число прогнозов при вычислении скорости. скорость используется для приращения расстояния при коррекции прогноза на время задержки. Диапазон 3-9 чем выше значение тем лучше фильтрация но хуже прогноз при ускорениях
    Отключение KPEMF
    отключение может понадобиться для сравнительного анализа, для просмотра сырых данных, поступающих с навигационного приемника.
    для отключения фильтра: GPS_navfilterPE =0

    Что мы имеем сейчас:
    собрана прошивка под апм2, выполнены первые облеты в ходе которых были выявлены приоритетные задачи и интересные комбинации параметров настройки.

    концепция высвобождения места во флеш памяти
    1. делим прошивку на две субверсии, функционал:
    тестовая
    • терминал
    • логирование всего
    • автотюн

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


    Новые фичи.
    После получения стабильной версии дополним функционал наиболее интересными и не затратными с точки зрения расхода флешь памяти новинками от свежих версий ардукоптера 3.3 и выше
    пока на заметке:a) PID scaling for battery voltage (disabled by default, see MOT_THST_BAT_ parameters)

    ps. все описанное выше не значит что я забрасываю проект f4by.
    все лучшее будет перенесено в наш 32 битный контроллер.
    На Pixhawk переносить не будем.
    по вопросу получения актуальной версии прошивки для участия в тестировании и обсуждении пишите на kozin@mail.ru

    Актуальная версия прошивки: 015а

    Актуальный, обновляемый в шапке файл параметров для тестирования:

    https://www.dropbox.com/s/ii5b6rmep8i3j6e/tstparam.rar?dl=0
    архив содержит файл параметров который можно загрузить через мишен планнер вкладка full parameters tree -> compare
    и файл с описанием для чего требуется тот или иной параметр изменить
    LOITER_LAT_D,0.001 -резкость разгона и торможения при борьбе с погодными условиями и воронкой за точность удержания позиции
    LOITER_LON_D,0.001 -тоже самое для долготы должен быть идентичным по умолчанию у ардукоптера значение 0

    WPNAV_ACCEL, 150 -допустимые ускорения 150 означает полтора метра в секунду за секунду. по умолчанию 100 что значит 1 метр в секунду за секунду


    LOITER_LAT_IMAX,40 -максимальный размер накапливаемой ошибки от внешних факторов, при ошибке компаса большие значения способствует возникновению воронки
    LOITER_LON_IMAX,40 -аналогичное по долготе по умолчанию 1000

    LOITER_LAT_P,1 -пропорциональный коэфициент между требуемым перемещением для удержания позиции и углом наклона рамы для этого перемещения
    LOITER_LON_P,1 -аналогичное по долготе по умолчанию 1. При вялости в лоитере возможно потребуется увеличить.

    INAV_GPS_XY_SPD, 5 -интесивность восстановления инерциальной скорости данными от жпс приемника, большие значения приводят к большему доверию жпс
    INAV_GPS_XY_POS, 8 -интенсивность восстановления инерциальной позиции данными от жпс приемника, большие значения приводят к большему доверию жпс

    INAV_GPS_DELAY, 3 - компенсация времени задержки выдачи координат жпс приемником в десятых долях секунды диапазон 1-5

    INS_MPU6K_FILTER, 10 -встроенная фильтрация вибраций силами процессора ориентации, значение по умолчанию 0,
    внимание! при значении 10 требуется перенастройка пидов стабилизации летательного аппарата. Если у вас нет возможности перенастроить пиды стабилизации оставьте этот параметр соотвествующим вашим пидам
     
    Последнее редактирование: 27 апр 2016
    Hanter, Xichnik55, raefa и ещё 1-му нравится это.
  2. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.094
    Город:
    Реж
    Имя:
    Тимур
    Сегодня полетал подбирая INAV_GPS_DELAY.
    INAV_GPS_SPD поставил равным 6, чтобы был побольше расколбас. При разных INAV_GPS_DELAY глазом я разницу не заметил. После каждого изменения параметра на всякий случай перезагружал коптер.
    Выкладываю что налетал:
    INAV_GPS_DELAY=1,
    INAV_GPS_DELAY=3,
    INAV_GPS_DELAY=5,
    INAV_GPS_DELAY=7,
    INAV_GPS_DELAY=20,
    INAV_GPS_DELAY=50.
     
    Alexey Kozin нравится это.
  3. Alexey Kozin

    Alexey Kozin APM Guru Команда форума

    Регистрация:
    26 янв 2015
    Сообщения:
    925
    Город:
    Москва
    Имя:
    Алексей Козин
    больше 5 смысла нет - оно ограничено 5, спасибо за тесты попробую сравнить
     
  4. Uolg

    Uolg Студент

    Регистрация:
    4 янв 2016
    Сообщения:
    435
    Город:
    Руза
    Имя:
    Олег
    не очень понял.
    Получаем P это некая поправка на пролет или мы задаем максимальную ошибку?
    D-скорость? Скорость чего? Скорость коптера же у нас переменная величина.
    I- поправка на расстояние пролета? т.е. то расстояние которое пролетает коптер после того как стик переведен в центр? Т.е. можно это измерить и внести?
     
  5. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.094
    Город:
    Реж
    Имя:
    Тимур
    Олег, представьте, что вы двинули стиком, как я говорил в соседней теме, а потом резко поставили стик в ноль.
    А теперь ЗАМРИ, МГНОВЕНИЕ!
    Что у нас получается. Коптер хочет перевеститься в точку сейчас+(например)20см.
    То есть P, это те самые 20 см до целевой точки, которые нам нужно погасить. Задача стоит как раз определить это самое Р (оно же в коэффициенте, а не в линейных единицах).
    D - это скорость, с какой коптер кинется эти самые 20 см гасить.
    А теперь - мгновение, продожись!
    Коптер полетает туда-сюда и встанет на месте. И тут играет I.
    Может возникнуть дельта между точкой где он фактически остановился и где должен был встать. Например, если при RTL он сел не в точку старта, а ошибся на 2-3 метра, причем его не колбасило при снижении. Вот тут показатель, что I нужно повышать.
     
  6. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.094
    Город:
    Реж
    Имя:
    Тимур
    Сегодня полетал немного. Были некие приключения, которые закончились благополучно. В итоге я немного поднастроил ПИДы Лоитера, сейчас уже почти нормальное поведение.
    Снял два видосика, держа одной рукой смарт, другой рукой пытаясь рулить (уже о чем-то говорит).
    Видосик номер один - висение и отработка остановки в Лоитере:

    Второй видосик - взлет (как я одной рукой в Стабе взлетал - самому загадка), Лоитер, отдаление в режиме Лоитер и автоматический возврат в RTL.

    ПИДы Лоитера ещё нужно подбирать, RTL в результате ошибся на метр (похоже нужно повышать Rate Loiter I ).
    На данный момент параметры такие:
    Loiter PID P = 1
    Rate Loiter P = 2.000
    Rate Loiter I = 0.050
    Rate Loiter D = 0.400
    IMAX = 4.0
    WPNAV Loiter Speed = 400.000
    INAV_GPS_DELAY=4
    INAV_XY_POS=8
    INAV_XY_SPD=4
    INAV_TC_Z=5

    Теперь немного блаблабла.
    Выяснил взаимосвязь между параметром WPNAV Loiter Speed и INAV_GPS_DELAY. Чем выше INAV_GPS_DELAY, тем выше можно задирать WPNAV Loiter Speed.
    Если WPNAV Loiter Speed слишком низко, то Лоитер очень медленный, полеты очень неспешные (новичкам понравится 200-300).
    Мне же, для полета по точкам нужно было это значение побольше (слишком большую территорию нужно облететь), я пытался поднимать скорость Лоитера (WPNAV Loiter Speed).

    Второй момент - про унитазинг.
    Если нам представить микросхему компаса в виде шести катушек, каждая из которых прилепленная на грань куба, то выходит следующее:
    1. Наибольшие показания по датчику (наибольшая чувствительность) достигаются, когда одна из катушек своим сердечником направлена СТРОГО на магнитный полюс.
    2. Если микросхема компаса намагничена, мы это можем представить, как некую магнитную неоднородность самого датчика. То есть в нашем примере - на куб куда-нибудь прилепили кусок железа или даже магнит.
    3. Что при этом получается? При этом абсолютные показания сбиваются из-за магнитной неоднородности самого датчика. Ситуация топора под корабельным компасом.
    4. Можно ли как-то исправить эту ситуацию, не размагничивая сам датчик? (размагнитить микросхему магнетометра - самое логичное, но не всем доступное решение). Да, можно. Опять же двумя способами.
    Либо повернуть датчик физически (приблизительно вычислив ошибку), чтобы с учетом неоднородности датчик показывал направления правильно.
    Либо точно вычислить ошибку и каждый раз корректировать полученные результаты, вводя значения коррекции в результаты измерений.
    5. Какой способ коррекции наиболее предпочтителен? Представим ситуацию, что мы взяли большую суперчувствительную катушку, прицепили к ней вольтметр, стали направлять в разные стороны и следить за наведенными в катушке вольтами (милливольтами, микровольтами - неважно). Максимальные значения будут, когда сердечник показывает строго на магнитный полюс. Чтобы иммитировать намагниченность микросхемы магнитометра - располагаем магнит где-то рядом с катушкой, чтобы он вращался единым целым вместе с катушкой. Теперь смотря на показания вольтметра мы пытаемся вычислить магнитный полюс (север).
    Теперь я задам вопрос - при каких условиях мы получим наибольшие абсолютные значения на вольтметре (сильнее сигнал) - при первом методе регулирования, когда на север указывает некий результирующий вектор (сердечник катушки плюс магнитная неоднородность датчика) - или когда на север будет указывать всё-таки сердечник катушки?
    6. Мне кажется - во втором случае. Другое дело, что не все полетные контроллеры дают регулировать эту неоднородность программным способом (точно вычислив ошибку и каждый раз прибавлять невязку к снятым показаниям датчика). Например, Наза, в силу своей закрытости не допускает программную корректировку. То есть Наза считает магнетометр непогрешимым и при условии калибровки якобы показывает правильно.
    А тот же АРМ позволяет нам вводить некоторую поправку (магнитуда), которая микшируется с показаниями сенсора. И это мне кажется более точным методом, чем физический разворот датчика.
     
    Alexey Kozin и Алексей.irk нравится это.
  7. Uolg

    Uolg Студент

    Регистрация:
    4 янв 2016
    Сообщения:
    435
    Город:
    Руза
    Имя:
    Олег
    То что РТЛ ошибся на метр это лучше чем погрешность определения позиции по GPS ! Как можно добиться лучше этого?
     
  8. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.094
    Город:
    Реж
    Имя:
    Тимур
    Всегда есть к чему стремиться :)
    Хочу, чтобы ....
    1. лоитер был более "шустрым" (чтобы можно было WPNAV Loiter Speed поставить 600)
    2. погрешность составляла не более 30 см
    3. коптер не колбасило при снижении
    4. коптер при движении и последующей остановке не колебался более 1-2 раз
     
  9. Uolg

    Uolg Студент

    Регистрация:
    4 янв 2016
    Сообщения:
    435
    Город:
    Руза
    Имя:
    Олег
    Интересно насколько такое реально?
    На скорости чтоб уложиться в 30 см ему придется дать хороший и точный импульс чтоб остановиться если не расчитает возникнут колебания, плюс 2-3 метра погрешность GPS...
    --- Сообщения объединены, 1 май 2016 ---
    А я сегодня P loiter изменил с 2х на 1- коптер стал более вялый.
     
  10. Alexey Kozin

    Alexey Kozin APM Guru Команда форума

    Регистрация:
    26 янв 2015
    Сообщения:
    925
    Город:
    Москва
    Имя:
    Алексей Козин
    только по опознавательным знакам и распознованию.

    логи посмотрел самый симпатичный на мой взгляд с INAV_GPS_DELAY=5
    судя по видео все ничтяк можно расти дальше
     
    Последнее редактирование модератором: 3 май 2016
  11. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.094
    Город:
    Реж
    Имя:
    Тимур
    Да, можно, и нужно! Только пока мой тестовый аппаратик на ремонте, у него сегодня было приключение. Сейчас как назло - на восстановление накопилось куча техники (съемочный коптер после крашика, очки, экшн-камера, а тут ещё и тестовый коптер). Так что на пару недель-месяц я точно в ауте. :)
     
  12. шторм73

    шторм73 Студент

    Регистрация:
    2 авг 2016
    Сообщения:
    34
    Город:
    Черкесск
    Имя:
    Виталий
    А что дальше? Есть продолжение? Очень заинтересовало!
     
  13. Alexey Kozin

    Alexey Kozin APM Guru Команда форума

    Регистрация:
    26 янв 2015
    Сообщения:
    925
    Город:
    Москва
    Имя:
    Алексей Козин
    пробуйте летать,
    если есть навыки программирования и собственные идеи - поделюсь исходниками.
    в идеале нужно еще дописать коррекцию компаса

    в принципе цели поставленные в собственной прошивке для апм решены в ардукоптер 3.3.2 для f4by
    конкретно коптер вполне стабилен с весьма кривым компасом,
    но обратно портировать не представляется возможным, там тяжелый екф алгоритм
     
  14. 5yoda5

    5yoda5 Master Команда форума

    Регистрация:
    29 янв 2015
    Сообщения:
    7.094
    Город:
    Реж
    Имя:
    Тимур
    Ну как бы тема ещё не закрыта. Мой коптер-тестировщик пока на ремонте, за август я его планирую починить. Починил бы раньше, но сначала было просто некогда, потом другие более срочные дела, а теперь я его не только чиню, но и слегка модернизирую (потому сильно снижен темп ремонта).
    Остались небольшие непонятки с модулем GPS/Glonass МТК3333, которые должны вылечиться прошивкой модуля. Модуль уже прошит, осталость протестировать - помогло или нет.
    А вообще-то прошивка уже "летная", ещё бы облегчить логгирование (там несколько усиленое, и более 20 минут полета не влазит в память), но сейчас это пока преждевременно (пока мало тестов).
     
  15. Alexey Kozin

    Alexey Kozin APM Guru Команда форума

    Регистрация:
    26 янв 2015
    Сообщения:
    925
    Город:
    Москва
    Имя:
    Алексей Козин
    код перевода жпс на 115200 с выдачей 10гц я попробовал на ардуплане для самолета,
    облетали, ведет себя очень хорошо, самоль получился долголетом, по максимуму до 3 часов. пришлось модифицировать логирование так что опыт есть
     
    Hanter и 5yoda5 нравится это.