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

ivereninov

Показания и будут плыть.Это абсолютно нормально, супер результат - 1 градус в минуту.Почти не достижимо. Чуть улучшает ситуацию оверсэмплинг, то есть многократное повторное чтение ADC и последующее усреднение значений, можно увеличить таким образом разрешение. Но для нормальной стабилизации по углу нужно делать фьюжн нескольких сенсоров.
И не стоит делать так dtime/1000 , dtime/1000.0 позволит избежать трудновылавливаемых багов.

SergDoc

соскакивает именно первый просчёт угла - время большое, может попробовать так:

если dt>100 то угол=угол (тоесть 0) иначе gyroXangle=gyroXangle+gyroXrate*dtime/1000.0; ?

я просто пока притормозил выполнение перед снятием показаний, время > 600

далее время <20

SergDoc

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

ivereninov

То есть Вы уже интегрируете и у изменения угла такая большая задержка?А чем меряли? У нас с Вами очень близкие проекты, меня всегда можно найти в
Skype : ivereninov

SergDoc

Я слегка погорячился, это у меня так по всей видимости просто Com с Serial monitor подтормаживают было также пару глюков, мог фильтр не стартонуть, сейчас вроде всё более менее, платка лежит уже полчаса, углы считает пока тьфу-тьфу без сбоев:) вот на данный момент последняя версия расчётов

Кстати возникла идея на счёт КУКа и акселерометра , считаем угол из показаний акселерометра делим на Dt получаем якобы угловую скорость ну естественно PID для сопоставления данных, применяем альфа-бета фильтр(довольно простой и маленький) - подставляем далее в куковские расчёты и наблюдаем за аппаратом😁 ?

