Создание собственной системы стабилизации
Александр, покажи скрины с идикатора, хочу посмотреть какой вектор кажет магнитометр.
на вых-х сделаю… а то вчера дрюкался со стабилизацией предсказателя высоты… таки стабилизировал его гада! 😃
Да, Вопрос - в какую религию обращать? MultiWii пробовал, CC - тоже летал… конечно субъективное мнение, но Wii понравился больше: код более понятен (ну не программер я) и танцев с бубном и I2C не было, но ведь кругом ещё столько опенсорсных вариантов…
посмотри mwc-ng от ziss_dm у него там правильная архитектура заложена… кросплатформенность avr/arm, tasks management with fixed time loop наскока помню…
code.google.com/p/mwc-ng/
Всё сошлось - можно плату изготавливать
Красиво. Какой софт портировать будешь? Когда ждать первый полет?
Барометр с гудлака оказался паяный (до этого времени не распаковывал)
Интересно, он не в заводской упаковке? Мож предпродажная проверка?
Наверно Мультипилот - он в VET6 влезет, на барометре пластик родной но был заклеен скотчем - перевернул - следы флюса и припой на лапах, если с какой дефектной платы сняли - куда ни шло, а если бракованный сам - плохо…
Как вам такой датчик давления www.st.com/internet/analog/product/251601.jsp
В наших краях можно купить за $3.75
Как вам такой датчик давления www.st.com/internet/analog/product/251601.jsp В наших краях можно купить за $3.75
Хотел прикупить такую платку, но так руки и не дошли;(
Кста, Александр, покажи скрины с идикатора, хочу посмотреть какой вектор кажет магнитометр.
отлично компас отрабатывает! никуда не скачет при наклонах… и это без калибровки? точненькА юг север запад восток показывает!
я так понимаю у тебя автокалибровка компаса сделана? т.к. на команду “c” по идее только гира и аксель калибруется…
только один баг странный, иногда гуй подвисает на 1-3 сек, потом оклемается и дальше пашет…
Ты получается ближе меня к “магнитному пупу” Земли, судя по вектору )))
отлично компас отрабатывает! никуда не скачет при наклонах… и это без калибровки?
Да, это без калибровки. Особо не вижу в этом смысла, по кругу расхождение в максимумах единицы градусов.
я так понимаю у тебя автокалибровка компаса сделана? т.к. на команду “c” по идее только гира и аксель калибруется…
нет, автокалибровки нет. Пробовал делать, но мне не понравилась, т.к. случайные выбросы смещают центры и масштаб осей. Клибровку компаса надо делать в услових близким к идельным, но как писал выше смысла не вижу… По команде “с” делается клибровка ДУС в части постоянных дрейфа осей, калибровка акселя тут не правильная (это не страшно если оси пропорциональны и отцентрованы), выполняется только замер средней магнитуды вектора G. Нужна была для экспериментов с измерением акселем линейных перемещений.
только один баг странный, иногда гуй подвисает на 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;
}
Кто нибудь знает, какие есть критерии при выборе частоты LPF фильтра гиры и акселя?
Я пока только одно упоминание увидел более-менее вразумительное, в исходниках ArduCopter’a: “Частота LPF выбирается в два раза меньше SAMPLE Rate”
“Частота LPF выбирается в два раза меньше SAMPLE Rate”
Это классика, следствие из теоремы Котельникова.
Вполне справедливо, нужно чтобы отсчёты не “пролетели” мимо обработки.
Это классика, следствие из теоремы Котельникова. Вполне справедливо, нужно чтобы отсчёты не “пролетели” мимо обработки.
Как теорему Котельникова применить к обработке Аналогово сигнала я знаю.
Sample Rate тут по всей видимости никаким боком (Это частота на которой обновляются регистры с выходными данными). Потому что гира на самом деле оцифровывается с частотой 1KHz или 8KHz (для MPU6000). Если я правильно понимаю, LPF отсеивает вибрации ниже определенной частоты. Вопрос только в том, какие частоты в виде помех обычно бывают на коптере. Отсюда видимо и надо плясать при выборе LPF (и возможно HPF).
Надо попробовать написать тулзу, для вывода графика FFT и подбора значений фильтра по нему. Причем при работающих моторах…
при работающих моторах…
моторы обычно не вращаются с одной и той же скоростью, особенно когда их несколько ;)
а где вы видели озвученный коментарий про частоту, не ткнете?
а где вы видели озвученный коментарий про частоту, не ткнете?
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
моторы обычно не вращаются с одной и той же скоростью, особенно когда их несколько 😉
Логично, поэтому надо строить график при Throttle от нуля до 100%.
AP_InertialSensor_MPU6000.cpp:
о, эту штуку недавно добавили только в ArduPlane, но это скорее обычное усреднение, чем какой-то специальный ФНЧ или ФВЧ, суммируем N значений и делим на N. для самолетов, мол, хватает.
строить график при Throttle от нуля до 100%.
это если мотор один, а как складывать гармоники будете от четырех-восьми работающих вразнобой?
p.s.
все-таки почитал вдумчивее, это действительно LPF, который имется в MPU6000 (цифровой встроенный), invensense.com/mems/gyro/…/RM-MPU-6000A.pdf страница 13-14. судя по временной задержке ничего сложнее усреднения там нет.
это если мотор один, а как складывать гармоники будете от четырех-восьми работающих вразнобой?
Вразнобой как раз и будет интересно анализировать, т.к. они будут резонировать на каких то частотах, где один работающий мотор не даст вообще никаких помех.
Т.е. в теории будет так: “плавно поднимаем газ от 0 до 100, при этом на графике FFT отмечаются максимумы, после этого меняем частоты LPF и HPF и повторяем тест до тех пор, пока не избавимся от помех от моторов”.
Кто нибудь знает, какие есть критерии при выборе частоты LPF фильтра гиры и акселя?
в вие я на этом собаку сьел! 😃
внутренние LPF:
- гира 42гц - если для умеренных и быстрых полетов
гира 20гц - для авто полетов, фпв и начнающих летунов
Не смотря на довольно низкие значения скорости гир вполне хватает для четкой стабилизации и отброса вибраций… - аксель 5-10гц - при условии что внутреннее усреднение сделано по нормальному в чипе, т.е. при понижении LPF не уменьшается самплиннг… т.к. к примеру в какашечном adxl345 сделано именно уменьшением самплинга…
внешние/алгоритмические LPF:
- гира - не трогаем 😃
- аксель - душим на 0.1-0.5гц, т.е. оставляем его скорость сходной со скоростью “корректора”… в вие это компл. фильтр, в арду dcm, но сути не меняет…
- гира 42гц - если для умеренных и быстрых полетов гира 20гц - для авто полетов, фпв и начнающих летунов Не смотря на довольно низкие значения скорости гир вполне хватает для четкой стабилизации и отброса вибраций… 2) аксель 5-10гц - при условии что внутреннее усреднение сделано по нормальному в чипе, т.е. при понижении LPF не уменьшается самплиннг… т.к. к примеру в какашечном adxl345 сделано именно уменьшением самплинга…
Эммм… так вроде в MPU, LPF выставляется одновременно для Гиры и Акселя.
Посмотрим какие будут отзывы о мерапирате 2,9 - там можно выбрать частоту LPF…
еще оч. важный параметр акселя это внутр. диапазон акселя… нужно брать 8-16g, иначе от вибраций и внутренних резонансов на этих самых вибрациях может происходить перенасыщение внутреннего АЦП акселя и тогда уже никакие внутр/внешн. фильтры и матеметика не помогут… типа как синусоида режется в меандр с диким расширением спектра гармоник…
в вие пока не доперли до этого, мучались с дрейфами в став/левел моде ибо “на столе” все пахало, а полете всплывало…
Эммм… так вроде в MPU, LPF выставляется одновременно для Гиры и Акселя.
ну да, я тоже задавался этом вопросом, но в даташит так и не залез… оставил на 42-20гц + внешний НЧ для акселя…
при понижении LPF не уменьшается самплиннг
неужто есть такие волшебные датчики??
нужно брать 8-16g
вот никогда не понимал этого. если аксель показывает цифры больше 2g, то его показания вобще можно не учитывать, а увеличение диапазона автоматом уменьшает разрешение. ну и если на аппарате идут вибрации больше 2g, то тут уже надо напильник брать, а не фильтровать.
вот никогда не понимал этого. если аксель показывает цифры больше 2g, то его показания вобще можно не учитывать
при переполнении плюс на минус поменяется 😦
вот никогда не понимал этого. если аксель показывает цифры больше 2g, то его показания вобще можно не учитывать, а увеличение диапазона автоматом уменьшает разрешение. ну и если на аппарате идут вибрации больше 2g, то тут уже надо напильник брать, а не фильтровать.
я не зря написал про внутренние резонансы самого акселя… дело скорее всего именно в них, т.к. тоже недоумевали откуда вибрации могут быть в таких кол-вах G…
но это уж факт, проводили тесты, спектр. состав смотрели и т.д… я делился подобными мыслями с vis.asta, так он подвердил тоже самое, что допер до этого уже год назад и у него 8g… а как у него летает, думаю все видели 😃
что до падения разрешения, то в норм. акселях даже при 8-16g это от 512 и выше, т.е. с головой т.к. нелинейность самих осей даст больше погрешности в разы…