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

mahowik
rual:

Александр, покажи скрины с идикатора, хочу посмотреть какой вектор кажет магнитометр.

на вых-х сделаю… а то вчера дрюкался со стабилизацией предсказателя высоты… таки стабилизировал его гада! 😃

SergDoc:

Да, Вопрос - в какую религию обращать? MultiWii пробовал, CC - тоже летал… конечно субъективное мнение, но Wii понравился больше: код более понятен (ну не программер я) и танцев с бубном и I2C не было, но ведь кругом ещё столько опенсорсных вариантов…

посмотри mwc-ng от ziss_dm у него там правильная архитектура заложена… кросплатформенность avr/arm, tasks management with fixed time loop наскока помню…
code.google.com/p/mwc-ng/

SergDoc

Примерка:
примека принесла две новости

  1. Всё сошлось - можно плату изготавливать:)
  2. Барометр с гудлака оказался паяный 😦 (до этого времени не распаковывал)

rual
SergDoc:

Всё сошлось - можно плату изготавливать

Красиво. Какой софт портировать будешь? Когда ждать первый полет?

SergDoc:

Барометр с гудлака оказался паяный (до этого времени не распаковывал)

Интересно, он не в заводской упаковке? Мож предпродажная проверка?

SergDoc

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

mahowik
rual:

Кста, Александр, покажи скрины с идикатора, хочу посмотреть какой вектор кажет магнитометр.

отлично компас отрабатывает! никуда не скачет при наклонах… и это без калибровки? точненькА юг север запад восток показывает!
я так понимаю у тебя автокалибровка компаса сделана? т.к. на команду “c” по идее только гира и аксель калибруется…

только один баг странный, иногда гуй подвисает на 1-3 сек, потом оклемается и дальше пашет…

rual

Ты получается ближе меня к “магнитному пупу” Земли, судя по вектору )))

mahowik:

отлично компас отрабатывает! никуда не скачет при наклонах… и это без калибровки?

Да, это без калибровки. Особо не вижу в этом смысла, по кругу расхождение в максимумах единицы градусов.

mahowik:

я так понимаю у тебя автокалибровка компаса сделана? т.к. на команду “c” по идее только гира и аксель калибруется…

нет, автокалибровки нет. Пробовал делать, но мне не понравилась, т.к. случайные выбросы смещают центры и масштаб осей. Клибровку компаса надо делать в услових близким к идельным, но как писал выше смысла не вижу… По команде “с” делается клибровка ДУС в части постоянных дрейфа осей, калибровка акселя тут не правильная (это не страшно если оси пропорциональны и отцентрованы), выполняется только замер средней магнитуды вектора G. Нужна была для экспериментов с измерением акселем линейных перемещений.

mahowik:

только один баг странный, иногда гуй подвисает на 1-3 сек, потом оклемается и дальше пашет…

Проблема в функциях millis() и micros(), надо заменить их на это hw_config.c

__IO uint16_t Sys_time_ms;
__IO uint8_t SysTime_256;
uint16_t millis(void)
{
 Sys_time_ms = (((uint32_t)~SysTick->VAL>>16)&0x0ff)|((uint16_t)SysTime_256)<<8;
 return Sys_time_ms;
}

hw_config.h

#define SysTick_Reload (uint32_t)0x00ffffff
#define micros() ((uint16_t)~SysTick->VAL>>3)
extern __IO uint16_t Sys_time_ms;
extern __IO uint8_t SysTime_256;
uint16_t millis(void);

stm32f30x_it.c

void SysTick_Handler(void)
{
 if (inLoop){
  /* àâàðèéíûé çàïðîñ ÄÓÑà */
  if (GPIO_ReadInputDataBit(L3GD20_SPI_INT2_GPIO_PORT,L3GD20_SPI_INT2_PIN)==Bit_SET)
   if(EXTI_GetITStatus(L3GD20_SPI_INT2_EXTI_LINE)==RESET)
    if (cntDUSRdy--==0){
       cntDUSRdy=5;
       DUS_Zapros();
    }
  /* àâàðèéíûé çàïðîñ àêñåëÿ */
  if (GPIO_ReadInputDataBit(LSM303DLHC_I2C_INT1_GPIO_PORT,LSM303DLHC_I2C_INT1_PIN)==Bit_SET)
   if(EXTI_GetITStatus(LSM303DLHC_I2C_INT1_EXTI_LINE)==RESET)
    if (cntAccRdy--==0){
     cntAccRdy=20;
     Acc_Zapros();
    }
 }
 /* ñèñòåìíîå âðåìÿ */
 SysTime_256 ++;
 Sys_time_ms = (((uint32_t)~SysTick->VAL>>16)&0xff)|((uint16_t)SysTime_256)<<8;
}
Sir_Alex

Кто нибудь знает, какие есть критерии при выборе частоты LPF фильтра гиры и акселя?
Я пока только одно упоминание увидел более-менее вразумительное, в исходниках ArduCopter’a: “Частота LPF выбирается в два раза меньше SAMPLE Rate”

rual
Sir_Alex:

“Частота LPF выбирается в два раза меньше SAMPLE Rate”

Это классика, следствие из теоремы Котельникова.
Вполне справедливо, нужно чтобы отсчёты не “пролетели” мимо обработки.

Sir_Alex
rual:

Это классика, следствие из теоремы Котельникова. Вполне справедливо, нужно чтобы отсчёты не “пролетели” мимо обработки.

