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

oleg70
SergDoc:

может “прижимается” плохо? медленно…

может… кстати как раз из за емкости монтажа… отдельные платки с ИМУ все I2C-ешные, а SPi-ных я че то не видел…

17 days later
oleg70
SergDoc:

может “прижимается” плохо? медленно…

Оказалось, что слишком быстро инициализация проходила (задержки на запись остались от stm103го), а верней - не проходила… и никакие ёмкости тут не причем… 😃 щас все пашет…
Сергей, что там с тестовыми полетами на “двойном” комплекте датчиков и, кажется, каком то мегакоде ?? (народ в ожидании результатов…)

SergDoc

Времени нет, свой дом - всё-таки свой дом, работы валом, Макс тоже пока занят… Чуть освободимся подтянем)))

Hyperion

Фильтр Маджвика. Не разбираюсь в этом но может разработчикам будет интересно почитать 😃

habrahabr.ru/post/255661/

rual
Hyperion:

Фильтр Маджвика. Не разбираюсь в этом но может разработчикам будет интересно почитать

Статья для доцентов, много математических выкладок и наукообразия. . Для тех кто хорошо знает высшую математику, но не знает куда её применить, типа “как рассчитать вероятность падения бутерброда на масло”. А так почитать интересно, спасибо.
Если выкинуть все излишние сопли, то есть годные моменты:

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

alexmos
rual:

Статья для доцентов, много математических выкладок и наукообразия. . Для тех кто хорошо знает высшую математику

Верно подмечено, тем кто математику изучал давно, будет сложно понять. Если разобрались, можете в двух словах описать в чем отличие от фильтра Махони, основанном на матрице поворота и комплиментарном фильтре? По моему, он на порядок проще.

rual
alexmos:

Если разобрались, можете в двух словах описать в чем отличие от фильтра Махони, основанном на матрице поворота и комплиментарном фильтре? По моему, он на порядок проще.

Нет, сравнить не смогу, ибо не знаю алгоритма Махони. Более того не знаю как описывается ориентация в пространстве матрицей поворота.
Однако описанный в алгоритм статье мне понятен, так как моя ИНС построена на тех же принципах - Ориентация из векторных наблюдений. Только мой алгоритм вывернут на изнанку, Маджавик наблюдает вектора относительно ориентации платформы, а у меня относительно предполагаемой мировой ориентации.
Чтоб не быть голословным могу предложить эксперимент. Могу выложить прошивку под Ф3Дискавери с Маджавиком и моим алго. После чего проверить реакцию алго на изменение магнитного поля, поднося магнит к магнитометру. По реакции на возмущение будет понятна разница.

oleg70
rual:

Статья для доцентов, много математических выкладок и наукообразия.

Этот “фильтр” уже давно свободно лежит в сети, и по моему, ничто иное как код “free_imu” от Фабио Варесано на кватернионах в двух реализациях (почти похожих) от Магвика и Махони…

rual:

Статья для доцентов, много математических выкладок и наукообразия

Теория красивая … но у меня на практике этот MARG так и заработал как надо из за магнитометра, который должен быть практически идеально откалиброван иначе вносил погрешности в крен и тангаж из-за “слияния” кватернионов… По факту нормально работает только гира+аксель…

rual
oleg70:

из за магнитометра, который должен быть практически идеально откалиброван иначе вносил погрешности в крен и тангаж из-за “слияния” кватернионов…

Вот как раз этот момент в моём алго исправлен, магнитометр на крен и тангаж никак не влияет. Коррекция выполняется синусами проекции вектора магнитометра на предполагаемую мировую плоскость Oxy. Плюс корректировка акселя по ГПС и и барику.

SergDoc
rual:

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

Ты чего? вшиско едно, ты берёшь локальные координаты (дус аксель ) и доворачиваешь до глобальных (компас…) - вот она матрица поворота, а где глубинный смысл глобальные координаты доворачивать до локальных? потеряться в пространстве?
Хотя… как сказал Энштейн - “всё относительно”, где наш астронавигатор пропал? Дринкер, что ты на это скажешь?

oleg70
rual:

Плюс корректировка акселя по ГПС и и барику

А вот это мне не понятно… имеется ввиду наверно вертикальное ускорение ? , но как можно скорректировать более точный датчик менее точными ? (шум баро полметра высоты а у ГПС и того больше)

SergDoc
oleg70:

но как можно скорректировать более точный датчик менее точными ?

всё зависит в каких пропорциях мешать 😃 может получиться спирт с водой, может вода со спиртом, а может и водка )))

oleg70
SergDoc:

всё зависит в каких пропорциях мешать может получиться спирт с водой, может вода со спиртом, а может и водка )))

Очень смахивает на алхимию… типа - взяли свинец, добавили немного гов**ца, получили золото… 😃

SergDoc

Хуже, коэффициенты влияния ещё нужно автоматически менять в зависимости от различных факторов, типа выход датчика из мат ожидания или например высоты аппарата над землёй…

rual
SergDoc:

ты берёшь локальные координаты (дус аксель ) и доворачиваешь до глобальных (компас…) - вот она матрица поворота, а где глубинный смысл глобальные координаты доворачивать до локальных?

