利用樹莓派打造一款避障小車(轉-學習)

        樹莓派是爲學習計算機編程教育而設計,只有信用卡大小的微型電腦,最早的系統基於Linux,隨着Win10 IOT的發佈,現在樹莓派也可以運行Windows。樹莓派雖然只有信用卡大小,但是內心卻非常的強大,視頻,音頻等功能都是有的,現在樹莓派3版本有1G內存,1.2GHZ頻率,擁有操作系統的樹莓派預留了40個可以驅動各種傳感器和驅動器的I/O接口,所以我們使用樹莓派作爲機器人的控制器,將控制軟件寫入樹莓派的TF卡中,然後這個軟件通過GPIO接口就能控制驅動和傳感器了。推薦大家學習書籍《樹莓派機器人藍圖權威寶典

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

640?wx_fmt=jpeg

樹莓派和其他機器人的控制器有着本質的不同,因爲樹莓派有完善的操作系統(其他的只有控制系統)並且對Python支持的非常的好。所以使用Python語言可以快速的在樹莓派上開發軟件去控制機器人的傳感器,樹莓派還有另外一個優勢就是她能夠運行人工智能相關的算法,比如可以在上面運行SVM,能簡單的對數據進行分類。

將樹莓派作爲機器人的大腦是未來的趨勢,本場Chat圍繞如何使用樹莓派開發智能機器人控制系統展開,包括以下內容。

1. Raspbian操作系統介紹

樹莓派的操作系統Raspbian的開發者是麥克·湯姆森和彼得·格林。該系統爲官方推薦的操作系統。它巧妙地將Paspberry和Debian的名字合併成了一個單詞。Raspbian是基於Debian的專爲Cotex-A系列開發的能運行在樹莓派上的操作系統。Debian是另一種發行版Ubuntu的基礎,而Ubuntu是最爲流行的Linux桌面系統,本系統擁有良好的社區支持。Raspbain系統附帶着35000多個軟件包,並集成了輕量級的圖形界面LXDE。Raspbian提供了完善的功能,並且組織的非常好,能夠支持最新的硬件和軟件。

隨着樹莓派在極客社區中的廣泛使用(目前樹莓派總共賣出去了1250萬臺),樹莓派已經成爲世界第三大計算平臺(前兩個是windows和mac),所以樹莓派基金會(備註:樹莓派是由樹莓派基金會開發的一款微型電腦,基金會只是設計電路圖,設計操作系統和維護社區,樹莓派的生產現在有RS和element14兩家工廠進行)爲桌面電腦打造了一款操作系統:Raspbian Pixel。

2. 使用python開發傳感器驅動庫GPIO庫

前面我說過,樹莓派打造的機器人主要是利用GPIO接口去控制機器人的驅動和各種傳感器,因爲樹莓派有操作系統,所以使用Python可以開發控制軟件,現在有很多的庫文件支持,比如:https://github.com/RPi-Distro/python-gpiozero,這個庫文件就對樹莓派的GPIO支持的非常好。

樹莓派的多個可編程的GPIO(General Purpose Input/Output)接口,可以用來驅動各種外設(如傳感器,步進電機等)。目前在樹莓派上流行的 GPIO 開發環境主要有兩種,Python GPIO 和基於 C 語言的 wiringPi。我們推薦 Python GPIO,因爲 Python 不僅上手簡單,而且其解釋語言的特性使得程序不用編譯,對代碼做了任何修改之後就能直接運行,極大方便了調試。

所以我羅列一些GPIO的庫文件供大家參考:

  • https://github.com/projectweekend/Pi-GPIO-Server

  • https://github.com/adafruit/AdafruitPythonGPIO

  • https://github.com/alaudet/hcsr04sensor

  • https://github.com/vitiral/gpio

3. 步進電機和超聲波傳感器

機器人分成四大部件:

  • 機器人控制系統,這部分有人稱爲是機器人大腦部分。

  • 機械部分,機器人都是要執行一定的任務的,這部分任務就是機械部分完成的。

  • 感知部分,機器人要不斷的感知周圍環境,並且通過感知進行信息或者數據的傳輸。

  • 驅動部分,機器人通過驅動部件鏈接機械和傳感器,從而驅動機械部件執行一定的任務。

步進電機顧名思義就是一步一走的一種驅動器,目前市面上對於小型服務級機器人有很多步進電機,大家可以通過搜索引擎或者電商網站找到相關的步進電機。

