MultiWii

mahowik
SovGVD:

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

тут согласен…

Итог:

  1. для ВИИ: фильтр губит быстродествие, но при разумных значениях может помочь в борьбе с вибрациями.
  2. в пирате: низкие значения фильтра “совместимы” с временем цикла обработчика без ущерба для быстродействия системы. Т.е. тут от фильтра больше пользы в плане борьбы с вибрациями.

Ну и если совсем кратко то вии более шустрый, но чувствмтельный к вибрациям, а пират не такой шустрый, но более терпимый к шумам-вибрациям за счет филтров низких частот.

alexmos

Не знаю, меня мультивий в плане стабильности очень радует. Я поковырял его в части IMU (было интересно попробовать добавить реакции на линейные ускорения и перемещения), и непохо разобрался в его алгоритмах стабилизации. Так вот, они довольно точны и мат. модель IMU хорошо описывет все перемещения, особенно в связке с акселерометром и компасом. Единственное, нужно четко представлять что как подстраивать и триммировать, т.к. сам он это не умеет.
Насчет вибраций - по моему их влияние сильно преувеличено. Гироскоп их практически не видит, т.к. они не угловые, акселерометр видит, но он хорошо сглажен в коде и его вклад только в низкочастотных областях (видеть землю для корректировки дрифта гироскопа).

Замечания по своим ошибкам “обращения” с мультивием:

  1. при включении он калибрует ноль гироскопа. Т.к. я включаю втыканием питания в батарею, в этот момент возможны толчки. И потом его очень неслабо тянет в крен. Сделал задержку в 3 сек. чтобы успеть убрать руки.
  2. Акселерометр в левел- моде надо ТРИММИРОВАТЬ ОБЯЗАТЕЛЬНО. иначе никакими ручками на пульте не выставишь стабильность. Это можно сделать один раз, он сохраняет настройку.
  3. Добавил Expo для Throttle в коде, т.к. мой дешевый пульт не позволял точно удержать высоту, постоянно вверх-вниз колбасило. Теперь высота держится элементарно.
soliada
alexmos:
  1. при включении он калибрует ноль гироскопа. Т.к. я включаю втыканием питания в батарею, в этот момент возможны толчки. И потом его очень неслабо тянет в крен. Сделал задержку в 3 сек. чтобы успеть убрать руки.
  2. Акселерометр в левел- моде надо ТРИММИРОВАТЬ ОБЯЗАТЕЛЬНО. иначе никакими ручками на пульте не выставишь стабильность. Это можно сделать один раз, он сохраняет настройку.
  3. Добавил Expo для Throttle в коде, т.к. мой дешевый пульт не позволял точно удержать высоту, постоянно вверх-вниз колбасило. Теперь высота держится элементарно.

Здравствуйте,не могли бы Вы подробней описать, что и куда дописали в коде?

how-eee
alexmos:
  1. при включении он калибрует ноль гироскопа. Т.к. я включаю втыканием питания в батарею, в этот момент возможны толчки. И потом его очень неслабо тянет в крен. Сделал задержку в 3 сек. чтобы успеть убрать руки.
  2. Акселерометр в левел- моде надо ТРИММИРОВАТЬ ОБЯЗАТЕЛЬНО. иначе никакими ручками на пульте не выставишь стабильность. Это можно сделать один раз, он сохраняет настройку.
  3. Добавил Expo для Throttle в коде, т.к. мой дешевый пульт не позволял точно удержать высоту, постоянно вверх-вниз колбасило. Теперь высота держится элементарно.

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

упс… одинаково мыслим =)

alexmos

Задержка калибровки:

MultiWii.pde, setup():
...
  initSensors();
  //wait 3 seconds before start calibrating
  delay(3000);
  previousTime = micros();
..

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

