1. 程式人生 > >無人機PX4韌體—感測器多冗餘機制測評討論

無人機PX4韌體—感測器多冗餘機制測評討論

在開源無人機領域,感測器多冗餘一直是PIXHAWK這款飛控的有別於其他開源飛控的特色和硬體成比較高的地方。我們從PIXHAWK控制板的硬體和軟體兩方面結合LOG日誌來分析它的感測器多冗餘機制。


MPU6000   3軸加速度和3軸陀螺儀

L3GD20     3軸陀螺儀

LSM303D   3軸加速度計和3軸磁力計

HMC5883   3軸磁力計

MPU9250   3軸加速度 3軸磁力計 3軸陀螺儀(最新版v2飛控才有)

飛控的感測器多冗餘通過以上的感測器的組合,就構成了2個IMU。新版的V2在加入了一個MPU9250,就構成了3 IMU的組合。


關鍵詞:sensor_combined,投票機制,confidence。

在函式中sensors.cpp是處理多冗餘的基本函式。

MPU6000.cpp   L3GD20.cpp

HMC5883.cpp  LSM303D.cpp 

這幾個驅動函式釋出的

sensor_gyro

 sensor_mag

Sensor_accel ,uorb資料。

由sensors.cpp訂閱,由VotedSensorsUpdate類做投票選擇出2個(或者3個)感測器裡面最可信的那一組資料,給EKF2做姿態解算和位置解算。


上面的感測器不斷的傳送出2組Accel/Gyro/Mag資料,投票機制選擇出最可信的一組感測器資料(VotedSensorsUpdate)。這樣就做到了多冗餘機制。所以後來的V2版本的韌體添加了一個MPU9250,那麼就是3冗餘的IMU了。換句話說你新增一個IMU,做4冗餘的飛控也是同理了。

但是筆者以為還有一種多冗餘IMU機制,就是每個單獨的Accel/Gyro/Mag都去做EKF濾波,得出的IMU資料在來投票。這樣似乎更為合理些,因為EKF2的濾波運算,計算量大,有計算崩潰的風險,EKF2解算崩潰,無論有幾個IMU冗餘,都會導致飛機失控。如果是多個EKF2獨立解算,那麼EKF2解算崩潰的機率將會小很多。但是這樣一來目前版本的硬體的運算能力不足以支撐多個EKF2的運算。從官方的跡象來看,這種獨立的EFK2 解算將會是以後的方向。

投票機制的核心演算法:

在Firmware/src/lib/ecl/validation這個資料夾裡面是投票機制的核心,摘抄程式碼如下:

while (next != nullptr) {

float confidence = next->confidence(timestamp);

if (static_cast<int>(i) == pre_check_best) {

pre_check_prio = next->priority();

pre_check_confidence = confidence;//置信區間

}

/*

 * Switch if:

 * 1) the confidence is higher and priority is equal or higher

 * 2) the confidence is no less than 1% different and the priority is higher

 */

if ((((max_confidence < MIN_REGULAR_CONFIDENCE) && (confidence >= MIN_REGULAR_CONFIDENCE)) ||

(confidence > max_confidence && (next->priority() >= max_priority)) ||

(fabsf(confidence - max_confidence) < 0.01f && (next->priority() > max_priority))

) && (confidence > 0.0f)) {

max_index = i;

max_confidence = confidence;

max_priority = next->priority();

best = next;

}

next = next->sibling();

i++;

}

/* the current best sensor is not matching the previous best sensor,

 * or the only sensor went bad */

if (max_index != _curr_best || ((max_confidence < FLT_EPSILON) && (_curr_best >= 0))) {

bool true_failsafe = true;

/* check whether the switch was a failsafe or preferring a higher priority sensor */

if (pre_check_prio != -1 && pre_check_prio < max_priority &&

fabsf(pre_check_confidence - max_confidence) < 0.1f) {

/* this is not a failover */

true_failsafe = false;

/* reset error flags, this is likely a hotplug sensor coming online late */

best->reset_state();

}

/* if we're no initialized, initialize the bookkeeping but do not count a failsafe */

if (_curr_best < 0) {

_prev_best = max_index;

} else {

/* we were initialized before, this is a real failsafe */

_prev_best = pre_check_best;

if (true_failsafe) {

_toggle_count++;

/* if this is the first time, log when we failed */

if (_first_failover_time == 0) {

_first_failover_time = timestamp;

}

}

}

/* for all cases we want to keep a record of the best index */

_curr_best = max_index;

}

*index = max_index;

return (best) ? best->value() : nullptr;

筆者搜了很多資料也找不到具體的演算法採用,感覺是用到置信區間相關的概率統計理論。


只能通過現象推斷結果,如果誰對這個有研究,還希望賜教。我們做如下實驗,我們用軟磁或者硬磁去幹擾外接的磁羅盤,分別在log日誌裡面記錄下外接磁羅盤的資料,在記錄下經過投票機制,投票得出的資料。再和真實的地理磁羅盤資料做比對。看投票機制得出的資料是不是可信的。從一個方面驗證下這個投票機制的資料抗干擾能力怎麼樣。有如下工作要完成:

1 修改LOG日誌,單獨記錄外接磁羅盤HMC5883的資料和303D的磁羅盤資料

2 干擾或者切斷HMC5883的資料,干擾內建磁羅盤資料

3 外接磁羅盤資料和投票機制的資料和303D磁羅盤資料做比較,分析其抗干擾性能


採用兩種方式干擾和切斷了磁羅盤資料,來分析LOG日誌,判斷PX4的多冗餘策略是否有效。

如果有效的感測器多冗餘策略有如下特點:

1 如果一路外接磁羅盤感測器資料完全失效,內建的磁羅盤資料還是可以工作,系統還是正常工作。

2 如果一路外接的磁羅盤資料受到干擾,內建的沒有受到干擾的磁羅盤資料還是正常工作,系統的航向資料沒有受到大的干擾。

實際測試的LOG日誌如下:


我們可以直觀的看到干擾外接磁羅盤和干擾內建磁羅盤,航向資料均會受到很大的干擾,即便外接磁羅盤架高,內建磁羅盤受到干擾,航向資料也會受到一定程度的干擾。但是有些效果的是,我們直接拔掉了外接磁羅盤,但是系統的磁羅盤資料還是有的。

我們可以推測一下,其他陀螺儀,加速度計等感測器的多冗餘策略,和磁羅盤採用的一樣的演算法,也是類似的效果。只能夠應對感測器資料完全失效的情況,不能應對感測器資料干擾的情況。

那就是說PX4韌體的多冗餘策略的抗干擾性能,不是非常好,有很大的改進空間,我感覺這是一個比較好的研究課題和方向。

注:這是我們阿木實驗室PX4中級視訊教程討論的內容,如果想觀看完整的視訊教程和原始碼,請在我們微信公眾號回覆。 

技術發展的日新月異,阿木實驗室將緊跟技術的腳步,不斷把無人機行業最新的技術和硬體推薦給大家。看到經過我們培訓的學員在技術上突飛猛進,是我們培訓最大的價值。如果你在無人機行業,就請關注我們的公眾號:阿木實驗室,我們將持續釋出無人機行業最有價值的資訊和技術。