Несколько модулей GNSS по одной UAVCAN шине.
Если модуль GPS подключается по can-шине, публикацию gps-данных в uorb делает не драйвер gps (src/drivers/gps), а драйвер uavcan (src/drivers/uavcan/sensors/gnss) вот тут.
Если подключается 2 gps (каждое устройство в терминах UAVCAN называется "node"), PX4 видит обе ноды. Это мы можем проверить через nsh консоль вот так:
nsh> uavcan status
Но публикуются данные только с одной из этих нод. На этапе обработки GPS FIXX драйвер uavcan запоминает номер устройства и далее работает только с ним, игнорируя все остальные приёмники. Вот на этой строчке явно говорится о том, что имплементация sensor_bridge позволяет работать только с одним gps-приёмником. Если не отбрасывать данные от других приёмников, а паблишить всё, что прилетает с них, то будут сайд-эффекты в виде постоянно прыгающих туда-сюда координат, количеств спутников, pdop/eph/epv. Такое нам не надо, а надо как-то по-умному это комплексировать.
Как можно дебажить код прошивки
Дебажить код прошивки с помощью вывода PX4_INFO(...) можно следующим образом.
Сначала убедиться, что логгер запускается при старте пиксрейсера. В автозапуск после этой строчки добавить logger on
. Затем перенести инициализацию и запуск логгера ДО инициализации uavcan'а, чтобы всё, что происходит при инициализации UAVCAN было залогировано.
Важно при этом помнить, что logger on жрёт 10КБ оперативки, а включенный uavcan ещё 60, так что оперативка может закончиться даже с заводской прошивкой "из коробки". Ставим mav_0_config, mav_1_config в disabled, и оперативки хватает.
Что происходит в драйвере UAVCAN
Если приёмниками GPS драйвер uavcan_bridge запоминает номер первого принятого устройства и игнорит остальные, то с магнитометром дела обстоят иначе. Магнитометр_бридж паблишит данные через базовый класс UavcanCDevSensorBridgeBase::publish от каждого магнитометра отдельно (так должно работать, хотя на моей практике он постоянно говорил "out of class instances"). Но есть одна несостыковка: все магнитометры, подключенные по КАН, могут иметь только одну общую калибровку на всех. Она здесь. В ответ на вопрос "почему так" Павел Кириленко, автор модуля uavcan, подтвердил, что нужно всё переделывать: https://github.com/PX4/Firmware/issues/10621#issuecomment-594503037. В итоге я сам пишу отдельный модуль калибровки магнитометров по CAN
Смешивание GPS
GPS Blending уже реализован в ekf2, но там хардкод, который предполагает, что может быть максимум два приёмника (пруф1, пруф2).
Смешивание MAG
PX4 позволяет подключать до 4 магнитометров. Но они не смешиваются. Им выставляются приоритеты, и используются данные мага с высшим приоритетом. Если он отваливается, то px4 переключается на следующий. Об этом сказано здесь.
Как в итоге будут работать магнитометры по КАНу (WIP)
Задачи:
- Реализовать одновременную калибровку нескольких магов по CAN-шине (из коробки это не реализовано, пруф)
- Когда даём с наземки команду "калибровка", то вместе с механизмом калибровки должна запускаться реализованная мной калибровка магов по CAN-шине. Окончание "основной" калибровки должно вызывать окончание "CAN-калибровки".
- После успешной CAN-калибровки должны сохраняться параметры
- При включении коптера должны загружаться сохранённые параметры
- Сравнить эффективность калибровки по трём сторонам с шестью. Если разница небольшая, то использовать всегда 3
- Комплексировать данные магнитометров, отбрасывать "скачки".
Статус задач
- Реализовано по этому алгоритму.
- Реализовано. Начало калибровки: в модуле
drivers/uavcan/sensors/mag.cpp
в колбэкеmag_sub_cb()
ловится команда начала калибровки магов и запускает кастомную калибровку. Окончание: в файлеmodules/commander/mag_calibration.cpp
в самом конце функцииdo_mag_calibration(...)
идёт отправка по uORB'у кастомной команды об успешной калибровке. Она ловится в том же модулеdrivers/uavcan/sensors/mag.cpp
в колбэке mag_sub_cb(). - Для магов, подрубленных по UAVCAN'у, калибровка сохраняется в параметрах с именами CAL_MAG4_..., CAL_MAG5_... и т.д. Максимум в пиксе по умолчанию может быть 4 мага.
- Сделано.
- https://docs.google.com/spreadsheets/d/1E1bJGcvTrA64zVywthRvSJEnAMSaaVI7hMvp1SMgY7w/edit#gid=0
- Сделал обнаружение и отбрасывание "скачков".