Создание собственной системы стабилизации

SergDoc

У меня тут мысль в башке вертится:

  1. Цикл жесткий - магическое число - регули на 400, значит 2500 (ну можно с вариациями на тему)
  2. Фильтр даёт ПРЕДСКАЗАНИЕ положения в момент записи в таймеры, а не в момент расчёта
  3. ПИД обязан вычислить и записать в таймеры нужное ВОВРЕМЯ дабы небыло проскоков периода.
    Отсюда вытекают две вещи:
    внутренние фильтры датчиков придётся отключать! дабы повысить скорость считывания и не ловить старые данные - они будут не верны 😦
    ну и как следствие нужен мощный фильтр дабы он справился с сырыми данными
    как доказательство - мелкоплата на LSM ТОЛЬКО с одноосевым Калманом до комплиментарного и на максимальной частоте выборки удалось хоть как-то завести аксель…
Sir_Alex
SergDoc:

внутренние фильтры датчиков придётся отключать! дабы повысить скорость считывания и не ловить старые данные - они будут не верны

Если в коде просто усреднять, то нет смысла, т.к. датчик сам это делает. А если отдавать Калману (и другим фильтрам), сможет ли он работать на 1Khz?

Мне тут на днях показали код мультивия в частности инициализация ITG3200 - так вот, там Sampling Rate = F = 1KHz - то я то понимаю, что Мультивии не в состоянии на такой частоте обрабатывать данные от гиры = значит он тупо пропускает данные (скорее всего 50% и больше) - не понимаю зачем так сделано???

SergDoc

Не, так это выборка, скажем так, цифровой частью гиры показаний его аналогово датчика, а дальше он сам усредняет и в выходных регистрах уже усреднённые данные…
нам же в таком случае надо следуюшее - в выходных регистрах датчика должны быть значения снятые с той же частотой, с которой позволит шина…

Sir_Alex
SergDoc:

Не, так это выборка, скажем так, цифровой частью гиры показаний его аналогово датчика, а дальше он сам усредняет и в выходных регистрах уже усреднённые данные… нам же в таком случае надо следуюшее - в выходных регистрах датчика должны быть значения снятые с той же частотой, с которой позволит шина…

Не, вот именно что усреднение там отключено, гира пишет на частоте дискретизации = 1Khz (можно и 8 включить, но там 1). Усреднения нет, поэтому все что не успеет прочитать Мультивии - пропадает.

SergDoc

не Алексей, фильтруется оно


//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 реально взять с датчика по полной…

oleg70
SergDoc:

Кстати, а чё все к фильтру привязались то?

Вот именно эту мысль я и толкаю… Работы в плане доводки датчиков + ПИД и алгоритмов работы с ними не початый край, а этот аспект как то все “перескакивают” и сразу в “калманы”…
Из своих наблюдений (в теме меньше года) могу сообщить:
Попытки обработать данные с гиры/акселя до подачи в ИМУ особых реальных улучшений не дали…(применял усреднение, “медиану” без разн…) только тормозили цикл, ради смеха брал усреднение аж по 70 выборкам - бесполезно…
Правда оговорюсь сразу - это злополучный LSM, гира от F3 вполне адекватная. Таким образом шумы акселя + гира при запущенных моторах не позволяют увеличить коэф. усиления (а равно о быстродействие) ИМУ и повысить качество стабилизации аппарата…
Ставил свою платку на самолет (схема классика), - да - картина лучше, но при “кривом” винте (трава налипла), один раз была явная потеря контроля, чего уж говорить о четырех моторах, создающих в рабочем диапазоне МАССУ резонансов !

oleg70
rual:

Я вот ПИДы вообще не меняю,

кстати, да, ПИД скорее сильней привязан непосредственно к свойствам датчиков + настройки их усиления…

Sir_Alex
SergDoc:

т.е. если 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 ))))

SergDoc

так смотри ITG3200_SMPLRT_DIV 0 и ITG3200_DLPF_CFG 0 это максимум датчика т.е. 8КГц считывание и 256Гц на выходе это при времени цикла 3906 вполне успеваемая цыфра 😃 я не работал с этим датчиком, но так понимаю, эти два регистра связаны между собой…

mahowik
Sir_Alex:

Калманов

rual:

Калман

HikeR:

калман

oleg70:

калмана

WETErok:

Калмана

SergDoc:

Калмана

😃)))

Напомню 7-го числа начался отличный курс по цифровой обработке сигналов www.coursera.org/course/dsp я записался, но пока из за проблем со временем не начал…

далее через 2 дня начнется курс Machine Learning от Стэнфорда! www.coursera.org/course/ml

  • кореш мой проходит сейчас Artificial Intelligence for Robotics www.udacity.com/course/cs373
    Очень доволен, что с курсом есть необходимый материал по азам линейной алгебры. И кстати там есть урок по Калману. Друг сказал что сперва не въехал, а потом допер и все как на ладони стало. Курс этот от фрица, препода из Стэнфорда, который участвует в проекте по автономным гугломобилям.
SergDoc

Это осеннее обострение, в аналы(слово то какое) медицины войдёт как Калманомания - похоже оно заразно 😃

WETErok
mahowik:

проходит сейчас Artificial Intelligence for Robotics www.udacity.com/course/cs373
Очень доволен

Я в прошлом году или позапрошлом окончил его. Отличный курс, но потом наступает некоторое разочарование, когда начинаешь реально что то делать то оказываться что тебе рассказали лишь введение, и что бы реально применить нужно самостоятельно перелопатить гору информации. может это и к лучшему. Для себя вынес полезного это алгоритм Particle Filter, классная вещь Калман не нужен 😃

