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

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;

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

okan_vitaliy
strizhmax:

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

Я в нем как раз и ковырялся, но выхода годного пока нет. Думал может кто то напрямую уже лил картинки и это работает. Короче буду копать дальше. Есть идея на время дма транзакции спиай переводить в 16 битный режим. Нужно попробовать сегодня.

rual
okan_vitaliy:

Всем привет. Имеется проблема. В инете ответа не нашел.

Мне лично вот это не понятно:

DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
DMA_Init(DMA2_Stream3, &DMA_InitStructure);

картинка в одной ячейке памяти находится? Чтоб выгрузить массив из ОЗУ надо включить инкремент.

okan_vitaliy
rual:

Мне лично вот это не понятно:

картинка в одной ячейке памяти находится? Чтоб выгрузить массив из ОЗУ надо включить инкремент.

Картинка принимается из спи и отправляется через fsmc на дисплей. Проблему решил - расширил спи до 16 бит и все поехало. Экран заливается за 150 мс. Причем если заливать из внутреннего флеша , то за 73мс . Так что проблему решил.

rual
okan_vitaliy:

Картинка принимается из спи и отправляется через fsmc на дисплей.

Собственно наверно в этом проблема и была - синхронизация 2 потоков ПДП.

alexeykozin

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

rual
alexeykozin:

идея системы стабилизации.
мультиротор в форме гриба.

Алексей, в чем новизна? Собсно все игрушечные верты на этом принципе построены, за исключением того, что у них автомат перекоса.

alexeykozin
rual:

Алексей, в чем новизна? Собсно все игрушечные верты на этом принципе построены, за исключением того, что у них автомат перекоса.

маштаб наверное только.
возможно будет экономичнее изза отсутствия необходимости перегазовок для достижения стабилизации
возможно использовать один или несколько двс

rual
alexeykozin:

возможно будет экономичнее изза отсутствия необходимости перегазовок для достижения стабилизации

Дык это ничего не мешает делать в классической схеме коптера - ЦТ максимально вниз. Уменьшит перегазовки - увеличит КПД. Единственный минус - снижение манёвренности, но это актуально только для мелких, для которых КПД не так важен.

alexeykozin:

возможно использовать один или несколько двс

Это уже сложно, дорого и сильно специфично - проще использовать ДВС-вертолет.