搜索
bottom↓
回复: 2

MK四轴飞控里面的若干问题,请教!谢谢

[复制链接]

出0入0汤圆

发表于 2012-9-14 08:12:48 | 显示全部楼层 |阅读模式
本帖最后由 小笨蛋 于 2012-9-14 08:21 编辑

想做四轴,硬件已经搭好,现在研究飞控了,MK的飞控好复杂,看了好多遍还有好多地方不懂,前来请教一下。
  1.         // Coupling fraction
  2.         if(!Looping_Nick && !Looping_Roll && (ParamSet.GlobalConfig & CFG_AXIS_COUPLING_ACTIVE))
  3.         {
  4.                 tmpl = (Reading_GyroYaw * Reading_IntegralGyroNick) / 2048L;
  5.                 tmpl *= FCParam.Yaw_PosFeedback;
  6.                 tmpl /= 4096L;
  7.                 tmpl2 = ( Reading_GyroYaw * Reading_IntegralGyroRoll) / 2048L;
  8.                 tmpl2 *= FCParam.Yaw_PosFeedback;
  9.                 tmpl2 /= 4096L;
  10.                 if(labs(tmpl) > 128 || labs(tmpl2) > 128) FunnelCourse = 1;
  11.         }
  12.         else  tmpl = tmpl2 = 0;
复制代码
这个地方怎么把Reading_GyroYaw 和Reading_IntegralGyroNick两个轴乘到一起?这有什么意义?
  1.                 int32_t tmp_long, tmp_long2;
  2.                 if(FCParam.Kalman_K != -1)
  3.                 {
  4.                         // determine the deviation of gyro integral from averaged acceleration sensor
  5.                         tmp_long   = (int32_t)(IntegralNick / ParamSet.GyroAccFactor - (int32_t)Mean_AccNick);
  6.                         tmp_long   = (tmp_long * FCParam.Kalman_K) / (32 * 16);
  7.                         tmp_long2  = (int32_t)(IntegralRoll   / ParamSet.GyroAccFactor - (int32_t)Mean_AccRoll);
  8.                         tmp_long2  = (tmp_long2 * FCParam.Kalman_K) / (32 * 16);

  9.                         if((MaxStickNick > 64) || (MaxStickRoll > 64)) // reduce effect during stick commands
  10.                         {
  11.                                 tmp_long  /= 2;
  12.                                 tmp_long2 /= 2;
  13.                         }
  14.                         if(abs(PPM_in[ParamSet.ChannelAssignment[CH_YAW]]) > 25) // reduce further if yaw stick is active
  15.                         {
  16.                                 tmp_long  /= 3;
  17.                                 tmp_long2 /= 3;
  18.                         }
  19.                         // limit correction effect
  20.                         if(tmp_long >  (int32_t)FCParam.Kalman_MaxFusion)  tmp_long  = (int32_t)FCParam.Kalman_MaxFusion;
  21.                         if(tmp_long < -(int32_t)FCParam.Kalman_MaxFusion)  tmp_long  =-(int32_t)FCParam.Kalman_MaxFusion;
  22.                         if(tmp_long2 > (int32_t)FCParam.Kalman_MaxFusion)  tmp_long2 = (int32_t)FCParam.Kalman_MaxFusion;
  23.                         if(tmp_long2 <-(int32_t)FCParam.Kalman_MaxFusion)  tmp_long2 =-(int32_t)FCParam.Kalman_MaxFusion;
  24.                 }
