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

SergDoc

Да вот платка под MT3329 и эту коробочку
может кому пригодится…
там размер 31 мм оно ложится на нижнюю и входит в верхнюю, плотно закрываясь 😃

SergDoc

Полетал слегка: ветер собачий (при порыве в спину аж толкает) и хоть и GPS протрулюлюкал loc (пищалку на таймере вывел - поёт разные мелодии) и ручки впринципе тянулись к переключателю, но очко не из титана - так в лойтере и не попробовал…
Зато полетал в альтхолд - держит даже в ветер такой очень хорошо 😃
Взлёт и посадка в альтхолд:
Взлёт - моторы крутят на минимуме пока не передвинешь стик больше 50% - сразу резкий отрыв где-то на полметра и всё стик в 50 - висим, больше - подымаемся…
Посадка - немного станновато сделано, возможно из-за сильного ветра, но чтобы посадить надо стик почти в минимум опустить - начинает садиться, надо отдать должное посадка ну оочень мягкая, сам так не посажу (ну разве что в штиль) 😃

Раз альтхолд работает на жестко прикрученной плате, значит аксель себя чувствует хорошо 😃

mahowik
rual:

Мда… Значится что то в коде… Но ты ведь всё равно эти процедуры менять будешь? Меняй, а там посмотришь

В коде вряд ли, т.к. отключение FPU решает проблему. Бага в компиллере явно…
Да и код там простой. Локальная статическая переменная (accAlt) и пару умножений с ней


int getEstimatedAltitude(void)
{
    static uint32_t previousT;
    uint32_t currentT = micros();
    uint32_t dTime;
    int32_t error;
    int32_t baroVel;
    int32_t vel_tmp;
    int32_t BaroAlt_tmp;
    float dt;
    float vel_acc;
    static float vel = 0.0f;
    static float accAlt = 0.0f;
    static int32_t lastBaroAlt;
    static int32_t baroGroundAltitude = 0;
    static int32_t baroGroundPressure = 0;

    dTime = currentT - previousT;
    if (dTime < UPDATE_INTERVAL)
        return 0;
    previousT = currentT;

    if (calibratingB > 0) {
        baroGroundPressure -= baroGroundPressure / 8;
        baroGroundPressure += baroPressureSum / (cfg.baro_tab_size - 1);
        baroGroundAltitude = (1.0f - powf((baroGroundPressure / 8) / 101325.0f, 0.190295f)) * 4433000.0f;

        vel = 0;
        accAlt = 0;
        calibratingB--;
    }

    // calculates height from ground via baro readings
    // see: 
    BaroAlt_tmp = lrintf((1.0f - powf((float)(baroPressureSum / (cfg.baro_tab_size - 1)) / 101325.0f, 0.190295f)) * 4433000.0f); // in cm
    BaroAlt_tmp -= baroGroundAltitude;
    BaroAlt = lrintf((float)BaroAlt * cfg.baro_noise_lpf + (float)BaroAlt_tmp * (1.0f - cfg.baro_noise_lpf)); // additional LPF to reduce baro noise

    dt = accTimeSum * 1e-6f; // delta acc reading time in seconds

    // Integrator - velocity, cm/sec
    vel_acc = (float)accSum[2] * accVelScale * (float)accTimeSum / (float)accSumCount;

    // Integrator - Altitude in cm
    accAlt += (vel_acc * 0.5f) * dt  + vel * dt;                                        // integrate velocity to get distance (x= a/2 * t^2)
    accAlt = accAlt * cfg.baro_cf_alt + (float) BaroAlt *(1.0f - cfg.baro_cf_alt);      // complementary filter for Altitude estimation (baro & acc)
    EstAlt = accAlt;
    vel += vel_acc;

#if 0
    debug[0] = accSum[2] / accSumCount; // acceleration
    debug[1] = vel;                     // velocity
    debug[2] = accAlt;                  // height
#endif

    accSum_reset();

    //P
    error = constrain(AltHold - EstAlt, -300, 300);
    error = applyDeadband(error, 10);       // remove small P parametr to reduce noise near zero position
    BaroPID = constrain((cfg.P8[PIDALT] * error / 128), -200, +200);

    //I
    errorAltitudeI += cfg.I8[PIDALT] * error / 64;
    errorAltitudeI = constrain(errorAltitudeI, -50000, 50000);
    BaroPID += errorAltitudeI / 512;     // I in range +/-100

    baroVel = (BaroAlt - lastBaroAlt) * 1000000.0f / dTime;
    lastBaroAlt = BaroAlt;

    baroVel = constrain(baroVel, -300, 300);    // constrain baro velocity +/- 300cm/s
    baroVel = applyDeadband(baroVel, 10);       // to reduce noise near zero

    // apply Complimentary Filter to keep the calculated velocity based on baro velocity (i.e. near real velocity).
    // By using CF it's possible to correct the drift of integrated accZ (velocity) without loosing the phase, i.e without delay
    vel = vel * cfg.baro_cf_vel + baroVel * (1 - cfg.baro_cf_vel);
    vel = constrain(vel, -1000, 1000);                // limit max velocity to +/- 10m/s (36km/h)

    // D
    vel_tmp = lrintf(vel);
    vel_tmp = applyDeadband(vel_tmp, 5);
    vario = vel_tmp;
    BaroPID -= constrain(cfg.D8[PIDALT] * vel_tmp / 16, -150, 150);

    return 1;
}
SergDoc:

