找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5203|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

無(wú)人機(jī)擴(kuò)展應(yīng)用問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
之前在網(wǎng)上搜無(wú)人機(jī)避障在發(fā)現(xiàn)了“PlayUAV匯聚開(kāi)源力量”上看到“多旋翼通用避障開(kāi)源項(xiàng)目”(http://www.playuav.com/article/242),這個(gè)作者是湖南工業(yè)大學(xué)的20歲小伙子,昵稱(chēng)叫“七煙”,現(xiàn)在是“多旋翼避障系統(tǒng)開(kāi)發(fā)”QQ群的群主。

在這個(gè)帖子里看到他所引用的由魏宇科提出的“用Arduino擴(kuò)展無(wú)人飛行器”的新思路,魏宇科在百度上就能搜到,是第九屆全國(guó)高職高專(zhuān)“發(fā)明杯”大學(xué)生創(chuàng)新創(chuàng)業(yè)大賽一等獎(jiǎng)的獲得者,他這篇帖子是在“ARDUINO中文社區(qū)”,題為“用Arduino擴(kuò)展無(wú)人飛行器+普及無(wú)人機(jī)知識(shí),不會(huì)算法的人必看”(http://www.arduino.cn/thread-11353-1-1.html),魏宇科的QQ群是“Arduino擴(kuò)展無(wú)人機(jī)”。

我這里之所以寫(xiě)這個(gè)帖子,主要是看到很多人對(duì)此也感興趣,但在應(yīng)用和參考上,很多都是照搬照抄,囫圇吞棗式的進(jìn)行,存在的一些問(wèn)題也是繼續(xù)在使用。為此,從我的角度對(duì)兩位的工作做一些錦上添花的補(bǔ)充和進(jìn)一步的優(yōu)化等工作。此外,他們的工作是在Atmega2560上做的,我這里簡(jiǎn)化了,在Atmega328p上做了一些工作,很多東西我并沒(méi)有做完整,只是為了說(shuō)明問(wèn)題,做了局部的工作。

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

首先來(lái)對(duì)兩位之前的工作談?wù)勛约旱囊恍┛捶ǎ?br />
1. 魏宇科的“Arduino擴(kuò)展無(wú)人機(jī)”

1.1 優(yōu)點(diǎn)

在接收機(jī)和飛控之間插入的方式很好,這使得避障與飛控程序無(wú)關(guān),從而降低了開(kāi)發(fā)難度,門(mén)檻比較低,在這里不僅可以實(shí)現(xiàn)避障,只要有想法就可在這里實(shí)現(xiàn)你想要的其他一些功能,大家可以自由設(shè)想,并努力實(shí)現(xiàn)。

1.2 不足

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

(2)遙控信號(hào)輸出的校準(zhǔn)與修正比較繁瑣,輸出精度比較低,這個(gè)問(wèn)題,我做了一些改進(jìn)。

2. “七煙”的避障工作

2.1 優(yōu)點(diǎn)

提出了一個(gè)實(shí)用、具體的工作;用中斷獲取接收機(jī)的AIL和ELE信號(hào),提高了解讀遙控信號(hào)的實(shí)時(shí)性。

2.2 不足

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

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

(3)在沒(méi)有障礙物的情況下,上述所說(shuō)的重復(fù)周期要求很長(zhǎng),我實(shí)測(cè)了一款,從發(fā)射到檢測(cè)完成的時(shí)間為 216.972ms,這是一個(gè)超聲波測(cè)量所需要的時(shí)間,要是4個(gè)超聲波,加在一起的時(shí)間在無(wú)障礙的情況下就要 867.888ms 了,這個(gè)時(shí)間近 1 秒了,這樣遙控相應(yīng)時(shí)間以及避障的響應(yīng)時(shí)間都存在很大的隱患。

我發(fā)現(xiàn)的這些不足,在我的工作中做了一些優(yōu)化和改進(jìn)。

3. 改進(jìn)與優(yōu)化

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

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

下面中斷處理函數(shù)與“七煙”的基本相同,但我加了一句,還是“*****”部分。
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); //*****
}
新增加的部分表示在沒(méi)有要處理的情況下(通過(guò)設(shè)置一個(gè)標(biāo)識(shí)Ob_ST判斷),遙控器解碼后立即輸出這個(gè)通道的遙控信號(hào)給飛控,在這里輸出,而不是在主循環(huán)loop里等其他處理函數(shù)處理完成后再輸出,這樣實(shí)時(shí)性就幾乎與遙控器直接操作完全相同了,僅延時(shí)最大2ms的時(shí)間,遙控信號(hào)更新率仍保持在20ms左右。

而且輸出使用“writeMicroseconds()”函數(shù),參數(shù)變量是us,比魏宇科所用的“write()”函數(shù)精度高多了,而且不用校準(zhǔn)和修正了,因?yàn)楸3至嗽瓉?lái)的遙控輸出信號(hào)精度和范圍不變,如果非要校準(zhǔn)的話也很簡(jiǎn)單,將實(shí)測(cè)值直接給下列語(yǔ)句即可。
OUTAIL = map(rc1_val, rc1_min, rc1_max, 1000, 2000);
其中,rc1_min是遙控器該通道輸出的最小值;rc1_max是遙控器該通道輸出的最大值。將遙控器的輸出規(guī)范到1000us到2000us之間。

3.2 超聲波測(cè)距的改進(jìn)

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

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

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

避障擴(kuò)展板原理圖:


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

進(jìn)一步的擴(kuò)展方法可以使用原理圖中的RC1對(duì)接收機(jī)的PPM信號(hào)進(jìn)行解碼,這樣就可實(shí)現(xiàn) 8 通道接收信號(hào)的中斷實(shí)時(shí)處理,也可以做更多、更豐富的擴(kuò)展功能了。


如果有人感興趣的話,我將繼續(xù)說(shuō)上面還未說(shuō)到的一些問(wèn)題,且聽(tīng)下回分解吧!。

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

使用道具 舉報(bào)

沙發(fā)
ID:395223 發(fā)表于 2018-9-8 02:47 | 只看該作者
這個(gè)文章寫(xiě)的真不錯(cuò)。非常好。
回復(fù)

使用道具 舉報(bào)

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

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表