Создание собственной системы стабилизации
Вот ещё добавлю про датчики. Сегодня опять вернул Ф3Дискавери на 450ю раму для проверки отключения 4го мотора.
При одинаковых алгоритмах на МПУ всё прилично, на ЛСМ горизонт кривит не по детски…
Сдаётся мне, что в ЛСМ есть взаимовлияние осей, т.е. создаешь ускорение по одной оси, а оно пролазит в другую… При постоянной вибрации осреднённая составляющая этого паразитного ускорения вылазит в бок. Причем почитал в ветках про самики со стабом на ЛСМ, там всё ровно также как и у меня - горизонт валит вперёд и влево.
Что собсна говорит о том, что такая особенность имеется у всех ЛСМ и её проявление не зависит от качества фильтра и параметров вибрации. Привет, ПиксХавку!
У меня тут мысль в башке вертится:
- Цикл жесткий - магическое число - регули на 400, значит 2500 (ну можно с вариациями на тему)
- Фильтр даёт ПРЕДСКАЗАНИЕ положения в момент записи в таймеры, а не в момент расчёта
- ПИД обязан вычислить и записать в таймеры нужное ВОВРЕМЯ дабы небыло проскоков периода.
Отсюда вытекают две вещи:
внутренние фильтры датчиков придётся отключать! дабы повысить скорость считывания и не ловить старые данные - они будут не верны 😦
ну и как следствие нужен мощный фильтр дабы он справился с сырыми данными
как доказательство - мелкоплата на LSM ТОЛЬКО с одноосевым Калманом до комплиментарного и на максимальной частоте выборки удалось хоть как-то завести аксель…
внутренние фильтры датчиков придётся отключать! дабы повысить скорость считывания и не ловить старые данные - они будут не верны
Если в коде просто усреднять, то нет смысла, т.к. датчик сам это делает. А если отдавать Калману (и другим фильтрам), сможет ли он работать на 1Khz?
Мне тут на днях показали код мультивия в частности инициализация ITG3200 - так вот, там Sampling Rate = F = 1KHz - то я то понимаю, что Мультивии не в состоянии на такой частоте обрабатывать данные от гиры = значит он тупо пропускает данные (скорее всего 50% и больше) - не понимаю зачем так сделано???
Не, так это выборка, скажем так, цифровой частью гиры показаний его аналогово датчика, а дальше он сам усредняет и в выходных регистрах уже усреднённые данные…
нам же в таком случае надо следуюшее - в выходных регистрах датчика должны быть значения снятые с той же частотой, с которой позволит шина…
Не, так это выборка, скажем так, цифровой частью гиры показаний его аналогово датчика, а дальше он сам усредняет и в выходных регистрах уже усреднённые данные… нам же в таком случае надо следуюшее - в выходных регистрах датчика должны быть значения снятые с той же частотой, с которой позволит шина…
Не, вот именно что усреднение там отключено, гира пишет на частоте дискретизации = 1Khz (можно и 8 включить, но там 1). Усреднения нет, поэтому все что не успеет прочитать Мультивии - пропадает.
не Алексей, фильтруется оно
//ITG3200 and ITG3205 Gyro LPF setting
#if defined(ITG3200_LPF_256HZ) || defined(ITG3200_LPF_188HZ) || defined(ITG3200_LPF_98HZ) || defined(ITG3200_LPF_42HZ) || defined(ITG3200_LPF_20HZ) || defined(ITG3200_LPF_10HZ)
#if defined(ITG3200_LPF_256HZ)
#define ITG3200_SMPLRT_DIV 0 //8000Hz
#define ITG3200_DLPF_CFG 0
#endif
#if defined(ITG3200_LPF_188HZ)
#define ITG3200_SMPLRT_DIV 0 //1000Hz
#define ITG3200_DLPF_CFG 1
#endif
#if defined(ITG3200_LPF_98HZ)
#define ITG3200_SMPLRT_DIV 0
#define ITG3200_DLPF_CFG 2
#endif
#if defined(ITG3200_LPF_42HZ)
#define ITG3200_SMPLRT_DIV 0
#define ITG3200_DLPF_CFG 3
#endif
#if defined(ITG3200_LPF_20HZ)
#define ITG3200_SMPLRT_DIV 0
#define ITG3200_DLPF_CFG 4
#endif
#if defined(ITG3200_LPF_10HZ)
#define ITG3200_SMPLRT_DIV 0
#define ITG3200_DLPF_CFG 5
#endif
т.е. если Sampling Rate = F = 1KHz то на выходе LPF_188HZ - что вий вполне успеет прочитать…
на f4 реально взять с датчика по полной…
Кстати, а чё все к фильтру привязались то?
Вот именно эту мысль я и толкаю… Работы в плане доводки датчиков + ПИД и алгоритмов работы с ними не початый край, а этот аспект как то все “перескакивают” и сразу в “калманы”…
Из своих наблюдений (в теме меньше года) могу сообщить:
Попытки обработать данные с гиры/акселя до подачи в ИМУ особых реальных улучшений не дали…(применял усреднение, “медиану” без разн…) только тормозили цикл, ради смеха брал усреднение аж по 70 выборкам - бесполезно…
Правда оговорюсь сразу - это злополучный LSM, гира от F3 вполне адекватная. Таким образом шумы акселя + гира при запущенных моторах не позволяют увеличить коэф. усиления (а равно о быстродействие) ИМУ и повысить качество стабилизации аппарата…
Ставил свою платку на самолет (схема классика), - да - картина лучше, но при “кривом” винте (трава налипла), один раз была явная потеря контроля, чего уж говорить о четырех моторах, создающих в рабочем диапазоне МАССУ резонансов !
Я вот ПИДы вообще не меняю,
кстати, да, ПИД скорее сильней привязан непосредственно к свойствам датчиков + настройки их усиления…
т.е. если Sampling Rate = F = 1KHz то на выходе LPF_188HZ - что вий вполне успеет прочитать… на f4 реально взять с датчика по полной…
Честно говоря, у меня нету всего кода, т.к. это в Сашиной прошивке (mahowii), но строка которая должна была залить тот самый делитель, закоменчена:
// i2c_writeReg(ITG3200_ADDRESS, 0x15, ITG3200_SMPLRT_DIV); //register: Sample Rate Divider -- default value = 0: OK
А по умолчанию, делитель = 0, т.е. 1KHz
P.S. Ха, так в твоем куске кода, делитель всегда равен 0 ))))
так смотри ITG3200_SMPLRT_DIV 0 и ITG3200_DLPF_CFG 0 это максимум датчика т.е. 8КГц считывание и 256Гц на выходе это при времени цикла 3906 вполне успеваемая цыфра 😃 я не работал с этим датчиком, но так понимаю, эти два регистра связаны между собой…
Калманов
Калман
калман
калмана
Калмана
Калмана
😃)))
Напомню 7-го числа начался отличный курс по цифровой обработке сигналов www.coursera.org/course/dsp я записался, но пока из за проблем со временем не начал…
далее через 2 дня начнется курс Machine Learning от Стэнфорда! www.coursera.org/course/ml
- кореш мой проходит сейчас Artificial Intelligence for Robotics www.udacity.com/course/cs373
Очень доволен, что с курсом есть необходимый материал по азам линейной алгебры. И кстати там есть урок по Калману. Друг сказал что сперва не въехал, а потом допер и все как на ладони стало. Курс этот от фрица, препода из Стэнфорда, который участвует в проекте по автономным гугломобилям.
Это осеннее обострение, в аналы(слово то какое) медицины войдёт как Калманомания - похоже оно заразно 😃
проходит сейчас Artificial Intelligence for Robotics www.udacity.com/course/cs373
Очень доволен
Я в прошлом году или позапрошлом окончил его. Отличный курс, но потом наступает некоторое разочарование, когда начинаешь реально что то делать то оказываться что тебе рассказали лишь введение, и что бы реально применить нужно самостоятельно перелопатить гору информации. может это и к лучшему. Для себя вынес полезного это алгоритм Particle Filter, классная вещь Калман не нужен 😃
- Цикл жесткий - магическое число - регули на 400, значит 2500 (ну можно с вариациями на тему)
- Фильтр даёт ПРЕДСКАЗАНИЕ положения в момент записи в таймеры, а не в момент расчёта
- ПИД обязан вычислить и записать в таймеры нужное ВОВРЕМЯ дабы небыло проскоков периода.
Это так в базефлайте? И вие?
Вообще тут надо отделить мух от котлет:
Расчеты ИНС и ПИДов должны быть в ритме выборки датчиков, а а микшер и управление в ритме формирования ШИМ. Т.е. по готовности датчика выполняются вычисления позиционирования и ошибка от заданного положения, и это происходит ДО следующего отсчета датчиков, а миксер вычисляется от выхода ПИДов по готовности таймера к отработке следующего периода. Итого получается отставание: 1 период отсчета ДУС (F3discovery - 2.63 мсек,F4BY - 4 мсек.) , и до выхода в ШИМ 1 период таймера (т.е. от 2.5 до 20 мсек), т.е. при 400Гц ШИМ = 5(7) мсек, при 50Гц шим 23-24 мсек.
Отсюда вытекают две вещи:
внутренние фильтры датчиков придётся отключать! дабы повысить скорость считывания и не ловить старые данные - они будут не верны
Не понял при чем тут внутренние фильтры? Разница между внутренним и внешним только в месте размещения.
А задержка зависит больше от частоты ШИМ, ну а далее регуль и ВМГ.
Сегодня квадру чуть в космос не отправил 😃, поставил новую батарею 4000мАч на 12х пропах, а настройки оставил старые мингаз 1200, средняя точка 1300. Рванул вверх, а вниз спускаться отказался. Хотел сначала ронять, пока он из радиовидимости не свалил, но потом я его большими кренами назад-вперёд снизил постепенно, а там батарея начала сдавать помалу. Дальше летал практически на нулевом газу.
Не понял при чем тут внутренние фильтры? Разница между внутренним и внешним только в месте размещения.
А задержка зависит больше от частоты ШИМ, ну а далее регуль и ВМГ.
Надо повысить частоту считывания, ибо смысл читать гиры на 800Гц если они выдают показания на 42Гц - и что мы будем читать старые данные? зачем? смысл от 400-490 герцового шима? если изменения вносятся 42 раза в секунду (это я из примера готовности датчиков) скажем для ПИДа хорошо сглаженные двумя фильтрами данные, но для бесплатформенной ИНС помоему не очень?
ДУС (F3discovery - 2.63 мсек,F4BY - 4 мсек.) , и до выхода в ШИМ 1 период таймера (т.е. от 2.5 до 20 мсек), т.е. при 400Гц ШИМ = 5(7) мсек, при 50Гц шим 23-24 мсек.
я вечно путаюсь в микро и мили - мсек-это что?
Надо повысить частоту считывания, ибо смысл читать гиры на 800Гц если они выдают показания на 42Гц - и что мы будем читать старые данные? зачем? смысл от 400-490 герцового шима?
Полностью согласен…
Отсюда же и имею очень скептическое отношение к разного рода “крутым” регулям по I2C, там где надо и не надо… В корень надо смотреть… и иметь минимальный набор “инструментов” для реальной оценки эффективности отдельных узлов аппарата “снизу-вверх”, а не гнаться слепо за “понтами” которые присутствуют зачастую - номинально.
Надо повысить частоту считывания, ибо смысл читать гиры на 800Гц если они выдают показания на 42Гц - и что мы будем читать старые данные? зачем?
Кто сказал, что реальная частота дискретизации 42Гц? Я пока уверен, что СТшные ДУСы вполне адекватно отражают повороты на установленной частоте.Что касаемо МПУ, то там ещё проще, ДУС работает на 1кГц, на это дальше задается делитель отсчетов от 1 до хз (128 макс вроде), он задает частоту отсчетов акселя, ДУС на это же время осредняется. И мы получаем выход с ДУСа и акселя на одной частоте.
я вечно путаюсь в микро и мили - мсек-это что?
м -мили
мк -микро
А смысла ставить ШИМ 490 Гц при обсчете инс 42Гц нет особого, ну кроме того, что при 50Гц ШИМ к 238 мсек от ИНС добавится 200 мсек от регуля. Хотя пробовал летать на 50Гц, для больших винтов и тяжелых аппаратов разницы нет, но там возможно важно иметь обратную связь по оборотам.
Отсюда же и имею очень скептическое отношение к разного рода “крутым” регулям по I2C, там где надо и не надо…
К регулям по и2ц имею резко отрицательное отношение, а вот по КАН положительное. Хотя не то ни другое не использовал, зато хорошо знаком с особенностями первого интерфейса и возможностями второго.
Для себя вынес полезного это алгоритм Particle Filter, классная вещь Калман не нужен
спасибо, почитаю… вот нашел статейку habrahabr.ru/post/152553/
спасибо, почитаю… вот нашел статейку habrahabr.ru/post/152553/
Если честно, когда только начал изучал информацию на русском то это статья меня запутала. Лучше оригинал www.udacity.com/course/viewer#!/c-cs373/l-48704330… там и примеры кода на питоне есть.
Лирическое отступление, немного подвис с разработкой новой платы - пока в ступоре каком-то, а может и лень?
Но дело не в этом, есть незаконченное ПО на скажем так нулевую плату (всё что в гит)
Негоже бросать, думаю. Так вот к чему клоню - кривой USART1 - мысли:
// Transmit DMA
DMA_DeInit(DMA2_Stream7);
while (DMA_GetCmdStatus(DMA2_Stream7) != DISABLE) {
};
DMA_InitStructure.DMA_Channel = DMA_Channel_4;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&USART1->DR;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_Init(DMA2_Stream7, &DMA_InitStructure);
DMA_SetCurrDataCounter(DMA2_Stream7, 0); // А не забыл ли я вот эту хрень?
DMA_ITConfig(DMA2_Stream7, DMA_IT_TC, ENABLE);
DMA2_Stream7->NDTR = 0;
USART_DMACmd(USART1, USART_DMAReq_Tx, ENABLE);
USART_Cmd(USART1, ENABLE);