Всё верно, так и делаю, только нет у меня матрицы поворотов, есть кватернион. А насчет докрутки до локальных, дык это мои догадки, но судя по описанному поведению некоторые платформы (читал про “немцев”) используют именно локальное представление.

SergDoc:

Хуже, коэффициенты влияния ещё нужно автоматически менять в зависимости от различных факторов, типа выход датчика из мат ожидания или например высоты аппарата над землёй…

Вот с этим проблемы, надеюсь пока 😃

oleg70
rual:

Вот с этим проблемы, надеюсь пока

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

SergDoc
rual:

нет у меня матрицы поворотов, есть кватернион.

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

oleg70:

А у каких известных проектов такие алгоритмы работают ?

у Саши маховика ))) в маховие - заметьте на атмеге )))

rual
SergDoc:

лин, ну как их там - управляющие косинусы - это и есть матрмца поворота или матрица управляющих косинусов, ну или кватернион - один хрен)))

Неа, интерпретация поворота в них разная.

SergDoc:

в екф чем прикольно

Ты с ним разобрался? Запустил?

SergDoc:

в маховие - заметьте на атмеге )))

Хочу тоже поэкспериментировать с арду, чисто ради почёса ЧСВ 😃 Придумал примитивный алго стабилизации (изобрел велосипед), предположительно такой же в “немцах” используется, ну и в кетайских игрушках. В нем вообще нет ни кватернионов и ни матриц, тупая рефлексия на ПИДах. Но качество стабилизации и скорость обработки должны быть высокими.

На чем то более производительном относительно арду, запускать его смысла нет, теряется вся “прелесть” 😃

SergDoc

Матрица поворота или матрица направляющих косинусов тынц и далее по тексту "Выражение матрицы поворота через кватернион", ты же всё равно доворачиваешь их используя… или ты через арккосинусы арктангенсы разворачиваешь?

rual:

В нем вообще нет ни кватернионов и ни матриц, тупая рефлексия на ПИДах. Но качество стабилизации и скорость обработки должны быть высокими.

КК2 с акселем который, но помнится он на ассеме…

rual:

Ты с ним разобрался? Запустил?

всё в руинах, платы спрятаны от греха подальше 😃 боюсь только к осени доберусь… там в гите у меня датчики запущены, алгоритм запущен, что-то с настройками не так, как только аксель калибруешь - висяк вечный… надо разбираться, кстати у опенпилотов rcopen.com/blogs/74247/19886 калибровка акселя понравилась - можно даже не на ровной (не в горизонте) плоскости откалибровать, а вот с компасом намудрили, даже в деревянном доме нормально не калибруется - надо на улице - точек мало собирает, а ещё gps надо обязательно (акселю тоже) по данным жпс выводит склонение и гравитацию в данной точке…

okan_vitaliy

Всем привет. Имеется проблема. В инете ответа не нашел. Поэтому спрошу здесь у уважаемых коллег. Есть 407 процик. Подключен к нему через fsmc дисплей ssd1963(800x480). Имеется флеш память w25q128?, повешенная на spi1. Хотелось бы использовать dma для пересылки картинок на дисплей.
При выводе на экран получается, как будто на каждый байт принимаемый из spi принимается еще один байт и отправляется в дисплей. В итоге картинка в 2 раза больше и цвет конечно неправильный. Пробую из spi1 to Ram, а затем из Ram to Fsmc- по все отлично работает, но скорость увы падает. Заранее благодарю за помошь. Процедуру отправки прилагаю.

void stm32_dma_transfer( uint32_t Len )
{
uint32_t rw_workbyte[] = { 0xffff };
DMA_InitTypeDef DMA_InitStructure;
SPI_Cmd(SPI1, DISABLE);
DMA_DeInit(DMA2_Stream2);
DMA_DeInit(DMA2_Stream3);
while (DMA_GetCmdStatus(DMA2_Stream2) != DISABLE){}
while (DMA_GetCmdStatus(DMA2_Stream3) != DISABLE){}
DMA_InitStructure.DMA_Channel = DMA_Channel_3;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)(&(SPI1->DR));
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_PeripheralInc= DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_BufferSize = Len;
DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
DMA_InitStructure.DMA_Memory0BaseAddr =0x60020000;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_Init(DMA2_Stream2, &DMA_InitStructure);
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)rw_workbyte;
DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_Init(DMA2_Stream3, &DMA_InitStructure);
DMA_Cmd(DMA2_Stream2, ENABLE);
DMA_Cmd(DMA2_Stream3, ENABLE);
SPI_Cmd(SPI1, ENABLE);
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx, ENABLE);
while (DMA_GetFlagStatus(DMA2_Stream2,DMA_FLAG_TCIF2) == RESET) { ; }
DMA_Cmd(DMA2_Stream2, DISABLE);
DMA_Cmd(DMA2_Stream3, DISABLE);
SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Rx | SPI_I2S_DMAReq_Tx, DISABLE);
DMA_ClearFlag(DMA2_Stream2,DMA_FLAG_TCIF2);
DMA_ClearFlag(DMA2_Stream3,DMA_FLAG_TCIF3);

}

strizhmax
okan_vitaliy:

DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

я бы поковырялся в этом направлении