с куком есть одна проблема все таймеры заняты а при чтении по SPI нужно прерывание таймера:(

funtik26

Cергей а если упростить задачу- сделать стабилизацию по след алгоритму- приемник- аксель- кук, то есть сигнал с приемника подмешивает данные с акселя, а уже туда подмешивает данные с платы кука, то есть у вас получается обычный кук, но с акселем, , да получится громоздко, но это на первое время
давно такое предлагал сделать для трикоптера, без платы кука
приемник- аксель- гира на каждый луч. аксель независимо от гироскопов высчитывает уплывание горизонта и подмешивает сигнал, а гироскопы отрабатывают мгновенные колебания. здесь так же можно сделать только вместо гир на кждый луч- будет плата кука.
система в будущем получится модульной с удобно настройкой

ivereninov

А как реализуется определение углов от акселя при наличии линейных ускорений? Просто при сумме по всем осям = g ?

funtik26

а как напряжение на выходах у акселя и гир перевести в углы? в даташитах же написано какое напряжение на выходах акселя при определенных углах, у гир напряжение зависит от ускорения, как все это перевести в математику я не знаю

SergDoc

ну вопервых, напряжение на аналоговых выходах - индикатор измеряемого параметра который можно померять и перевести в понятные для математики цифирки, а вот дальше считать, считать и считать
гироскопы:
gyronoXadc = analogRead(gX); //считали данные с выхода гироскопа

gyroXadc = (gyronoXadc * FI) + (gyroXadc * (1.0 - FI)); // ну тут слегка фильтронули
gyroXrate = (gyroXadc-gyroZeroX)*2.4; //2.4 это =(Aref/1023)/0.67 0.67-чувствительность гироскопа mV/deg/sec собственно угловая скорость= (показания - нулевыепоказания)*2.4
gyroXangle=gyroXangle+gyroXrate*dtime/1000; // собственно интегрирование угол = угол предыдущий + угловая скорость * делта t (время между двумя цыклами расчёта)

акселерометр:

R = sqrt(pow(accXval,2)+pow(accYval,2)+pow(accZval,2));//расчёт длинны вектора)
accXangle = acos(accXval/R)*RAD_TO_DEG-90; // расчёт угла между вектором и осью X акселерометра arccos(проекция вектора ускорения свободного падения/ длинна вектора)* перевод из радиан в градусы
accYangle = acos(accYval/R)*RAD_TO_DEG-90;

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

SergDoc

Слабо гироскопы местами перепутать😁

ivereninov

так а как у Вас реализована защита от наличия линейных ускорений?Они же будут “портить” угол.

SergDoc

Основные расчёты берутся именно с гироскопов, а для коррекции показания с акселерометра именно через альфа-бета фильтр,

compAngleX = (0.98*(compAngleX+(gyroXrate*dtime/1000)))+(0.02*(accXangle));
compAngleY = (0.98*(compAngleY+(gyroYrate*dtime/1000)))+(0.02*(accYangle));
его ещё комплиментарным называют,

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

надо наверно гироскопы запитать всё-таки 5ю вольтами и переделать общение по i2c с акселерометром

о а нафига я два раза угод с гир расчитываю😵

SergDoc

попробова считать углы с акселя через atan2

accXangle = atan2(accZval,accXval)*RAD_TO_DEG+135;
accYangle = atan2(accZval,accYval)*RAD_TO_DEG;
почему-то так только получается

похоже аксель я доканал - глючит

SergDoc

чёт с переменными нето знак я всётаки гдето теряю

SergDoc

Ну вот последнее на чём остановился, по крайней мере углы правдоподобные

accXangle = -atan2(-accXval,-accZval)*RAD_TO_DEG;
accYangle = -atan2(-accYval,-accZval)*RAD_TO_DEG;

теперь буду каким-то образом прошивку добивать (управление, шымы, настройки и т.п.)…

ivereninov

а теперь представьте, что коптер резко начинает изменять высоту.Что будет с углом от акселя?

SergDoc

перевернётся, я уже модуль ввожу для Z, остаётся только -90 +90 сейчас воюю с ним

У меня оказывается и стол шатается и переворачивается даже😵

Сейчас решаю проблему
либо коэффициент силы трения лыж с асфальтьм слишком высокий, либо коэффициент моего интеллекта слишком низкий😁

покрайней мере уже в чужом коде разбиратся начал…

ivereninov

Мне кажется разумным следующий аглоритм.
1.Проверяем что сумма ускорений по всем осям=g.
2.Если так, то обнуляем ошибку интегрирования от гироскопов.

Вопрос лишь в вероятности ситуации, когда сумма ускорений будет g , но коптер будет ускоряться…надо посчитать…

SergDoc
ivereninov:

Вопрос лишь в вероятности ситуации, когда сумма ускорений будет g , но коптер будет ускоряться…надо посчитать…

Падать боком както так, или крутится волчком и снижатся…

я вот чё немогу понять:

i2c_ADXL345_getRawADC();
accADC[PITCH] = ((rawADC_ADXL345[1]<<8) | rawADC_ADXL345[0]);
accADC[ROLL] = - ((rawADC_ADXL345[3]<<8) | rawADC_ADXL345[2]);
accADC[YAW] = - ((rawADC_ADXL345[5]<<8) | rawADC_ADXL345[4]);

это из вия все переменные rawADC unsigned как там чё получается

а углы както так

Axz = atan2(RxEst,RzEst) + a;
Ayz = atan2(RyEst,RzEst) + b;

где a и b это получается угловые скорости (если я правильно понял) с гир…

интересно следующее - я могу отключить в акселе g как факт тогда он меряет ускорения по осям без учёта g вот если бы наоборот😁

alextr

Подскажите как получается горизонт (вертикаль), что то не могу понять.

SergDoc

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

alextr:

вертикаль

всмысле по курсу? пока никак нечем отследить кроме гироскопа - только если по угловой скорости пока как в КУКе, а так магнитометр нужен

а если хе крен и тангаж то atan2 возврашает значение угла между горизонтом и осью по которой считаеи X или Y