最近探索了baseflight/cleanflight源码相关,看了源码想分享一下,baseflight无头模式的原理。

baseflight源码可以在github中搜到,网址直达:https://github.com/multiwii/baseflight    baseflight源码主控是stm32,用来玩穿越机的比较多,这里我是应用于直流有刷电机的四轴中,一样玩的不错,这份开源代码源于MWC,然后开发者们做了stm32版本的baseflight,再后来更改了编程风格,cleanflight/bateflight源码也出来了。这里为什么选用baseflight呢,因为源码从github下载下来就已经有keil工程了,打开编译修改四轴就能飞了,cleanflight/bateflight需要make一下,然后用jlink软件下载进去,略麻烦一点。好了,开始介绍重点:无头模式的原理。

baseflight无头模式的相关代码在mw.c  184行中:

    if (f.HEADFREE_MODE) {     
        float radDiff = (heading - headFreeModeHold) * M_PI / 180.0f;
        float cosDiff = cosf(radDiff);
        float sinDiff = sinf(radDiff);
        int16_t rcCommand_PITCH = rcCommand[PITCH] * cosDiff + rcCommand[ROLL] * sinDiff;
        rcCommand[ROLL] = rcCommand[ROLL] * cosDiff - rcCommand[PITCH] * sinDiff;
        rcCommand[PITCH] = rcCommand_PITCH;
    }

遥控通道激活无头模式后,标志位置位f.HEADFREE_MODE=1,heading就是当前yaw角,headFreeModeHold在 解锁时 或 激活HEADADJ时 能将当前yaw角记录更新(其实就是headFreeModeHold = heading; // acquire new heading)。

radDiff 计算的是当前yaw与headFreeModeHold 的夹角,这里该如何理解下面的rcCommand[ROLL] 和rcCommand[PITCH] 的计算呢,画个图就清晰了,其实就是向量分解。



Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