當前位置:編程學習大全網 - 源碼下載 - PX4源碼閱讀筆記:姿態外環PID控制器:AttitudeControl類

PX4源碼閱讀筆記:姿態外環PID控制器:AttitudeControl類

實現了基於四元數的姿態外環PID控制器(實際上是P+前饋)。

類的定義及實現存放在:mc_att_control/AttitudeControl

控制器輸入為NED坐標系下四元數表示的當前姿態q和期望姿態qd,輸出為機體坐標系下三軸的角速度。

如何由NED坐標系下表示的q和q_d得到在機體坐標系下的姿態誤差是關鍵,本來這個誤差由q.inversed() * qd就可以得到,但是考慮了優先控制roll和pitch,就有壹些復雜,下面進行解釋。

註:網上查到的這部分的源碼解讀大部分是舊版本的,本文基於V1.10.1版本。

作用是給P參數賦值。

由於控制策略是優先控制roll和pitch,所以並不是直接把proportional_gain賦值給私有變量_proportional_gain。

具體方式為:

給控制器輸出的角速度設置limit

PID控制器的實現。

將q和qd單位化

q.dcm_z()得到的是將q轉化為方向余弦矩陣,並取第三列形成的向量。

所以根據方向余弦的定義,e_z和e_z_d即為當前機體坐標系和期望機體坐標系的z軸在NED坐標系下的表示。

第三行調用了Quatf類的其中壹種構造函數,qd_red代表的是從e_z旋轉到e_z_d的四元數。

可以這樣理解:當前姿態坐標系經過qd_red代表的旋轉之後,兩個坐標系(當前姿態坐標系和期望姿態坐標系)的z軸是對齊的。我們把這個z軸對齊的狀態定義為壹個中間狀態。可以認為 qd_red包含了roll和pitch的誤差信息

註意此時qd_red只是代表了壹個旋轉(q->qd),並不像q和qd代表了姿態(NED->q和NED->qd)。

由於於e_z和e_z_d是在NED坐標系下的向量,所以得到的qd_red也是在NED下表示的。

接下來是對壹種極端情況的考慮

q_mix代表從中間狀態qd_red到期望姿態qd的旋轉四元數 在qd_red系 下的表示,可以表征yaw的誤差。下面進行解釋。

對q_mix規範化。

因為同壹個旋轉可以由互為相反數的兩個四元數表示。為了避免奇異,進行統壹表示。

由前面我們知道,q_mix代表從中間狀態qd_red到期望姿態qd的旋轉四元數在qd_red系下的表示,可以表征yaw的誤差。,由於中間狀態qd_red坐標系與期望姿態qd坐標系的z軸是重合的,所以q_mix在qd_red系下的表示應該是 , 為旋轉角,即只有q_mix(0)和q_mix(3)的值是我們需要的。

所以經過了_yaw_w參數作用後的,在反推回來得到的qd與最開始給定的qd以經有所變化,即最後算出來的roll和pitch的期望角速度相同,但計算出來的yaw的期望角速度根據_yaw_w的大小會有所減小,這樣就實現了優先控制roll和pitch。

qe即為從q旋轉到qd的的四元數在機體坐標系下的表示,即誤差。

使用sin(alpha/2)縮放的旋轉軸作為姿態誤差(參見軸角定義的四元數)

還要考慮對映單元四元數的歧義性

得到期望的三軸角速度(用P參數乘以誤差),並且加上yaw的前饋。

yawspeed_feedforward是繞NED系z軸旋轉的前饋增益,但是我們需要在機體坐標系中應用它。

因此,我們通過取R的最後壹列來推斷出世界z軸(在body frame中表示)。將其取逆(== q.inversed)並將其乘以偏航設定值率(yawspeed_feedforward)。

這就產生了壹個在機體系下表示的前饋的向量。

限幅,返回期望角速度。

整個過程大致為:

這樣壹系列操作,可以達到優先控制roll&pitch的效果。

有慣性坐標系 ,以及表示在 下的兩個單位四元數 ,此時若存在 ,滿足:

那麽 有什麽幾何意義?

初次接觸,如有錯誤歡迎批評指正。

  • 上一篇:win8系統出現藍屏故障提示錯誤代碼0x00000050如何解決
  • 下一篇:燕窩可以用紫砂鍋燉煮嗎?燕窩正確的燉煮方法推薦
  • copyright 2024編程學習大全網