DJI開發之航線重疊率的計算
介紹
無人機在規劃一塊區域的時候,我們需要手動的給予一些引數來影響無人機飛行,對於一塊地表,無人機每隔N秒在空中間隔的拍照地表的一塊區域,在整個任務執行結束後,拍到的所有區域照片能夠完整的表達出一塊地表,那這次任務就是成功的。 當然,如果想完整的把一塊地表拍下來也很簡單,我們完全可以不停的去拍照,飛行的間隔特別小,但這不是我們想要的,因為這種方式比較浪費資源,我們想要的是在可能的情況下,以最少的航線規劃、最少的圖片數量來詮釋這塊地表,畢竟wayPoint最多隻能執行99個。
重疊率
重疊率又分航向重疊率和旁向重疊率:
- 航向重疊率:指無人機在一條航線前進拍照時,第一次拍照的圖片與第二次重疊的概率
- 旁向重疊率:指無人機在第一條航線拍的照片與第二條航線拍的照片重疊的概率
航向重疊率
用一張圖來表示,綠色圖塊是第一次拍照拍到的地表區域,紅色圖塊是第二次拍照拍到的地表區域,他倆重疊的部分的區域相對於他們自己來說就叫做航向重疊率。假設我們現在設定這次無人機飛行的航向重疊率為50%,那麼重疊的部分正好是他們自身的一半,那麼能不能設定重疊率為100%呢?當然不行,這樣話,綠色塊和紅色塊就是一個完美的重合,也就意味著第一次拍照和第二次拍照都在同一個地方,無人機就根本不會往前飛行了,而是停留在那。
旁向重疊率
綠色塊是我們在第一條航線中拍到的區域,紅色塊是我們第二條航線拍到的區域,他倆重疊的部分相對於他們自己來說就叫做旁向重疊率,旁向重疊率是影響航線規劃間隔的唯一因素,我們需要通過重疊率來計算出飛行路徑的間隔,當然,此處的重疊率也不能設定為100%,如果設定100%的話,那麼紅色塊就會和綠色塊重疊,也意味著第一條航線和第二條航線重疊,無人機也就只會在一條航線上來來回回的飛行。
焦距與畫幅
如果想知道一張圖片所拍到的區域真實面積的話,那麼焦距與畫幅是離開不的因素。
如圖所示,當前無人機是正向向我們飛過來的,我們需要求 拍攝到的真實的距離
,其實看到圖我們就能猜到,這是一個相似三角形的運算,計算公式:
那麼,也就意味著我們需要知道焦距、畫幅、無人機高度這些已知值,才能計算出拍攝到的真實距離。
焦距
焦距的獲取Dji已經給出了API,我們可以直接獲取。
public static Aircraft getAircraft() {
BaseProduct product = getProduct();
if (product != null && product.isConnected()) {
if (product instanceof Aircraft) {
return (Aircraft) product;
}
}
return null;
}
Camera camera=getAircraft().getCamera();
//如果camera不為空,並且當前drone支援焦距
if (camera != null&&camera.isOpticalZoomSupported()) {
camera.getOpticalZoomFocalLength(new CommonCallbacks.CompletionCallbackWith<Integer>() {
@Override
public void onSuccess(Integer integer) {
//獲取到焦距值
}
@Override
public void onFailure(DJIError djiError) {
}
});
}else{
//如果不支援焦距的話,則可以給個預設的焦距值 24(單位為毫米)
}
複製程式碼
畫幅
畫幅是一個固定值,分為長畫幅與短畫幅,上圖中僅僅只是一個平面圖,無法表示長畫幅與短畫幅的意思,我們對上圖再做個立體圖也就知曉了
畫幅其實是一個矩形,也正好對應我們拍攝到的照片是一張矩形的照片,畫幅的預設值為。
- 長畫幅:35mm(單位毫米),與旁向重疊率相關
- 短畫幅:24mm(單位毫米),與航向重疊率相關
計算
由於每次在規劃航線時,無人機高度是使用者自由進行選擇拖動的,所以也是一個已知值,每次拖動無人機高度,航線會重新進行規劃
非重疊距離公式
下面是一個通用的計算公式,計算出非重疊部分的真實距離
/**
* @param height 無人機高度,單位米(m)
* @param frame 畫幅
* @param focal 焦距
* @param ratio 重疊率
*/
public static double get(double height, double frame, double focal, double ratio) {
//todo 如果focal焦距為0的話,則使用預設值值24毫米
focal = focal == 0 ? 24 : focal;
//單位換成米
focal = focal / 1000;
frame = frame / 1000;
//設呈現的真實距離為x
double x;
//拍攝到的距離
x = frame * height / focal;
//設重疊距離
double d;
//重疊部分的距離
d = ratio * x;
//非重疊部分的距離 (單位米)
d = x - d;
return d;
}
複製程式碼
航向重疊計算
已知短畫幅=24mm,假設從無人機拿到的焦距是26mm,高度設定的是100米,重疊率設定80%,則無人機真正拍攝到的距離差為:
double distance=get(100,24,26,0.8)
複製程式碼
現在計算出了無人機在拍攝照片的時候,拍攝第一張的位置與拍攝第二張的位置的距離差,那麼計算這個距離值拿來幹什麼用呢,我們知道,距離=速度*時間
,我們拍照的時間間隔是固定的,假設我們設計的時間是每隔2s進行一次拍照,那麼,我們就可以根據 這個公式計算出 速度
,然後將這個速度設定給 wayPoint
, 當然,這個速度不能超過無人機的最大速度(10m/s),我們可以在此做個判斷,如果超過無人機最大速度,則設定無人機最大速度為 wayPoint
的速度,如果沒有,則反之。我們可能在想,假設公式計算出來的最大速度是20m/s,如果我給他設定了最大速度10m/s的話,不會有影響嗎?其實不然,我們假設飛行的距離是40m,我以20m/s的速度進行飛行,那麼也就是2s就飛完了,如果這時候我下調到10m/s進行飛行,也就是需要4s才能飛完,已知無人機每隔2s進行一次拍照,那麼20m/s的速度只需要拍一張就足夠了,10m/s的就需要拍攝兩張,這並不會影響拍攝的區域,只不過拍攝的照片比預期多了而已。
旁向重疊計算
旁向重疊的計算影響航線的的間隔,對於一塊固定地表,間隔越寬,則飛行的航線就越少,間隔越窄,則飛行的航線就越多,主要影響間隔的就是重疊率。 已知長畫幅=35mm,假設從無人機拿到的焦距是26mm,高度設定的是100米,重疊率設定80%,則航線間距離為:
double distance=get(100,24,26,0.8)
複製程式碼
最終將航線距離丟給航線路徑規劃公式,計算出任務所執行的航點