复制代码
这个地方 (int32_t)(IntegralNick / ParamSet.GyroAccFactor - (int32_t)Mean_AccNick);陀螺仪和加速度计数据可以直接比较吗?难道加速度计不需要用反正切得出角度?
  1.                 if(!Looping_Nick && !Looping_Roll && !FunnelCourse)
  2.                 {
  3.                         // Calculate mean value of the gyro integrals
  4.                         MeanIntegralNick /= BALANCE_NUMBER;
  5.                         MeanIntegralRoll  /= BALANCE_NUMBER;

  6.                         // Calculate mean of the acceleration values
  7.                         IntegralAccNick = (ParamSet.GyroAccFactor * IntegralAccNick) / BALANCE_NUMBER;
  8.                         IntegralAccRoll  = (ParamSet.GyroAccFactor * IntegralAccRoll ) / BALANCE_NUMBER;

  9.                         // Nick ++++++++++++++++++++++++++++++++++++++++++++++++
  10.                         // Calculate deviation of the averaged gyro integral and the averaged acceleration integral
  11.                         IntegralErrorNick = (int32_t)(MeanIntegralNick - (int32_t)IntegralAccNick);
  12.                         CorrectionNick = IntegralErrorNick / ParamSet.GyroAccTrim;
  13.                         AttitudeCorrectionNick = CorrectionNick / BALANCE_NUMBER;
  14.                         // Roll ++++++++++++++++++++++++++++++++++++++++++++++++
  15.                         // Calculate deviation of the averaged gyro integral and the averaged acceleration integral
  16.                         IntegralErrorRoll = (int32_t)(MeanIntegralRoll - (int32_t)IntegralAccRoll);
  17.                         CorrectionRoll  = IntegralErrorRoll / ParamSet.GyroAccTrim;
  18.                         AttitudeCorrectionRoll  = CorrectionRoll  / BALANCE_NUMBER;

  19.                         if(((MaxStickNick > 64) || (MaxStickRoll > 64) || (abs(PPM_in[ParamSet.ChannelAssignment[CH_YAW]]) > 25)) && (FCParam.Kalman_K == -1) )
  20.                         {
  21.                                 AttitudeCorrectionNick /= 2;
  22.                                 AttitudeCorrectionRoll /= 2;
  23.                         }
复制代码
上面不是已经                MeanIntegralNick /= BALANCE_NUMBER;                了吗,为什么还要再除一次?        AttitudeCorrectionNick = CorrectionNick / BALANCE_NUMBER;
  1. // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  2. // Nick-Axis
  3. // +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  4.     DiffNick = Reading_GyroNick - StickNick;        // get difference
  5.     if(Gyro_I_Factor) SumNick += IntegralNick * Gyro_I_Factor - StickNick; // I-part for attitude control
  6.     else SumNick += DiffNick; // I-part for head holding
  7.     if(SumNick >  (STICK_GAIN * 16000L)) SumNick =  (STICK_GAIN * 16000L);
  8.     if(SumNick < -(STICK_GAIN * 16000L)) SumNick = -(STICK_GAIN * 16000L);
  9.     pd_result = DiffNick + Ki * SumNick; // PI-controller for nick

  10.     tmp_int = (int32_t)((int32_t)FCParam.DynamicStability * (int32_t)(GasMixFraction + abs(YawMixFraction)/2)) / 64;
  11.     if(pd_result >  tmp_int) pd_result =  tmp_int;
  12.     if(pd_result < -tmp_int) pd_result = -tmp_int;

  13.         // Motor Front
  14.     MotorValue = GasMixFraction + pd_result + YawMixFraction;          // Mixer
  15.     MotorValue /= STICK_GAIN;
  16.         if ((MotorValue < 0)) MotorValue = 0;
  17.         else if(MotorValue > ParamSet.Gas_Max)            MotorValue = ParamSet.Gas_Max;
  18.         if (MotorValue < ParamSet.Gas_Min)            MotorValue = ParamSet.Gas_Min;
  19.         Motor_Front = MotorValue;

  20. // Motor Rear
  21.         MotorValue = GasMixFraction - pd_result + YawMixFraction;     // Mixer
  22.         MotorValue /= STICK_GAIN;
  23.         if ((MotorValue < 0)) MotorValue = 0;
  24.         else if(MotorValue > ParamSet.Gas_Max)            MotorValue = ParamSet.Gas_Max;
  25.         if (MotorValue < ParamSet.Gas_Min)          MotorValue = ParamSet.Gas_Min;
  26.         Motor_Rear = MotorValue;
复制代码
最后这个
  DiffNick = Reading_GyroNick - StickNick;        // get difference
    if(Gyro_I_Factor) SumNick += IntegralNick * Gyro_I_Factor - StickNick; // I-part for attitude control
    else SumNick += DiffNick; // I-part for head holding
    pd_result = DiffNick + Ki * SumNick; // PI-controller for nick
地方不懂。。
Reading_GyroNick应该是角速度,为什么能和StickNick相减呢?
后面IntegralNick 已经是积分了的,为什么 SumNick +=还要积分一次?

最后的电机控制量应该是:角速度*a+角度*b 吧?
还是    角速度*a+角度*b+∫角度*c  ??

恳请高手指教一下,谢谢了

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-10-3 18:25

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

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