Взлёт - моторы крутят на минимуме пока не передвинешь стик больше 50% - сразу резкий отрыв где-то на полметра и всё стик в 50 - висим, больше - подымаемся…

я когда единожды ардупират пробовал (в альтхолд), подумал это он так прыгнул из за вибраций на борту, также не исключал, что это они так воздушную подушку побороли 😃
и что в этом хорошего?
Я вес баро просто уменьшал на взлете и отрыв от земли хоть 20см в сек делай, т.е. перевел за 50%, никакого прыжка… взлетаем…
Вот старый видос. Смотреть с 2:40

SergDoc
mahowik:

Бага в компиллере явно…

А они за это ещё и деньги просят 😦

mahowik
SergDoc:

А они за это ещё и деньги просят 😦

Не ну IDE вполне себе мощная, а баги есть везде. В той же Arduino IDE натыкался на пару глюков и пока строчки (независимые от контекста) местами не менял никак не получалось убрать “загадочность”. А пару раз натыкался, когда компиллер не видит закрывающей скобки из-за набора дефайнов внутри, хотя там 100% было все ок… так что это нормально…
И даже в чипах есть баги. И об этом пишут в спеках, что мол при таких то условиях и значениях регистров будет глюк…

upd: По некоторым моим постам можно подумать, что я не люблю арду. Это не так! 😃
Пожалуй самый перспективны проект и мощнейшее комьюнити в тырнете. А вики вообще загляденье!

SergDoc

Я тут вспомнил, помнишь багу по альтхольду в базефлигхт - давно было я ещё на мелкоплате тогда с сонаром ковырялся, а ты делал RC разные, там в ноль переменная становилась всегда из-за неправильного перевода из int в float, я про неё и забыл… может она?

Alexey_1811

Немного не по теме но спрошу тут. Кто то запускал UART4 на STM32F4 (stm32f405rgt6). Ну ни как не выходит передать данные.

//============================== UART_4 FRSKY ==================================
void Init_Uart4(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    /* --------------------------- System Clocks Configuration -----------------*/
  /* UART4 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);
  /* GPIOA clock enable */
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
  /*-------------------------- GPIO Configuration ----------------------------*/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  /* Connect USART pins to AF */
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource0, GPIO_AF_UART4);
  GPIO_PinAFConfig(GPIOA, GPIO_PinSource1, GPIO_AF_UART4);

  /* USARTx configuration ------------------------------------------------------*/
  USART_InitStructure.USART_BaudRate = 9600;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  USART_Init(UART4, &USART_InitStructure);
  USART_Cmd(UART4, ENABLE);
}
//==============================================================================
unsigned char _data[10] = {1,2,3,4,5,6,7,8,9,0};
void SendUart4(void)
{
    unsigned char ii;
    for (ii=0;ii<10;ii++)
    {
        while(USART_GetFlagStatus(UART4, USART_FLAG_TXE) == RESET){;} // Wait for Empty
        UART4->DR = (unsigned char)_data[ii];
        __nop();
    //USART_SendData(UART4, data[ii]); // Echo Char
    }
}
SergDoc

возможно надо
USART_SendData(UART4, (uint8_t)_data[ii]);
может его рвёт от char?

Alexey_1811

Вопрос снят. Я блин дятел синюю термоусадку не на тот провод одел и получилось что на землю был сигнальный провод. Нужно отдохнуть.

SergDoc

Ооо я частенько чё-нить нитуда воткну, а потом бегаю ищу 😃 неправильное подключение может привести к серьёзным научным открытиям;)

mahowik
SergDoc:

Я тут вспомнил, помнишь багу по альтхольду в базефлигхт - давно было я ещё на мелкоплате тогда с сонаром ковырялся, а ты делал RC разные, там в ноль переменная становилась всегда из-за неправильного перевода из int в float, я про неё и забыл… может она?

Нее, это не то. Там вроде была переменная интегратора и сумма “не копилась” т.к. дискреты/самплы мелкие были, а дробная часть отбрасывалась из-за преобразования типов… вроде так…
А тут явно косяк не в этом. Уже и на 4.73 кейл откатился и таж фигня. Пока отключил FPU, а там посмотрим…

