久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5351|回復: 2
打印 上一主題 下一主題
收起左側

無人機擴展應用問題

[復制鏈接]
跳轉到指定樓層
樓主
之前在網上搜無人機避障在發現了“PlayUAV匯聚開源力量”上看到“多旋翼通用避障開源項目”(http://www.playuav.com/article/242),這個作者是湖南工業大學的20歲小伙子,昵稱叫“七煙”,現在是“多旋翼避障系統開發”QQ群的群主。

在這個帖子里看到他所引用的由魏宇科提出的“用Arduino擴展無人飛行器”的新思路,魏宇科在百度上就能搜到,是第九屆全國高職高專“發明杯”大學生創新創業大賽一等獎的獲得者,他這篇帖子是在“ARDUINO中文社區”,題為“用Arduino擴展無人飛行器+普及無人機知識,不會算法的人必看”(http://www.arduino.cn/thread-11353-1-1.html),魏宇科的QQ群是“Arduino擴展無人機”。

我這里之所以寫這個帖子,主要是看到很多人對此也感興趣,但在應用和參考上,很多都是照搬照抄,囫圇吞棗式的進行,存在的一些問題也是繼續在使用。為此,從我的角度對兩位的工作做一些錦上添花的補充和進一步的優化等工作。此外,他們的工作是在Atmega2560上做的,我這里簡化了,在Atmega328p上做了一些工作,很多東西我并沒有做完整,只是為了說明問題,做了局部的工作。

他們兩位的一些作品和工作,你們可參考相關的帖子,或到這兩個群里看看相關的群文件。

首先來對兩位之前的工作談談自己的一些看法:

1. 魏宇科的“Arduino擴展無人機”

1.1 優點

在接收機和飛控之間插入的方式很好,這使得避障與飛控程序無關,從而降低了開發難度,門檻比較低,在這里不僅可以實現避障,只要有想法就可在這里實現你想要的其他一些功能,大家可以自由設想,并努力實現。

1.2 不足

(1)遙控信號解碼
魏宇科的遙控信號解碼采用下述方式
INAIL = pulseIn(AIL1, 1);
INELE = pulseIn(ELE2, 1);
INTHR = pulseIn(THR3, 1);
INRUD = pulseIn(RUD4, 1);
程序效率比較低,實時性不是很好,這一點,“七煙”做了改進,采用了中斷方式。

(2)遙控信號輸出的校準與修正比較繁瑣,輸出精度比較低,這個問題,我做了一些改進。

2. “七煙”的避障工作

2.1 優點

提出了一個實用、具體的工作;用中斷獲取接收機的AIL和ELE信號,提高了解讀遙控信號的實時性。

2.2 不足

(1)AIL.write(OUTAIL)與ELE.write(OUTELE)這兩個輸出,在 loop() 內,而且是在超聲波函數與避障函數之后,那么前面所用的中斷方式獲取的AIL和ELE信號其實時性的優勢就大打折扣了;

(2)HC-SR04正常的、比較好的、合格的模塊,說明書中要求超聲測量的重復周期要大于60ms,超聲測量程序使用的是 pulseIn 函數,而且四個超聲測距是順序執行的,理想情況下,所用的時間需要 240ms 以上,而遙控信號的周期略大于 20ms,這樣就嚴重的影響了避障的響應時間;

(3)在沒有障礙物的情況下,上述所說的重復周期要求很長,我實測了一款,從發射到檢測完成的時間為 216.972ms,這是一個超聲波測量所需要的時間,要是4個超聲波,加在一起的時間在無障礙的情況下就要 867.888ms 了,這個時間近 1 秒了,這樣遙控相應時間以及避障的響應時間都存在很大的隱患。

我發現的這些不足,在我的工作中做了一些優化和改進。

3. 改進與優化

3.1 遙控器中斷方式解碼,與實時輸出

在void setup()中設置中斷,見下面的“*****”部分,這個在“七煙”的工作中已經實現了。
void setup() {
  Serial.begin(115200);
  pinMode(Echo, INPUT); //超聲波測距
  pinMode(Trig, OUTPUT);
  digitalWrite(Trig, LOW);
  pinMode(RC1_In, INPUT); //遙控器 1 通道輸入
  attachInterrupt(0, RC1_Int, CHANGE); //*****
  rco1.attach(4);
}

下面中斷處理函數與“七煙”的基本相同,但我加了一句,還是“*****”部分。
void RC1_Int() { //遙控器 1 通道解碼
  if (digitalRead(RC1_In) == HIGH)
    time0 = micros(); // store the current micros() value
  else
    t_rc1 = micros() - time0;
    if(Ob_ST == 0) rco1.writeMicroseconds(t_rc1); //*****
}
新增加的部分表示在沒有要處理的情況下(通過設置一個標識Ob_ST判斷),遙控器解碼后立即輸出這個通道的遙控信號給飛控,在這里輸出,而不是在主循環loop里等其他處理函數處理完成后再輸出,這樣實時性就幾乎與遙控器直接操作完全相同了,僅延時最大2ms的時間,遙控信號更新率仍保持在20ms左右。

而且輸出使用“writeMicroseconds()”函數,參數變量是us,比魏宇科所用的“write()”函數精度高多了,而且不用校準和修正了,因為保持了原來的遙控輸出信號精度和范圍不變,如果非要校準的話也很簡單,將實測值直接給下列語句即可。
OUTAIL = map(rc1_val, rc1_min, rc1_max, 1000, 2000);
其中,rc1_min是遙控器該通道輸出的最小值;rc1_max是遙控器該通道輸出的最大值。將遙控器的輸出規范到1000us到2000us之間。

3.2 超聲波測距的改進

超聲波測距以前他們直接采用下列語句:
Dist = pulseIn(Echo, HIGH);
這樣的話,在沒有障礙時,超聲波下次測量時必須要等200多ms以上,為此我簡單的加了一個超時限制,譬如超時值為15000us,語句如下:
Dist = pulseIn(Echo, HIGH, 15000);

給出一個單超聲波避障的例程如下。

SR04避障.zip (889 Bytes, 下載次數: 12)

避障擴展板原理圖:


這里的程序只做了接近距離的比例避障,大家可以考慮加速接近速度項,這樣就成了類似PD算法了。

進一步的擴展方法可以使用原理圖中的RC1對接收機的PPM信號進行解碼,這樣就可實現 8 通道接收信號的中斷實時處理,也可以做更多、更豐富的擴展功能了。


如果有人感興趣的話,我將繼續說上面還未說到的一些問題,且聽下回分解吧!!!

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:395223 發表于 2018-9-8 02:47 | 只看該作者
這個文章寫的真不錯。非常好。
回復

使用道具 舉報

板凳
ID:395223 發表于 2018-9-8 02:48 | 只看該作者
寫的很好,對代碼理解得很透徹。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 最新av在线播放 | 麻豆一区二区三区 | av一区二区三区四区 | 91av在线免费观看 | 欧美激情一区 | 91超碰在线观看 | 久久久www | 精品久久久久久一区二区里番 | 久久精品国产免费 | 99视频网| 九月丁香婷婷 | 四虎色| av免费网站 | 亚洲午夜视频在线观看 | 香蕉视频色 | 久久免费影院 | 露出调教羞耻91九色 | h片免费观看 | 91黄色大片| 80日本xxxxxxxxx96| 99视频免费| 黄色一级免费看 | 欧美一二区 | a级片在线观看 | 欧美日韩成人一区二区 | 韩日在线视频 | 日本成人小视频 | 国产美女永久免费无遮挡 | 欧美国产日韩一区 | 久久在线免费观看 | 久久久久久爱 | 免费成人黄色 | 亚洲高清中文字幕 | 999精品视频 | 国产精品国产三级国产 | 日韩亚洲欧美在线 | 黄色在线视频播放 | 午夜久久久 | 久久久久久精 | 日本久久久久 | 九九热这里 |