rual
SergDoc:
  1. Цикл жесткий - магическое число - регули на 400, значит 2500 (ну можно с вариациями на тему)
  2. Фильтр даёт ПРЕДСКАЗАНИЕ положения в момент записи в таймеры, а не в момент расчёта
  3. ПИД обязан вычислить и записать в таймеры нужное ВОВРЕМЯ дабы небыло проскоков периода.

Это так в базефлайте? И вие?
Вообще тут надо отделить мух от котлет:
Расчеты ИНС и ПИДов должны быть в ритме выборки датчиков, а а микшер и управление в ритме формирования ШИМ. Т.е. по готовности датчика выполняются вычисления позиционирования и ошибка от заданного положения, и это происходит ДО следующего отсчета датчиков, а миксер вычисляется от выхода ПИДов по готовности таймера к отработке следующего периода. Итого получается отставание: 1 период отсчета ДУС (F3discovery - 2.63 мсек,F4BY - 4 мсек.) , и до выхода в ШИМ 1 период таймера (т.е. от 2.5 до 20 мсек), т.е. при 400Гц ШИМ = 5(7) мсек, при 50Гц шим 23-24 мсек.

SergDoc:

Отсюда вытекают две вещи:
внутренние фильтры датчиков придётся отключать! дабы повысить скорость считывания и не ловить старые данные - они будут не верны

Не понял при чем тут внутренние фильтры? Разница между внутренним и внешним только в месте размещения.
А задержка зависит больше от частоты ШИМ, ну а далее регуль и ВМГ.

Сегодня квадру чуть в космос не отправил 😃, поставил новую батарею 4000мАч на 12х пропах, а настройки оставил старые мингаз 1200, средняя точка 1300. Рванул вверх, а вниз спускаться отказался. Хотел сначала ронять, пока он из радиовидимости не свалил, но потом я его большими кренами назад-вперёд снизил постепенно, а там батарея начала сдавать помалу. Дальше летал практически на нулевом газу.

SergDoc
rual:

Не понял при чем тут внутренние фильтры? Разница между внутренним и внешним только в месте размещения.
А задержка зависит больше от частоты ШИМ, ну а далее регуль и ВМГ.

Надо повысить частоту считывания, ибо смысл читать гиры на 800Гц если они выдают показания на 42Гц - и что мы будем читать старые данные? зачем? смысл от 400-490 герцового шима? если изменения вносятся 42 раза в секунду (это я из примера готовности датчиков) скажем для ПИДа хорошо сглаженные двумя фильтрами данные, но для бесплатформенной ИНС помоему не очень?

rual:

ДУС (F3discovery - 2.63 мсек,F4BY - 4 мсек.) , и до выхода в ШИМ 1 период таймера (т.е. от 2.5 до 20 мсек), т.е. при 400Гц ШИМ = 5(7) мсек, при 50Гц шим 23-24 мсек.

я вечно путаюсь в микро и мили - мсек-это что?

oleg70
SergDoc:

Надо повысить частоту считывания, ибо смысл читать гиры на 800Гц если они выдают показания на 42Гц - и что мы будем читать старые данные? зачем? смысл от 400-490 герцового шима?

Полностью согласен…
Отсюда же и имею очень скептическое отношение к разного рода “крутым” регулям по I2C, там где надо и не надо… В корень надо смотреть… и иметь минимальный набор “инструментов” для реальной оценки эффективности отдельных узлов аппарата “снизу-вверх”, а не гнаться слепо за “понтами” которые присутствуют зачастую - номинально.

rual
SergDoc:

Надо повысить частоту считывания, ибо смысл читать гиры на 800Гц если они выдают показания на 42Гц - и что мы будем читать старые данные? зачем?

Кто сказал, что реальная частота дискретизации 42Гц? Я пока уверен, что СТшные ДУСы вполне адекватно отражают повороты на установленной частоте.Что касаемо МПУ, то там ещё проще, ДУС работает на 1кГц, на это дальше задается делитель отсчетов от 1 до хз (128 макс вроде), он задает частоту отсчетов акселя, ДУС на это же время осредняется. И мы получаем выход с ДУСа и акселя на одной частоте.

SergDoc:

я вечно путаюсь в микро и мили - мсек-это что?

м -мили
мк -микро

rual

А смысла ставить ШИМ 490 Гц при обсчете инс 42Гц нет особого, ну кроме того, что при 50Гц ШИМ к 238 мсек от ИНС добавится 200 мсек от регуля. Хотя пробовал летать на 50Гц, для больших винтов и тяжелых аппаратов разницы нет, но там возможно важно иметь обратную связь по оборотам.

oleg70:

Отсюда же и имею очень скептическое отношение к разного рода “крутым” регулям по I2C, там где надо и не надо…

К регулям по и2ц имею резко отрицательное отношение, а вот по КАН положительное. Хотя не то ни другое не использовал, зато хорошо знаком с особенностями первого интерфейса и возможностями второго.

mahowik
WETErok:

Для себя вынес полезного это алгоритм Particle Filter, классная вещь Калман не нужен

спасибо, почитаю… вот нашел статейку habrahabr.ru/post/152553/

SergDoc

Лирическое отступление, немного подвис с разработкой новой платы - пока в ступоре каком-то, а может и лень?
Но дело не в этом, есть незаконченное ПО на скажем так нулевую плату (всё что в гит)
Негоже бросать, думаю. Так вот к чему клоню - кривой 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);
rual

Это базефлайт? Насчет начальной установки счетчика можно не париться, после сброса он в нуле, для спокойствия его надо было через надстроечную структуру прописать DMA_InitStruct.DMA_BufferSize = 0;.