PX4姿態控制演算法分析

2021-09-13 21:31:48 字數 3949 閱讀 6739

**px4的姿態控制分為角度環(外環)和角速度環(內環),角度環使用p控制,角速度環使用pid控制,由於偏航通道響應較慢(多旋翼飛行器的俯仰和滾轉運動由旋翼的公升力力矩產生,偏航運動由旋翼的反扭矩來產生,而公升力力矩要比反扭矩大得多(可從旋翼的公升力係數和反扭矩係數中看出),這造成了偏航運動能力相比滾轉和俯仰運動能力要弱),故在偏航通道內環加入前饋環節;

px4的姿態控制部分使用的是roll-pitch和yaw分開控制的(是為了解耦控制行為),即tilt和torsion兩個環節。如下圖:

根據經驗所得,控制toll-pitch比控制yaw更容易實現。比如同樣是實現10°的變化,roll-pitch需要60ms左右;但是yaw控制器卻需要接近150ms。**使用分步控制的優點在於解耦控制行為,即分別執行響應較快的動作和響應較慢的動作;同時,相比傳統的rpy三軸解耦姿態控制,三個姿態通道的姿態動作範圍更小,能耗更小。**下圖則比較形象地表示了這一點:

;此處,r_sp表示期望姿態角所對應的期望機體系到地理座標系的旋轉矩陣;r:根據當前的姿態角得到當前機體系到地理座標系的旋轉矩陣;

/* try to move thrust vector shortest way, because yaw response is slower than roll/pitch */

math:

:vector<

3>

r_z(r(

0,2)

,r(1

,2),

r(2,

2));

得到當前機體系下的z軸在地理系下的座標表示(旋轉矩陣r左乘[0,0,1])

math:

:vector<

3>

r_sp_z

(r_sp(0

,2),

r_sp(1

,2),

r_sp(2

,2))

;

得到期望機體系下的z軸在地理系下的座標表示(旋轉矩陣r_sp左乘[0,0,1])

/* axis and sin(angle) of desired rotation */

math:

:vector<

3> e_r = r.

transposed()

*(r_z % r_sp_z)

;

r_z和 r_sp_z叉乘求出由r_z到r_sp_z的旋轉軸,由右手定則判斷該旋轉軸的方向;注意:此處叉乘得到的旋轉軸為地理系下的座標表示。r為當前機體系到地理系的旋轉矩陣,其轉置為地理系到當前座標系的旋轉矩陣,因為旋轉矩陣為單位正交矩陣,逆等於其轉置;最終這一步得到旋轉軸在當前機體系下的表示。

/* calculate angle error */

float e_r_z_sin = e_r.

length()

;float e_r_z_cos = r_z * r_sp_z;

a×b=︱a︱︱b︱sinθ,a•b=︱a︱︱b︱cosθ,叉乘得到旋轉角正弦,點乘得到旋轉角余弦。

/* calculate weight for yaw control */

float yaw_w =

r_sp(2

,2)*

r_sp(2

,2);

yaw的權值(不是很懂),可能為期望機體系z軸與慣性系z軸之間的重合程度?

/* calculate rotation matrix after roll/pitch only rotation */

math:

:matrix<3,

3> r_rp;

if(e_r_z_sin >

0.0f

)else

得到經過俯仰滾轉運動後的座標系,該座標系與期望座標系只有偏航上的偏差,z軸已經對齊;r_rp為該座標系到地理座標系的旋轉矩陣。羅德里格斯公式(得到以軸角形式表示的旋轉矩陣)

/* r_rp and r_sp has the same z axis, calculate yaw error */

math:

:vector<

3>

r_sp_x

(r_sp(0

,0),

r_sp(1

,0),

r_sp(2

,0))

;math:

:vector<

3>

r_rp_x

(r_rp(0

,0),

r_rp(1

,0),

r_rp(2

,0))

;e_r(2

)=atan2f

((r_rp_x % r_sp_x)

* r_sp_z, r_rp_x * r_sp_x)

* yaw_w;

求出z軸對齊後兩座標係的x軸偏差角度,用作計算yaw的期望角速度。

if

(e_r_z_cos <

0.0f

)

上述**為大角度變化時的控制策略(大於90°時);當角度過大時,直接一步旋轉的權重較大,使系統快速回到90°的範圍以內,再進行分步旋轉控制。

/* calculate angular rates setpoint */

_rates_sp = _params.att_p.

emult

(e_r)

;//外環p控制

/* limit yaw rate */

_rates_sp(2

)= math:

:constrain

(_rates_sp(2

),-_params.yaw_rate_max, _params.yaw_rate_max)

;//限幅

/* feed forward yaw setpoint rate */

_rates_sp(2

)+= yaw_sp_move_rate * yaw_w * _params.yaw_ff;

//前饋

向量叉乘

向量點乘

a•b=︱a︱︱b︱cosθ

叉乘運算元

將向量叉乘形式表示為叉乘矩陣與向量的乘積

pixhawk之姿態控制篇

pixhawk原生韌體px4之位姿控制演算法解讀

關於px4原始碼中固定翼姿態控制

在看完px4固定翼的姿態控制 後,我有幾點思考 1.我們知道程式中姿態控制的方法是將控制角度轉化為控制角速度。那pitch來說,先求出設定的pitch和當前的pitch的差值 delta pitch 然後將delta pitch除以時間常數得到目標pitch rate。接著將目標pitch rate...

PX4原始碼分析4 PX4軟體結構

px4自動駕駛儀軟體可分為三大部分 實時作業系統 中介軟體和飛行控制棧。提供posix style的使用者操作環境,進行底層的任務排程。px4中介軟體執行於作業系統之上,提供裝置驅動和乙個微物件請求 micro object request broker,uorb 用於駕駛儀上執行的單個任務之間的非...

PX4二次開發 基於mahony演算法的姿態估計

px4裡面有兩種姿態估計演算法,一種是基於ekf的,還有一種是基於mahony的,雖然mahony演算法簡單而且計算量少,但效能並不輸ekf多少。這裡我們講一下基於mahony的姿態估計演算法,本來我還想在正式開始前為大家補充一下座標系 四元數 尤拉角和旋轉矩陣等一些基礎知識,不過筆者最近又是期末考...