|
之前在網(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)
2016-4-11 15:56 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
避障擴(kuò)展板原理圖:
164943jjxnh0s10o12qzl0.jpg (182.17 KB, 下載次數(shù): 160)
下載附件
2016-4-11 18:02 上傳
這里的程序只做了接近距離的比例避障,大家可以考慮加速接近速度項(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)下回分解吧!。
|
|