Sensors.pde, GYRO_Common():
...
      if (calibratingG == 1) {
        gyroZero[axis]=g[axis]/40;
...
  for (axis = 0; axis < 3; axis++) {
    gyroADC[axis] = (int32_t)(gyroADC[axis] * 10 - gyroZero[axis])/10;
...

Throttle-expo описан тут: www.multiwii.com/forum/viewtopic.php?f=7&t=623

mahowik
alexmos:

Задержка калибровки

я обычно калибровку делаю с пульта когда коптер включен и стоит стабильно…

alexmos:

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

в мультивии почти нет вычислений с плающей запятой, т.к. это увеличивает время цикла… можете конечно предложить на вийском форуме, но думаю алексВпариже & зисс_дм вам примерно тоже скажут 😃

alexmos:

Добавил Expo для Throttle в коде, т.к. мой дешевый пульт не позволял точно удержать высоту, постоянно вверх-вниз колбасило. Теперь высота держится элементарно.

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

P.S. всего лишь рассуждения, на истину не претендую, потому давайте спорить 😃

alexmos:

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

в теории и на стенде так и есть (т.е. в ГУИ все красиво, до включения моторов хотяб на пол газа), НО на практике дешевые аксели видимо сходят с ума от вибраций и сами показания уже не правильные, какие фильтры не прикручивай… тут уже специфика МЕМС чипов наверное, т.е. есть предел вибраций по идее…

alexmos
mahowik:

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

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

mahowik:

в мультивии почти нет вычислений с плающей запятой, т.к. это увеличивает время цикла

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

mahowik:

думаю был бы и на тротл еслиб он был универсален на все конфигируции

Согласен, мой вариант надо немного сконфигурировать. Опять же посмотрите на добавку кода в config.h, там я предлагаю померять показания отрыва от земли и выставить центр экспоненты в эту точку (параметр THROTTLE_HOVER). Но результат стоит того. И кстати, если у вас есть подстройка кривой в самом пульте, вам также придется сначалаа померять точку отрыва, чтобы правильно нарисовать кривую.

mahowik:

в теории и на стенде так и есть (т.е. в ГУИ все красиво, до включения моторов хотяб на пол газа), НО на практике дешевые аксели видимо сходят с ума от вибраций и сами показания уже не правильные

Если хороший гиро, то можно посоветовать уменьшить вклад акселерометра в нахождение вектора ориентации. Попробуйте увеличить параметр в IMU.pde

#define GYR_CMPF_FACTOR 310.0f

Но надо смотреть по гафикам, насколько сильно уплывают показания гироскопа без акселерометра (для проверки поставьте GYR_CMPF_FACTOR 10000.0f).

juniorluck

Вот и мне пришли 2 платки ALLINONE, в конверте была вложена распиновка только для одной платы, а вот для этой 5V c GPS небыло… может кто подскажет распиновку или как её подключить?..

soliada
alexmos:

Задержка калибровки

Спасибо,ИМХО очень полезная функция.Лично меня напрягала калибровка с пульта,включить не не “встряхнуть”,особенно при микро размере коптера,очень сложно.

alexmos:

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

Попробовал.Признаться не заметил ни какой разницы в поведении,видимо размерность тоже имеет свое значение.

mahowik
alexmos:

А можно сделать и задерджку, по моему так удобнее.

согласен… предложите чтобы включили в прошивку и по желанию можно было отключить/включить

alexmos:

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

виноват… все верно, только вот судя по коментам в коде у гиры диаппазон +/- 8192, т.е. дадут ли тут десятые что либо? если практическая польза есть то можно и до сотых тогда посчитать, т.е.

Sensors.pde, GYRO_Common():
 ...
   if (calibratingG == 1) {
       gyroZero[axis]=g[axis]/4;
...
   for (axis = 0; axis < 3; axis++) {
       gyroADC[axis] = (int32_t)(gyroADC[axis] * 100 - gyroZero[axis])/100; ...

только gyroZero сделать 32 бита

alexmos:

Согласен, мой вариант надо немного сконфигурировать. Опять же посмотрите на добавку кода в config.h, там я предлагаю померять показания отрыва от земли и выставить центр экспоненты в эту точку (параметр THROTTLE_HOVER). Но результат стоит того. И кстати, если у вас есть подстройка кривой в самом пульте, вам также придется сначалаа померять точку отрыва, чтобы правильно нарисовать кривую.

изучу и отпишусь обязаточно! кстать если выставить точку отрыва в центр экспоненты, этож получится что “плавная” часть газа будет только на снижение, а увеличение газа как раз “резкое” по экспоненте (т.е. на подъем)… Я же себе представлял, что точка отрыва должна быть примерно в первой трети экспоненты для того чтобы его проще было держать в соостоянии висения (равновесия т.е.). Поясните тут пожалуйста. Хотя тут же начал думать что так и надо 😃 т.е. уменьшение газа плавное для снижения, увеличение газа как раз резкое чтобы “подхватывать” при снижении проще было… или все не так? 😃

alexmos:

Если хороший гиро, то можно посоветовать уменьшить вклад акселерометра в нахождение вектора ориентации. Попробуйте увеличить параметр в IMU.pde

alexmos:

Но надо смотреть по гафикам, насколько сильно уплывают показания гироскопа без акселерометра (для проверки поставьте GYR_CMPF_FACTOR 10000.0f).

буду пробовать, но не раньше чем через неделю-две…

alexmos
mahowik:

только вот судя по коментам в коде у гиры диаппазон +/- 8192

Это максимальные значения при довольно сильных угловых скоростях (кстати занженные в MultiWii, изначально гира выдает почти что полные int16). В нормальной работе гира выдает данные недалеко от нуля. И мы прбавляем каждый раз измеренный средний ноль. И если там сидит ошибка к примеру 0.5, она быстро накапливается при интегрировании. Но это опять же силно зависит от гиры, на моей одна ось попадает в ноль точно, а вот вторая убегает быстро с округленным нулем. После ввода десятых становится стабильной как и первая. Вводить сотые смысла нет, ноль не на столько стабилен и там уже шум больше чем сотые.
Была мысль убрать деление на 4, чтобы ещё повысить точность, но тогда надо пересматривать всю арифметику на предмет переполнений, и мержиться с SVN будет сложно.

mahowik:

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

Нет, и на подъем и на снижение будут плавные части. Хотя и говорится про одну экспоненту, на самом деле их две (как и на ручки наклонов), соединенных в своей нулевой точке. С такой кривой мы быстро выбираем нерабочие участок до отрыва, затем плавно идет в районе отрыва и далше, и потом быстро растет до максимального газа.

И кстати посморите на второй параметр SHIFT_HOVER. Если у вас отрыв идет на 2/3 газа, то есть возможность сместить его в 1/3 и больший диапазон использовать для полета.

commy_s
juniorluck:

Вот и мне пришли 2 платки ALLINONE, в конверте была вложена распиновка только для одной платы, а вот для этой 5V c GPS небыло… может кто подскажет распиновку или как её подключить?..

Cкан от 3.3V. на 5 вольтовой поменяны местами RX и TX.

juniorluck

Небольшая инфа, списался с производителем этих плат… Он сказал что 3,3V платы можно питать от 5V на плате есть стабилизатор.

Олег, большое спасибо!

juniorluck

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

Boev_Dmitry
juniorluck:

чтоб каждый датчик отдельно проверить на плате ALLINONE

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

sulaex
Covax:

какие датчики на ней стоят

слевой стороны стоит микруха гироскопа ITG3200 (или аналогичных), полностью совпадает с даташитом

справа стоит датчик очень похожий на BMA180

даташит на BMA180

ЗЫ кстати, очень интересный вариант платки мультивия квадро с пятью каналами, ничего лишнего, процессор, датчики, питание датчиков на 3.3 вольта, наверное не дорого стоит? где такое можно приобрести?

soliada
Covax:

Друзья, а что это за платка и какие датчики на ней стоят, кто знает?

100% Хэнд-Мэйд.Кто-то просто развел и изготовил себе и вероятно еще и друзьям перепало.

pnm

Подскажите у меня nunchuck включен или нет. Если нет, не подскажите как его включить? Начинаю поднимать коптер, он переворачивается. Калибровки все сделал.

MultiWiiV1_7_nunchuck_mega_16.rar