步進電機和超聲波傳感器都是協助樹莓派實現功能的重要外設。通過Python編寫相應程序後(編寫的這些程序通過一定的工具燒進樹莓派的TF卡中),我們可以驅動步進電機在不同時間正轉和反轉,從而帶動相關連接部件的轉動,例如:智能小車的車輪作向前或向後的運動;機械手的不同關節的擺動及夾取物品;無人機多軸螺旋槳的同步旋轉實現升空。超聲波傳感器是利用超聲波的特性研製而成的傳感器。而安裝了超聲波傳感器的智能機器人,在樹莓派的控制下可以識別放在周圍的障礙物,前後移動超聲波測距儀,將收集的信號傳輸回到數據處理中心,數據處理中心會顯示測得的距離,完全可以實現小車壁障的功能。

因爲我們想打造一款能夠自動壁障的智能小車,所以我們要使用超聲波傳感器作爲能識別物體的傳感器,目前市面上有很多的超聲波傳感器,傳感器主要的技術指標是精度和性價比。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

我們以一個實例看看如何將步進電機和超聲波傳感器融合起來,這裏我們將使用樹莓派組建自導航尋跡小車,並且在下一個章節中我們講解一下如何利用CNN對着部分代碼改寫,從而實現自動駕駛的功能。

通過閱讀本章內容你將學到如下內容:

  • 如何使用GPIO接口控制直流電機的速度

  • 如何使用樹莓派編程控制移動平臺

  • 如何爲尋跡小車規劃路線

爲了完成這個項目,你必須準備如下的硬件:

  • 一個樹莓派

  • 一個至少8G的是class10的TF卡

  • 一個如下圖的小車地盤

    640?wx_fmt=png

連接電機驅動板的方法如下:

  • 將電機驅動板安裝在樹梅派上。

  • 將電源上的電源線連接到驅動板上的電源輸入端,電壓爲6-7v。也可以使用4節AA電池或者2SLiPo鋰電池,將地線和電源線連接到點擊驅動板上。

  • 接下來,將其中一個驅動信號連接到驅動板上電機1的驅動端口上。將電機1連接到右側電機,電機2連接到左側。

  • 最後將第二個驅動信號鏈接到驅動板上電機2的驅動端口上。

640?wx_fmt=png

在樹莓派中增加相應的python代碼用於驅動電機和超聲波傳感器。

640?wx_fmt=png

代碼的第二部分驅動兩個電機,實現對尋跡小車前後進行和轉彎的控制,代碼如下圖所示。

640?wx_fmt=png

我們通過上述的代碼基本清楚了我們需要的代碼如何才能驅動相應的電機完成這個工作。

640?wx_fmt=png

根據之前的說明,rr.set_motors()可以實現單獨指定每個電機的速度和方向。現在已經有基本的代碼實現對尋跡小車的驅動,還需要進一步修改這些代碼來實現在其他Python程序中調用這些函數。還需要增加一些標準位移使尋跡小車能夠按照指定角度轉向或移動一定距離。代碼如下圖所示:

640?wx_fmt=png

在函數turn_right(angle)和turn_left(angle)中指令time.sleep(angle/20)使尋跡小車按照轉向角度大小運動一定的時間達到指定的轉向角度。根據實際情況可能需要修改一下分母20的大小來實現準確的轉向。指令time.sleep(value)使尋跡小車根據value值大小運動一定的時間來實現運動指定距離。接下來爲了實現尋跡小車的運動,需要將傳感器連接到尋跡小車上以便讓小車知道其附近的情況。

最後,將傳感器連接到樹莓派上,通過麪包板對樹莓派的軟件進行測試,電路圖如下:

640?wx_fmt=png

當傳感器連接完成後,需要一段代碼來讀取傳感器返回的數值,先將傳感器固定(在靜態測試情況下),然後程序轉換成距離,下圖是程序的Python代碼。

640?wx_fmt=png

然後運行這部分代碼,我們就看到了超聲波傳感器測距的結果了。

通過上述的代碼我們基本上清楚瞭如何通過樹莓派控制電機、也知道了我們如何控制樹莓派,通過超聲波傳感器的數據反饋給樹莓派控制程序,然後樹莓派做出決策,並將這個決策再次反饋給驅動電機,電機做出正轉或者反轉的相應,此時小車是前進或者後退。

通過上面的介紹我們瞭解到我們要使用手動去控制小車的前進或者後退,那麼小車如何選擇路勁呢?下面就重點講講設置動態規劃路勁。

自動規劃路線意味着在遇到障礙之前,不可能完全預知障礙的存在。你的設備需要自行決定運行過程中如何前進。這是一個複雜的問題,但是如果想要你的設備自如地在環境中運行,有幾個基本的概念需要了解和應用。讓我們先來解決當你知道要讓設備運行到哪裏時的線路規劃問題,然後再在線路上加一些障礙物。

基本線路規劃

爲了學習動態線路規劃,也就是在預先不知道障礙物存在時的線路規劃問題,需要通過下面這個框架來了解設備的位置以及設備要運行到的目標位置。

