無人機在規劃一塊區域的時候,咱們須要手動的給予一些參數來影響無人機飛行,對於一塊地表,無人機每隔N秒在空中間隔的拍照地表的一塊區域,在整個任務執行結束後,拍到的全部區域照片可以完整的表達出一塊地表,那此次任務就是成功的。 固然,若是想完整的把一塊地表拍下來也很簡單,咱們徹底能夠不停的去拍照,飛行的間隔特別小,但這不是咱們想要的,由於這種方式比較浪費資源,咱們想要的是在可能的狀況下,以最少的航線規劃、最少的圖片數量來詮釋這塊地表,畢竟wayPoint最多隻能執行99個。java
重疊率又分航向重疊率和旁向重疊率:ide
用一張圖來表示,綠色圖塊是第一次拍照拍到的地表區域,紅色圖塊是第二次拍照拍到的地表區域,他倆重疊的部分的區域相對於他們本身來講就叫作航向重疊率。假設咱們如今設置此次無人機飛行的航向重疊率爲50%,那麼重疊的部分正好是他們自身的一半,那麼能不能設置重疊率爲100%呢?固然不行,這樣話,綠色塊和紅色塊就是一個完美的重合,也就意味着第一次拍照和第二次拍照都在同一個地方,無人機就根本不會往前飛行了,而是停留在那。spa
綠色塊是咱們在第一條航線中拍到的區域,紅色塊是咱們第二條航線拍到的區域,他倆重疊的部分相對於他們本身來講就叫作旁向重疊率,旁向重疊率是影響航線規劃間隔的惟一因素,咱們須要經過重疊率來計算出飛行路徑的間隔,固然,此處的重疊率也不能設置爲100%,若是設置100%的話,那麼紅色塊就會和綠色塊重疊,也意味着第一條航線和第二條航線重疊,無人機也就只會在一條航線上來來回回的飛行。設計
若是想知道一張圖片所拍到的區域真實面積的話,那麼焦距與畫幅是離開不的因素。code
如圖所示,當前無人機是正向向咱們飛過來的,咱們須要求 拍攝到的真實的距離
,其實看到圖咱們就能猜到,這是一個類似三角形的運算,計算公式:cdn
焦距的獲取Dji已經給出了API,咱們能夠直接獲取。blog
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(單位爲毫米)
}
複製代碼
畫幅是一個固定值,分爲長畫幅與短畫幅,上圖中僅僅只是一個平面圖,沒法表示長畫幅與短畫幅的意思,咱們對上圖再作個立體圖也就知曉了圖片
畫幅實際上是一個矩形,也正好對應咱們拍攝到的照片是一張矩形的照片,畫幅的默認值爲。資源
因爲每次在規劃航線時,無人機高度是用戶自由進行選擇拖動的,因此也是一個已知值,每次拖動無人機高度,航線會從新進行規劃get
下面是一個通用的計算公式,計算出非重疊部分的真實距離
/** * @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)
複製代碼
最終將航線距離丟給航線路徑規劃公式,計算出任務所執行的航點