Как теорему Котельникова применить к обработке Аналогово сигнала я знаю.
Sample Rate тут по всей видимости никаким боком (Это частота на которой обновляются регистры с выходными данными). Потому что гира на самом деле оцифровывается с частотой 1KHz или 8KHz (для MPU6000). Если я правильно понимаю, LPF отсеивает вибрации ниже определенной частоты. Вопрос только в том, какие частоты в виде помех обычно бывают на коптере. Отсюда видимо и надо плясать при выборе LPF (и возможно HPF).

Надо попробовать написать тулзу, для вывода графика FFT и подбора значений фильтра по нему. Причем при работающих моторах…

HikeR
Sir_Alex:

при работающих моторах…

моторы обычно не вращаются с одной и той же скоростью, особенно когда их несколько ;)

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

Sir_Alex
HikeR:

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

AP_InertialSensor_MPU6000.cpp:

    // sample rate and filtering
    // to minimise the effects of aliasing we choose a filter
    // that is less than half of the sample rate
HikeR:

моторы обычно не вращаются с одной и той же скоростью, особенно когда их несколько 😉

Логично, поэтому надо строить график при Throttle от нуля до 100%.

HikeR
Sir_Alex:

AP_InertialSensor_MPU6000.cpp:

о, эту штуку недавно добавили только в ArduPlane, но это скорее обычное усреднение, чем какой-то специальный ФНЧ или ФВЧ, суммируем N значений и делим на N. для самолетов, мол, хватает.

Sir_Alex:

строить график при Throttle от нуля до 100%.

это если мотор один, а как складывать гармоники будете от четырех-восьми работающих вразнобой?

p.s.
все-таки почитал вдумчивее, это действительно LPF, который имется в MPU6000 (цифровой встроенный), invensense.com/mems/gyro/…/RM-MPU-6000A.pdf страница 13-14. судя по временной задержке ничего сложнее усреднения там нет.

Sir_Alex
HikeR:

это если мотор один, а как складывать гармоники будете от четырех-восьми работающих вразнобой?

Вразнобой как раз и будет интересно анализировать, т.к. они будут резонировать на каких то частотах, где один работающий мотор не даст вообще никаких помех.
Т.е. в теории будет так: “плавно поднимаем газ от 0 до 100, при этом на графике FFT отмечаются максимумы, после этого меняем частоты LPF и HPF и повторяем тест до тех пор, пока не избавимся от помех от моторов”.

mahowik
Sir_Alex:

Кто нибудь знает, какие есть критерии при выборе частоты LPF фильтра гиры и акселя?

в вие я на этом собаку сьел! 😃

внутренние LPF:

  1. гира 42гц - если для умеренных и быстрых полетов
    гира 20гц - для авто полетов, фпв и начнающих летунов
    Не смотря на довольно низкие значения скорости гир вполне хватает для четкой стабилизации и отброса вибраций…
  2. аксель 5-10гц - при условии что внутреннее усреднение сделано по нормальному в чипе, т.е. при понижении LPF не уменьшается самплиннг… т.к. к примеру в какашечном adxl345 сделано именно уменьшением самплинга…

внешние/алгоритмические LPF:

  1. гира - не трогаем 😃
  2. аксель - душим на 0.1-0.5гц, т.е. оставляем его скорость сходной со скоростью “корректора”… в вие это компл. фильтр, в арду dcm, но сути не меняет…
Sir_Alex
mahowik:
  1. гира 42гц - если для умеренных и быстрых полетов гира 20гц - для авто полетов, фпв и начнающих летунов Не смотря на довольно низкие значения скорости гир вполне хватает для четкой стабилизации и отброса вибраций… 2) аксель 5-10гц - при условии что внутреннее усреднение сделано по нормальному в чипе, т.е. при понижении LPF не уменьшается самплиннг… т.к. к примеру в какашечном adxl345 сделано именно уменьшением самплинга…

Эммм… так вроде в MPU, LPF выставляется одновременно для Гиры и Акселя.
Посмотрим какие будут отзывы о мерапирате 2,9 - там можно выбрать частоту LPF…

mahowik

еще оч. важный параметр акселя это внутр. диапазон акселя… нужно брать 8-16g, иначе от вибраций и внутренних резонансов на этих самых вибрациях может происходить перенасыщение внутреннего АЦП акселя и тогда уже никакие внутр/внешн. фильтры и матеметика не помогут… типа как синусоида режется в меандр с диким расширением спектра гармоник…
в вие пока не доперли до этого, мучались с дрейфами в став/левел моде ибо “на столе” все пахало, а полете всплывало…

Sir_Alex:

Эммм… так вроде в MPU, LPF выставляется одновременно для Гиры и Акселя.

ну да, я тоже задавался этом вопросом, но в даташит так и не залез… оставил на 42-20гц + внешний НЧ для акселя…

HikeR
mahowik:

при понижении LPF не уменьшается самплиннг

неужто есть такие волшебные датчики??

mahowik:

нужно брать 8-16g

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

SergDoc
HikeR:

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

при переполнении плюс на минус поменяется 😦

mahowik
HikeR:

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

я не зря написал про внутренние резонансы самого акселя… дело скорее всего именно в них, т.к. тоже недоумевали откуда вибрации могут быть в таких кол-вах G…
но это уж факт, проводили тесты, спектр. состав смотрели и т.д… я делился подобными мыслями с vis.asta, так он подвердил тоже самое, что допер до этого уже год назад и у него 8g… а как у него летает, думаю все видели 😃
что до падения разрешения, то в норм. акселях даже при 8-16g это от 512 и выше, т.е. с головой т.к. нелинейность самих осей даст больше погрешности в разы…