baseflight無頭模式原理

最近探索了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] 的計算呢,畫個圖就清晰了,其實就是向量分解。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章