640?wx_fmt=png

這個網格有三個關鍵位置,具體解釋如下:

  • 左下角的點是一個固定參照位置,X軸和Y軸的方向也是固定的,其他點的 位置都可以根據該參照點和X軸、Y軸確定。

  • 第二個關鍵位置是機器人的起點。尋跡小車會根據X座標和Y座標保持自身 相對於X軸、Y軸上直到目標位置爲止的一些固定參考點位置的軌跡。它會使用 指南針來跟蹤這些方向。

  • 第三個關鍵位置是目標位置,目標位置也會用X軸和Y軸上相對於固定參照位置 的座標來表示。如果知道起點以及起點和目標位置之間的角度,就可以規劃到 達目標位置的最優的(距離最短)路線。可以根據目標位置、尋跡小車的位 置和一些簡單的數學公式來計算尋跡小車和目標位置之間的距離和角度。

對於路勁規劃有一個公式處理,大家查閱幾何書籍就能找到相關的數學公式,我們用一個示意圖進行表示。

640?wx_fmt=png

我們可以用一段很簡單的python代碼來實現以上操作,讓軌跡小車向前運動和轉向,我們將這個文件命名爲robotLib.py的文件,它包括了所有伺服初始化設定的使尋跡小車向前運動或轉向的程序。然後使用from compass import *這行代碼調用路勁規劃的程序和管理,我們同樣通過這行代碼將指南針程序導入其中,完整的代碼如下:

640?wx_fmt=png

壁障

上面我們講述了無障礙路勁規劃,是比較簡單的,但是當尋跡小車需要繞過障礙物時,規劃路勁就具有更大的挑戰性,假如一個障礙物位於之前所規劃的路勁之上,具體如圖所示。

640?wx_fmt=png

仍然可以使用同樣的計算方法獲得起始的行進角度;但是,現在需要使用聲納傳感器去檢測障礙物。當聲納傳感器檢測到障礙物,尋跡小車就需要停下來並且重新計算避開障礙物的路徑和到達目標位置的路徑。一個很簡單的方法是,當尋跡小車發現障礙物,它向右轉90度,向前行進一段距離,然後再計算最優的路徑。當再次轉到向目標位置運動的方向後,如果沒有障礙物,尋跡小車將會沿着最優路線前進。

爲了檢測障礙物,需要調用傳感器的庫函數。可以使用指南針來更加精確的確定前進角度,使用from compass import * 命令可以導入指南針的庫函數來使用指南針。也可以使用時間的庫函數和time.sleep命令來控制不同指令執行的時長。需要修改track.py的庫函數,使整個命令組不會有一個固定的結束時間,如下圖所示:

640?wx_fmt=png

通過以上的講解我們瞭解瞭如何進行路徑規劃,但是我們想要一個能夠自動駕駛的智能小車改如何做呢?在第四章我們就重點強調如何通過卷積神經網絡去訓練一個自動駕駛的模型。

4. 使用CNN作爲智能小車自動駕駛系統

640?wx_fmt=jpeg

卷積神經網絡(Convolutional Neural Network,CNN)是一種適合使用在連續值輸入信號上的深度神經網絡,比如聲音、圖像和視頻。CNN在無人駕駛3D感知與物體檢測中的有着廣泛的應用。

2016 年 3 月,Mohammad Rastegari 等人在論文中首次提出了 XNOR-Net 的概念。這篇論文旨在利用二值化操作尋找到最優的簡化網絡,並分別介紹了兩種有效的網絡:Binary-Weight-Networks 和 XNOR-Networks。Binary-Weight-Networks 是對 CNN 中所有的權重做近似二值化,可以節省 32 倍的存儲空間。而且,由於權重被二值化,卷積過程只剩加減算法,不再包括乘法運算,可以提高約兩倍的運算速度,這促使 CNN 可以在不犧牲準確率的情況下在小存儲設備上使用,包括便攜式設備。

XNOR-Networks 算法則是對 CNN 中所有的權重和輸入同時做近似二值化,如果卷積運算中的所有操作數都是二進制的,那麼兩個二進制向量的點乘就可以等同於同或運算和位運算。而這些操作天然就被CPU等通用計算設備支持,所以二值化神經網絡能夠跑在普通的CPU和更便宜的ARM芯片甚至是樹莓派等設備上。這就爲CNN移植到樹莓派系統提供了理論基礎。

樹莓派智能小車感知檢測起點與終點之間的地理環境和周圍變化,進而選擇最優路線,躲避危險,就可以真正實現智能小車的自動駕駛。擁有更廣闊的發展前景。

轉自 人人都是極客 https://blog.csdn.net/p23onzq/article/details/78758576#t2



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章