搜索
bottom↓
回复: 12

MWC飞控定高 重磅来袭

[复制链接]

出0入0汤圆

发表于 2014-11-9 23:49:35 | 显示全部楼层 |阅读模式
搞了那么久的定高,我只说说我用过MWC的飞控的定高程序,使用气压计定高的哈,对代码进行了注释。欢迎吐槽交流
#define BARO_TAB_SIZE   21

#define ACC_Z_DEADBAND (acc_1G>>5) // was 40 instead of 32 now

//死区计算  
#define applyDeadband(value, deadband)  \
  if(abs(value) < deadband) {           \
    value = 0;                          \
  } else if(value > 0){                 \
    value -= deadband;                  \
  } else if(value < 0){                 \
    value += deadband;                  \
  }

#if BARO
uint8_t getEstimatedAltitude(){
  static uint32_t deadLine;
  static int32_t baroGroundPressure;
  static uint16_t previousT;
  uint16_t currentT = micros();
  uint16_t dTime;

  dTime = currentT - previousT;  //  时间
  if (dTime < UPDATE_INTERVAL) return 0;  //小于限定值,返回零
  previousT = currentT;

  if(calibratingB > 0) {
    baroGroundPressure = baroPressureSum/(BARO_TAB_SIZE - 1);
    calibratingB--;
  }    //获取气压值

  // pressure relative to ground pressure with temperature compensation (fast!)
  // baroGroundPressure is not supposed to be 0 here
  // see: https://code.google.com/p/ardupi ... AP_Baro/AP_Baro.cpp
  BaroAlt = log( baroGroundPressure * (BARO_TAB_SIZE - 1)/ (float)baroPressureSum ) * (baroTemperature+27315) * 29.271267f; // in cemtimeter      气压值转化到高度值 单位CM

  EstAlt = (EstAlt * 6 + BaroAlt * 2) >> 3; // additional LPF to reduce baro noise (faster by 30 µs)   低通滤波
//定高程序
  #if (defined(VARIOMETER) && (VARIOMETER != 2)) || !defined(SUPPRESS_BARO_ALTHOLD)
    //P
    int16_t error16 = constrain(AltHold - EstAlt, -300, 300);   //计算差值
    applyDeadband(error16, 10); //remove small P parametr to reduce noise near zero position       移除死区 降低噪声 在零点附近
    BaroPID = constrain((conf.P8[PIDALT] * error16 >>7), -150, +150);
//计算P值
    errorAltitudeI += conf.I8[PIDALT] * error16 >>6; //计算I值
    errorAltitudeI = constrain(errorAltitudeI,-30000,30000);//I值限幅
    BaroPID += errorAltitudeI>>9; //I in range +/-60
   //下面计算Z轴的加速度(公式  ) 计算每个方向的加速度在Z轴的投影
    // projection of ACC vector to global Z, with 1G subtructed
    // Math: accZ = A * G / |G| - 1G
    int16_t accZ = (accSmooth[ROLL] * EstG32.V.X + accSmooth[PITCH] * EstG32.V.Y + accSmooth[YAW] * EstG32.V.Z) * invG;

    static int16_t accZoffset = 0; // = acc_1G*6; //58 bytes saved and convergence is fast enough to omit init
    if (!f.ARMED) {
      accZoffset -= accZoffset>>3;
      accZoffset += accZ;
    }  //未解锁时 进行低通滤波  
    accZ -= accZoffset>>3;
    applyDeadband(accZ, ACC_Z_DEADBAND);

    static float vel = 0.0f;
    static float accVelScale = 9.80665f / 10000.0f / acc_1G ;

    // Integrator - velocity, cm/sec
    vel += accZ * accVelScale * dTime;
//计算Z轴加速在该时间内在Z轴的对应的位移
    static int32_t lastBaroAlt;
    int16_t baroVel = (EstAlt - lastBaroAlt) * 1000000.0f / dTime;
    lastBaroAlt = EstAlt;  //计算气压计上次的误差

    baroVel = constrain(baroVel, -300, 300); // constrain baro velocity +/- 300cm/s
    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 * 0.985f + baroVel * 0.015f;
// 融合气压计和加速度计计算位移   这里采用加速度计的值和气压计的值融合后来做微分
    //D
    int16_t vel_tmp = vel;
    applyDeadband(vel_tmp, 5);
    vario = vel_tmp;
BaroPID -= constrain(conf.D8[PIDALT] * vel_tmp >>4, -150, 150);
//计算D值  
  #endif
  return 1;
}
#endif //BARO                              //  看海冲浪         394171244@qq.com   

出0入0汤圆

发表于 2014-11-10 09:06:36 | 显示全部楼层
不错,帮顶!

出0入0汤圆

发表于 2014-11-18 22:35:54 | 显示全部楼层
请问楼主,你的定高效果怎么样?

出0入0汤圆

发表于 2014-11-18 22:42:30 来自手机 | 显示全部楼层
不错,帮顶!

出0入0汤圆

发表于 2014-11-18 23:06:05 来自手机 | 显示全部楼层
学习了           

出105入79汤圆

发表于 2014-11-19 02:28:16 来自手机 | 显示全部楼层
这里使用互补滤波得到高度的思路不错,但是后面的pid控制比较糟糕,直接导致上下飘动比较大,定得不死。我使用卡尔曼融合,再加三级PID,能定到精度20cm,并且手都拉不动超过10CM

出0入0汤圆

 楼主| 发表于 2014-11-19 08:59:39 | 显示全部楼层
我定高的时候,基本上看不出来跳动,当然我在室内定高的哈,室外未测试

出0入0汤圆

发表于 2014-11-19 19:39:06 | 显示全部楼层
用的什么气压计

出0入0汤圆

 楼主| 发表于 2014-11-20 09:35:26 | 显示全部楼层
用的MS5611啊

出0入0汤圆

发表于 2014-11-20 10:17:04 | 显示全部楼层
MWC飞控定高   mark

出0入0汤圆

发表于 2015-5-13 15:35:13 | 显示全部楼层
int16_t accZ = (accSmooth[ROLL] * EstG32.V.X + accSmooth[PITCH] * EstG32.V.Y + accSmooth[YAW] * EstG32.V.Z) * invG;
楼主这句话怎么理解的啊

出0入0汤圆

发表于 2015-5-20 09:52:10 | 显示全部楼层
楼主,你的气压计直接出来的高度漂移多大呢?

出0入0汤圆

发表于 2015-9-16 23:31:38 | 显示全部楼层
mark,顶!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-19 21:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表