first_mouse 发表于 2011-8-21 14:29:34

请高手说说mk是怎么样达到悬停?

请高手说说mk是怎么样达到悬停?只讨论算法    不讨论硬件...
                            共同学习一下...

haolxy 发表于 2011-8-21 15:04:47

MK主要是通过气压计实现定高悬停的
定高代码在这里
                h = ReadingHeight;
                // if current height is above the setpoint reduce gas
                if((h > SetPointHeight) && HeightControlActive)
                {
                        // GasMixFraction - HightDeviation * P- HeightChange * D - ACCTop * DACC
                        // height difference -> P control part
                        h = ((h - SetPointHeight) * (int16_t) FCParam.Height_P) / (16 / STICK_GAIN);
                        h = GasMixFraction - h; // reduce gas
                        // height gradient --> D control part
                        //h -= (HeightD * FCParam.Height_D) / (8 / STICK_GAIN);// D control part
                        h -= (HeightD) / (8 / STICK_GAIN);// D control part
                        // acceleration sensor effect
                        tmp_int = ((Reading_Integral_Top / 128) * (int32_t) FCParam.Height_ACC_Effect) / (128 / STICK_GAIN);
                        if(tmp_int > 70 * STICK_GAIN)      tmp_int =   70 * STICK_GAIN;
                        else if(tmp_int < -(70 * STICK_GAIN)) tmp_int = -(70 * STICK_GAIN);
                        h -= tmp_int;
                        // update height control gas
                        HeightControlGas = (HeightControlGas*15 + h) / 16;
                        // limit gas reduction
                        if(HeightControlGas < ParamSet.Height_MinGas * STICK_GAIN)
                        {
                                if(GasMixFraction >= ParamSet.Height_MinGas * STICK_GAIN) HeightControlGas = ParamSet.Height_MinGas * STICK_GAIN;
                                // allows landing also if gas stick is reduced below min gas on height control
                                if(GasMixFraction < ParamSet.Height_MinGas * STICK_GAIN) HeightControlGas = GasMixFraction;
                        }
                        // limit gas to stick setting
                        if(HeightControlGas > GasMixFraction) HeightControlGas = GasMixFraction;
                        GasMixFraction = HeightControlGas;
                }
        }
        // limit gas to parameter setting
        if(GasMixFraction > (ParamSet.Gas_Max - 20) * STICK_GAIN) GasMixFraction = (ParamSet.Gas_Max - 20) * STICK_GAIN;


ReadingHeight是当前气压计的输出
SetPointHeight是切换自动油门时刻的气压值
GasMixFraction是油门通道的数值
HeightD可以认为是上一次气压输出与当前气压输出的差值再乘以一个系数,在Analog.c函数里面有

MK自动油门的思路实际上是一个PD算法。
在没有自动油门控制时候当油门大小在某一个值的时候旋翼提供的升力正好等于飞机的重力,此时飞机为悬停状态,当油门大于这个值时候飞机回一直向上升高,反之飞机回一直下降。
而PD控制是一个有静差的自动控制,静差产生的高度正好是飞机在当前油门下的飞行高度。
MK的算法只有在当前高度高于切换瞬间高度时才被调用

先计算比例向
h=((h - SetPointHeight) * (int16_t) FCParam.Height_P) / (16 / STICK_GAIN);

当期油门的值减去这个数值
h = GasMixFraction - h;
这句话可以这样理解,当油门大于悬停油门时飞机会升高,升高的同时比例项计算出来的数值会增大,遥控器油门数值减去这个计算出来的比例值后作为新的油门值,随着高度差的增加总会有一点的时候比例向计算出来的数值正好等于当前油门大于悬停油门的数值的时候,此时飞机回停在这个高度上不动,如果增大油门,飞机会继续向上飞,直到一个新的位置继续悬停。

h -= (HeightD) / (8 / STICK_GAIN);
tmp_int = ((Reading_Integral_Top / 128) * (int32_t) FCParam.Height_ACC_Effect) / (128 / STICK_GAIN);
这两步计算分别用到了微分项和Z轴的加速度,是为了让高度迅速稳定用的。

first_mouse 发表于 2011-8-24 00:18:02

很好

wenziheni 发表于 2013-11-4 11:03:40

了解悬停的机理了{:smile:}

SHIYOULAN 发表于 2013-11-13 00:35:54

长见识了,回答很犀利!

mahengyu 发表于 2013-11-13 17:57:58

回答的不错

analoglamb 发表于 2013-11-16 13:28:05

haolxy 发表于 2011-8-21 15:04 static/image/common/back.gif
MK主要是通过气压计实现定高悬停的
定高代码在这里
                h = ReadingHeight;


谢谢。。。。。。

yue621 发表于 2014-3-12 12:49:28

很不错~~顶起~~!!!

杨大侠 发表于 2014-3-12 13:57:54

Mark,赞一个

firstzys 发表于 2014-3-12 22:32:43

悬停,标记一下
页: [1]
查看完整版本: 请高手说说mk是怎么样达到悬停?