rual:

DRDY это готовность МС5611, я ей не пользуюсь, так что не подскажу.

Вах вах вах! 😃
Подрубил осцилл посмотреть, а там синхра готовности данных идет с частотой всего ~15гц. А ms5611 даже при макс. разрешении АЦП дает ~100гц по даташиту!
Response time (Conversion time for ADC) = 8.22ms for Oversampling Ratio = 4096
Ну думаю совсем таймкоп свою железку не любит! 😃
Потом смотрю на схемку от Сержа, а DRDY это пин готовности компаса 😃
Полез в кодярник и даташит, а там как раз дефолтный дата рэйт это 15 герц 😃

rual
mahowik:

Потом смотрю на схемку от Сержа, а DRDY это пин готовности компаса

Извини, наврал, у МСки вообще выхода готовности нет, это компас 5883. По большому счету его готовность не особо нужна, только если для контроля работоспособности.
Готовность данных нужно контролировать только у датчиков с которых данные интегрируются, дабы не словить пропуск или не считать два раза одно и тоже.

mahowik:

А тут явно косяк не в этом. Уже и на 4.73 кейл откатился и таж фигня. Пока отключил FPU, а там посмотрим…

Сдаётся мне, что проблема у тебя в формировании переменной dt, попробуй отладить с нулевым уровнем оптимизации компиллера.

Drinker
rual:

Готовность данных нужно контролировать только у датчиков с которых данные интегрируются, дабы не словить пропуск или не считать два раза одно и тоже.

Камрад, а как ты их контролируешь?

2 Serg, 3дээры красавцы:
Dear Customer,

We recently updated the 3DR Pixhawk flight controllers that were included with your IRIS developer units. The upgraded Pixhawk features improved power handling plus an additional accelerometer.

We have begun shipping the new Pixhawk flight controllers to the address where you received your IRIS. You will receive one Pixhawk for each IRIS you purchased. If you resold your IRIS, please be sure to contact your customers and provide them with this updated flight controller.

Тоесть скоро их будет два? Если так, то для опытоф могу первый предложить!

SergDoc

Неужели они на столько обкакались, что высылают новые контроллеры без замены старых? ГЫ сразу вырисовывается себестоимость 😃

rual
Drinker:

Камрад, а как ты их контролируешь?

Дык ловлю сигнал готовности от гиры и акселя. Т.е. все отсчеты датчиков учтены и обработка данных идёт в такт с датчиками.

Drinker:

Тоесть скоро их будет два? Если так, то для опытоф могу первый предложить!

Дык ты хоть скажи какие датчики в твоём стоят, и если там ЛСМ то ведь летает нормально, даже отлично.

SergDoc

А я тулчайны и ПО всё переношу на Писишку, шяс буду посмотреть что в пикхавке накуралесили - ну и как следствие обновлю Арду…

Drinker
rual:

Дык ловлю сигнал готовности от гиры и акселя.

Не по прирыванию?

rual:

и если там ЛСМ

Лсм 303d судя по размеру и коду пиксхавка
Кстати, чуть я расстроился из-за того, что когдато приобрел пару бреакоутов с лсм303длм…Разозлился и таки заставил ейо не хуже тех-же адхл и мпу летать. Видео в личку кину дабы не разводить слухов.

SergDoc:

А я тулчайны и ПО всё переношу на Писишку

Как закончишь, подскажешь че и как?

SergDoc
Drinker:

Как закончишь, подскажешь че и как?

у меня бубунта если чё…
да на SPI1 повесили MPU6000 в Pixhawk-e

дийдроносы вроде скрипт установки починили, шяс NuttX клонируется - проверю…

rual
Drinker:

Не по прирыванию?

По прерыванию, и весь обсчёт в обработчиках.

Drinker:

Лсм 303d судя по размеру и коду пиксхавка

тада не понимаю в чем зуд у 3Дээров, если экземпляры вполне на ЛСМ летают. Или там ЛСМ какие особые?

Drinker:

.Разозлился и таки заставил ейо не хуже тех-же адхл и мпу летать.

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

Drinker
rual:

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

Не так. У них 303д, там характеристики другие, а у мну 303длм с его аццким шумом.

rual:

тада не понимаю в чем зуд у 3Дээров, если экземпляры вполне на ЛСМ летают. Или там ЛСМ какие особые?

Да не, думаю эту ветку читают…😃

rual
Drinker:

Не так. У них 303д, там характеристики другие, а у мну 303длм с его аццким шумом.

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

Да и если 303д настолько хороша (лучше 303длм), то на кой эти приседания, да ещё с бесплатной заменой.

попахивает мировым заговором! 😃

😁😁😁