1. 程式人生 > >DJI開發之航線重疊率的計算

DJI開發之航線重疊率的計算

介紹

無人機在規劃一塊區域的時候,我們需要手動的給予一些引數來影響無人機飛行,對於一塊地表,無人機每隔N秒在空中間隔的拍照地表的一塊區域,在整個任務執行結束後,拍到的所有區域照片能夠完整的表達出一塊地表,那這次任務就是成功的。 當然,如果想完整的把一塊地表拍下來也很簡單,我們完全可以不停的去拍照,飛行的間隔特別小,但這不是我們想要的,因為這種方式比較浪費資源,我們想要的是在可能的情況下,以最少的航線規劃、最少的圖片數量來詮釋這塊地表,畢竟wayPoint最多隻能執行99個。

重疊率

重疊率又分航向重疊率和旁向重疊率:

  • 航向重疊率:指無人機在一條航線前進拍照時,第一次拍照的圖片與第二次重疊的概率
  • 旁向重疊率:指無人機在第一條航線拍的照片與第二條航線拍的照片重疊的概率

航向重疊率

用一張圖來表示,綠色圖塊是第一次拍照拍到的地表區域,紅色圖塊是第二次拍照拍到的地表區域,他倆重疊的部分的區域相對於他們自己來說就叫做航向重疊率。假設我們現在設定這次無人機飛行的航向重疊率為50%,那麼重疊的部分正好是他們自身的一半,那麼能不能設定重疊率為100%呢?當然不行,這樣話,綠色塊和紅色塊就是一個完美的重合,也就意味著第一次拍照和第二次拍照都在同一個地方,無人機就根本不會往前飛行了,而是停留在那。

旁向重疊率

image.png | center | 445x181

綠色塊是我們在第一條航線中拍到的區域,紅色塊是我們第二條航線拍到的區域,他倆重疊的部分相對於他們自己來說就叫做旁向重疊率,旁向重疊率是影響航線規劃間隔的唯一因素,我們需要通過重疊率來計算出飛行路徑的間隔,當然,此處的重疊率也不能設定為100%,如果設定100%的話,那麼紅色塊就會和綠色塊重疊,也意味著第一條航線和第二條航線重疊,無人機也就只會在一條航線上來來回回的飛行。

焦距與畫幅

如果想知道一張圖片所拍到的區域真實面積的話,那麼焦距與畫幅是離開不的因素。

image.png | center | 552x400

如圖所示,當前無人機是正向向我們飛過來的,我們需要求 拍攝到的真實的距離 ,其實看到圖我們就能猜到,這是一個相似三角形的運算,計算公式:

image.png | left | 247x93

那麼,也就意味著我們需要知道焦距、畫幅、無人機高度這些已知值,才能計算出拍攝到的真實距離。

焦距

焦距的獲取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(單位為毫米) } 複製程式碼

畫幅

畫幅是一個固定值,分為長畫幅與短畫幅,上圖中僅僅只是一個平面圖,無法表示長畫幅與短畫幅的意思,我們對上圖再做個立體圖也就知曉了

image.png | center | 600x388

畫幅其實是一個矩形,也正好對應我們拍攝到的照片是一張矩形的照片,畫幅的預設值為。

  • 長畫幅: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)
複製程式碼

最終將航線距離丟給航線路徑規劃公式,計算出任務所執行的航點