一、前言
1.1 項(xiàng)目介紹
【1】項(xiàng)目功能介紹
隨著科技的進(jìn)步和農(nóng)業(yè)現(xiàn)代化的發(fā)展,農(nóng)業(yè)生產(chǎn)效率與質(zhì)量的提升成為重要的研究對(duì)象。其中,果蔬采摘環(huán)節(jié)在很大程度上影響著整個(gè)產(chǎn)業(yè)鏈的效益。傳統(tǒng)的手工采摘方式不僅勞動(dòng)強(qiáng)度大、效率低下,而且在勞動(dòng)力成本逐漸上升的背景下,越來(lái)越難以滿足大規(guī)模種植基地的需求。人工采摘還可能因不規(guī)范的操作導(dǎo)致果實(shí)損傷,影響商品果率。
基于視覺(jué)識(shí)別技術(shù)的自動(dòng)采摘機(jī)器人的研發(fā),正是針對(duì)這一問(wèn)題提出的創(chuàng)新解決方案。本項(xiàng)目采用樹(shù)莓派4B作為主控芯片,因其具有強(qiáng)大的計(jì)算能力和豐富的擴(kuò)展接口,可以方便地集成各種傳感器和執(zhí)行機(jī)構(gòu),實(shí)現(xiàn)對(duì)復(fù)雜環(huán)境下的實(shí)時(shí)圖像采集與處理。
項(xiàng)目利用百度飛漿(PaddlePaddle)深度學(xué)習(xí)框架中的目標(biāo)檢測(cè)和分類算法,通過(guò)安裝在機(jī)器人上的高清攝像頭獲取果樹(shù)圖像,并進(jìn)行實(shí)時(shí)分析,精準(zhǔn)識(shí)別出果實(shí)的位置、大小以及成熟度等信息。當(dāng)成功識(shí)別到目標(biāo)果實(shí)后,主控系統(tǒng)將根據(jù)識(shí)別結(jié)果快速計(jì)算出機(jī)械手臂的最佳運(yùn)動(dòng)路徑,控制其移動(dòng)至指定位置,以最適宜的方式完成果實(shí)的高效、無(wú)損采摘。
基于視覺(jué)識(shí)別的自動(dòng)采摘機(jī)器人設(shè)計(jì)與實(shí)現(xiàn)項(xiàng)目旨在解決傳統(tǒng)農(nóng)業(yè)中人工采摘的瓶頸問(wèn)題,通過(guò)人工智能與自動(dòng)化技術(shù)的深度融合,提高果園管理的智能化水平,降低勞動(dòng)成本,提高生產(chǎn)效率,從而推動(dòng)我國(guó)乃至全球農(nóng)業(yè)產(chǎn)業(yè)向更加智能、高效的現(xiàn)代農(nóng)業(yè)轉(zhuǎn)型。
【2】設(shè)計(jì)實(shí)現(xiàn)的功能
(1)視覺(jué)識(shí)別:借助高性能的攝像頭和圖像處理算法(本項(xiàng)目采用百度飛漿的目標(biāo)識(shí)別和分類算法),機(jī)器人能夠捕捉到果園中的果實(shí)圖像,并準(zhǔn)確地從中識(shí)別出目標(biāo)果實(shí)。
(2)定位與導(dǎo)航:在識(shí)別到果實(shí)后,系統(tǒng)會(huì)通過(guò)計(jì)算果實(shí)的空間坐標(biāo)和距離,確定機(jī)械手臂需要到達(dá)的精確位置。同時(shí),機(jī)器人會(huì)根據(jù)果園內(nèi)的環(huán)境信息和路徑規(guī)劃算法,自動(dòng)導(dǎo)航至目標(biāo)果實(shí)附近。
(3)機(jī)械手臂控制:一旦機(jī)器人到達(dá)目標(biāo)位置,機(jī)械手臂會(huì)在系統(tǒng)的精確控制下,自動(dòng)調(diào)整姿態(tài)和動(dòng)作,以輕柔而準(zhǔn)確的方式采摘果實(shí)。這一過(guò)程涉及到復(fù)雜的機(jī)械動(dòng)力學(xué)和協(xié)同控制算法,確保采摘?jiǎng)幼鞯母咝Ш桶踩?/p>
(4)果實(shí)收集與處理:采摘下來(lái)的果實(shí)會(huì)被機(jī)器人收集到專門的容器中,以便后續(xù)的分揀、包裝和處理。系統(tǒng)還可以對(duì)采摘的果實(shí)進(jìn)行數(shù)量統(tǒng)計(jì)和質(zhì)量評(píng)估,為農(nóng)業(yè)生產(chǎn)提供有價(jià)值的數(shù)據(jù)支持。
本項(xiàng)目實(shí)現(xiàn)的功能是一個(gè)完整的自動(dòng)采摘機(jī)器人系統(tǒng),從視覺(jué)識(shí)別到機(jī)械手臂控制,再到果實(shí)收集與處理,形成了一個(gè)高效、智能的自動(dòng)化采摘流程。這不僅大大提高了農(nóng)業(yè)生產(chǎn)的效率和質(zhì)量,也展示了人工智能技術(shù)在現(xiàn)代農(nóng)業(yè)領(lǐng)域的廣闊應(yīng)用前景。
【3】項(xiàng)目硬件模塊組成
(1)主控板:采用樹(shù)莓派4B開(kāi)發(fā)板作為整個(gè)系統(tǒng)的主控芯片。樹(shù)莓派是一款功能強(qiáng)大且易于使用的計(jì)算機(jī)主板,具備高性能的處理器、充足的內(nèi)存和存儲(chǔ)空間,以及豐富的接口和擴(kuò)展功能,可以滿足本項(xiàng)目對(duì)計(jì)算和控制的需求。
(2)視覺(jué)系統(tǒng):視覺(jué)系統(tǒng)包括高性能的攝像頭和圖像處理單元。攝像頭負(fù)責(zé)捕捉果園中的圖像信息,而圖像處理單元?jiǎng)t基于百度飛漿的目標(biāo)識(shí)別和分類算法,對(duì)圖像進(jìn)行處理和分析,以識(shí)別和定位目標(biāo)果實(shí)。
(3)機(jī)械手臂:機(jī)械手臂是實(shí)現(xiàn)自動(dòng)采摘的關(guān)鍵部件,由多個(gè)關(guān)節(jié)和執(zhí)行器組成,可以在三維空間內(nèi)自由移動(dòng)和旋轉(zhuǎn)。通過(guò)精確的控制算法,機(jī)械手臂能夠準(zhǔn)確地到達(dá)目標(biāo)果實(shí)的位置,并執(zhí)行采摘?jiǎng)幼鳌?/p>
(4)傳感器和導(dǎo)航系統(tǒng):為了實(shí)現(xiàn)自動(dòng)導(dǎo)航和精確定位,項(xiàng)目中還集成了多種傳感器和導(dǎo)航系統(tǒng)。這些傳感器可以感知環(huán)境信息,如距離、方位、障礙物等,而導(dǎo)航系統(tǒng)則根據(jù)這些信息規(guī)劃出機(jī)器人的最佳路徑。
(4)電源和供電系統(tǒng):為了保證機(jī)器人的持續(xù)工作,項(xiàng)目中還包括了電源和供電系統(tǒng)。電源負(fù)責(zé)為各個(gè)硬件模塊提供穩(wěn)定的電力供應(yīng),而供電系統(tǒng)則可以根據(jù)實(shí)際需要調(diào)整電力輸出,以滿足機(jī)器人在不同工作狀態(tài)下的能耗需求。
本項(xiàng)目的硬件模塊組成包括主控板、視覺(jué)系統(tǒng)、機(jī)械手臂、傳感器和導(dǎo)航系統(tǒng)、電源和供電系統(tǒng)以及其他輔助模塊。這些硬件模塊相互協(xié)作,共同實(shí)現(xiàn)了基于視覺(jué)識(shí)別的自動(dòng)采摘機(jī)器人系統(tǒng)的功能。
【3】功能總結(jié)
系統(tǒng)集成了先進(jìn)的視覺(jué)識(shí)別技術(shù)、機(jī)械手臂控制技術(shù)以及自動(dòng)導(dǎo)航技術(shù),能夠自動(dòng)識(shí)別和定位果園中的目標(biāo)果實(shí),并通過(guò)機(jī)械手臂完成采摘?jiǎng)幼?。整個(gè)過(guò)程無(wú)需人工干預(yù),實(shí)現(xiàn)了果園采摘的自動(dòng)化和智能化。
功能包括果實(shí)的自動(dòng)識(shí)別和定位、機(jī)械手臂的自動(dòng)導(dǎo)航和控制以及果實(shí)的自動(dòng)收集和處理。通過(guò)高性能的攝像頭和圖像處理算法,系統(tǒng)能夠準(zhǔn)確捕捉和識(shí)別目標(biāo)果實(shí)的圖像信息;借助精確的導(dǎo)航和控制算法,機(jī)械手臂能夠自動(dòng)導(dǎo)航至果實(shí)位置并完成采摘;最后,采摘下來(lái)的果實(shí)會(huì)被自動(dòng)收集并進(jìn)行后續(xù)處理。
本項(xiàng)目的功能實(shí)現(xiàn)不僅提高了果園采摘的效率和準(zhǔn)確性,降低了人力成本,同時(shí)也為農(nóng)業(yè)生產(chǎn)的現(xiàn)代化和智能化發(fā)展提供了新的解決方案和思路。該系統(tǒng)的成功應(yīng)用將為農(nóng)業(yè)生產(chǎn)帶來(lái)革命性的變革,推動(dòng)農(nóng)業(yè)向更高效、更環(huán)保、更可持續(xù)的方向發(fā)展。
1.2 設(shè)計(jì)思路
(1)需求分析:對(duì)果園采摘的實(shí)際需求進(jìn)行分析,明確項(xiàng)目需要解決的問(wèn)題和達(dá)到的目標(biāo)。了解果園的環(huán)境特點(diǎn)、果實(shí)類型和生長(zhǎng)狀況,以及采摘作業(yè)的流程和要求,為后續(xù)設(shè)計(jì)提供基礎(chǔ)依據(jù)。
(2)技術(shù)選型:根據(jù)需求分析的結(jié)果,選擇合適的技術(shù)方案。選用樹(shù)莓派4B開(kāi)發(fā)板作為主控芯片,利用其高性能的處理器和豐富的接口資源,實(shí)現(xiàn)機(jī)器人的控制和管理。同時(shí),采用百度飛漿的目標(biāo)識(shí)別和分類算法,通過(guò)視覺(jué)系統(tǒng)實(shí)現(xiàn)對(duì)目標(biāo)果實(shí)的準(zhǔn)確識(shí)別和定位。
(3)硬件設(shè)計(jì):根據(jù)技術(shù)選型,設(shè)計(jì)機(jī)器人的硬件結(jié)構(gòu)。包括攝像頭的選型和布局,確保能夠捕捉到清晰、穩(wěn)定的圖像信息;機(jī)械手臂的設(shè)計(jì)和選型,使其能夠適應(yīng)果園環(huán)境和采摘需求;導(dǎo)航和傳感器系統(tǒng)的設(shè)計(jì)和選型,實(shí)現(xiàn)機(jī)器人的自動(dòng)導(dǎo)航和精確定位。
(4)軟件設(shè)計(jì):編寫機(jī)器人的控制程序和算法。通過(guò)圖像處理算法實(shí)現(xiàn)對(duì)目標(biāo)果實(shí)的識(shí)別和定位,將結(jié)果傳遞給導(dǎo)航和控制系統(tǒng);根據(jù)導(dǎo)航和傳感器系統(tǒng)提供的信息,規(guī)劃?rùn)C(jī)器人的運(yùn)動(dòng)路徑和動(dòng)作,控制機(jī)械手臂完成采摘?jiǎng)幼鳎粚?shí)現(xiàn)果實(shí)的計(jì)數(shù)、分類和收集等功能,以及數(shù)據(jù)的存儲(chǔ)和傳輸。
(5)系統(tǒng)集成與測(cè)試:將各個(gè)硬件模塊和軟件程序進(jìn)行集成,并進(jìn)行系統(tǒng)測(cè)試和調(diào)試。確保各個(gè)模塊之間的通信和協(xié)作正常,機(jī)器人能夠準(zhǔn)確識(shí)別和采摘目標(biāo)果實(shí),并實(shí)現(xiàn)自動(dòng)導(dǎo)航和收集等功能。
1.3 系統(tǒng)功能總結(jié)
功能模塊 | 功能描述 |
---|---|
視覺(jué)識(shí)別 | - 通過(guò)高性能攝像頭捕捉果園圖像 |
- 利用百度飛漿的目標(biāo)識(shí)別和分類算法,識(shí)別目標(biāo)果實(shí) | |
- 確定果實(shí)的空間坐標(biāo)和距離 | |
導(dǎo)航與定位 | - 根據(jù)果園環(huán)境信息和路徑規(guī)劃算法,自動(dòng)導(dǎo)航至目標(biāo)果實(shí)附近 |
- 集成多種傳感器,感知環(huán)境信息,如距離、方位、障礙物等 | |
機(jī)械手臂控制 | - 在系統(tǒng)精確控制下,自動(dòng)調(diào)整姿態(tài)和動(dòng)作,采摘果實(shí) |
- 確保采摘?jiǎng)幼鞯母咝Ш桶踩?/td> | |
果實(shí)收集與處理 | - 采摘下來(lái)的果實(shí)被自動(dòng)收集到專門容器中 |
- 對(duì)采摘的果實(shí)進(jìn)行數(shù)量統(tǒng)計(jì)和質(zhì)量評(píng)估 | |
- 提供數(shù)據(jù)支持,為農(nóng)業(yè)生產(chǎn)決策提供參考 | |
通信與監(jiān)控 | - 實(shí)現(xiàn)遠(yuǎn)程監(jiān)控和控制功能 |
二、樹(shù)莓派4B環(huán)境搭建
【1】硬件環(huán)境介紹
樹(shù)莓派是什么?Raspberry Pi(中文名為“樹(shù)莓派”,簡(jiǎn)寫為RPi,或者RasPi/RPi)是為學(xué)生計(jì)算機(jī)編程教育而設(shè)計(jì),只有信用卡大小的卡片式電腦,其系統(tǒng)基于Linux。
【2】資料下載
第一步,先將樹(shù)莓派4B需要使用的資料下載下來(lái)。
【3】準(zhǔn)備需要的配件
(1)準(zhǔn)備一張至少32G的TFT卡,用來(lái)燒寫系統(tǒng)。
(2)準(zhǔn)備一個(gè)讀卡器,方便插入TFT卡,好方便插入到電腦上拷貝系統(tǒng)
(3)樹(shù)莓派主板一個(gè)
(4)一根網(wǎng)線(方便插路由器上與樹(shù)莓派連接)
(5)一根type-C的電源線。用自己Android手機(jī)的數(shù)據(jù)線就行,拿手機(jī)充電器供電。
【4】準(zhǔn)備燒寫系統(tǒng)
(1)安裝鏡像燒寫工具
(2)格式化SD卡
將TFT卡通過(guò)讀卡器插入到電腦上,將TFT卡格式化。
(3)燒寫系統(tǒng)
**接下來(lái)準(zhǔn)備燒寫的系統(tǒng)是這一個(gè)系統(tǒng):**將系統(tǒng)解壓出來(lái)。
然后打開(kāi)剛才安裝好的鏡像燒寫工具,在軟件中選擇需要安裝的 img(鏡像)文件,“Device”下選擇SD的盤符,然后選擇“Write”,然后就開(kāi)始安裝系統(tǒng)了,根據(jù)你的SD速度,安裝過(guò)程有快有慢。
注意:從網(wǎng)盤下載下來(lái)的鏡像如果沒(méi)有解壓就先解壓,釋放出img文件。
下面是燒寫的流程:
點(diǎn)擊YES
,開(kāi)始燒寫。
燒寫過(guò)程中:
安裝結(jié)束后會(huì)彈出完成對(duì)話框,說(shuō)明安裝就完成了,如果不成功,需要關(guān)閉防火墻一類的軟件,重新插入SD進(jìn)行安裝。
需要注意的是,安裝完,windows系統(tǒng)下看到SD只有74MB了,這是正?,F(xiàn)象,因?yàn)閘inux下的磁盤分區(qū)win下是看不到的。 燒錄成功后windows系統(tǒng)可能會(huì)因?yàn)闊o(wú)法識(shí)別分區(qū)而提示格式化分區(qū),此時(shí)**千萬(wàn)不要格式化!不要格式化!不要格式化!**點(diǎn)擊取消,然后彈出內(nèi)存卡,插入到樹(shù)莓派上。
至此,樹(shù)莓派燒寫成功。
【5】啟動(dòng)系統(tǒng)
(1)樹(shù)莓派供電
由于我買的樹(shù)莓派開(kāi)發(fā)板不帶電源線,就采用Android手機(jī)的充電線供電。 使用Type-C供電時(shí),要求電源頭的參數(shù)要求,電壓是5V,電流是3A。
我的充電器是小米的120W有線快充,剛好滿足要求。
(2)啟動(dòng)樹(shù)莓派(以Type-C供電示例)
燒寫完后把MicroSD卡直接插入樹(shù)莓派的MicroSD卡插槽,如果有顯示器就連接顯示器,有DHMI線機(jī)也可以連接外接的顯示器,有鼠標(biāo)、鍵盤都可以插上去,就可以進(jìn)入樹(shù)莓派系統(tǒng)了。
但是,我這塊板子就一個(gè)主板,什么都沒(méi)有。就拿網(wǎng)線將樹(shù)莓派的網(wǎng)口與路由器連接。
上電之后,開(kāi)發(fā)板的指示燈會(huì)閃爍,說(shuō)明已經(jīng)啟動(dòng)。
(3)查看開(kāi)發(fā)板的IP地址
現(xiàn)在板子沒(méi)屏幕,想要連接板子,只能通過(guò)SSH遠(yuǎn)程登錄的方式,當(dāng)前燒寫的這個(gè)系統(tǒng)默認(rèn)開(kāi)機(jī)就啟動(dòng)了SSH,所以只要知道開(kāi)發(fā)板的IP地址就可以遠(yuǎn)程登錄進(jìn)去。
**如何知道樹(shù)莓派板子的IP地址?**方法很多,最簡(jiǎn)單是直接登錄路由器的后臺(tái)界面查看連接進(jìn)入的設(shè)備。
我使用的小米路由器,登錄后臺(tái),看到了樹(shù)莓派的IP地址。
(4)SSH方式登錄開(kāi)發(fā)板
當(dāng)前燒寫系統(tǒng)的登錄賬號(hào)和密碼如下:
賬號(hào):pi 密碼:yahboom
打開(kāi)SSH遠(yuǎn)程登錄工具:PuTTY_0.67.0.0.exe
。
輸入IP地址和端口號(hào),點(diǎn)擊open。
然后輸入賬號(hào)和密碼。
輸入用戶名 pi
按下回車,然后再輸入密碼 yahboom
。 注意:Linux下為了保護(hù)隱私,輸入密碼是不可見(jiàn)的,你只需要正常輸入,按下回車鍵確定 即可。
正常情況下,就登錄成功了。
接下來(lái)看看聯(lián)網(wǎng)情況。 ping一下百度測(cè)試互聯(lián)網(wǎng)是否暢通,因?yàn)榻酉聛?lái)要在線安裝軟件包。
ping www.baidu.com
可以看到網(wǎng)絡(luò)沒(méi)有問(wèn)題。
提示: 按下 Ctrl + C
可以終止命令行。 這算是Linux基礎(chǔ)。
【6】windows遠(yuǎn)程登錄桌面
為了方便圖形化方式開(kāi)發(fā),可以使用windows系統(tǒng)通過(guò)遠(yuǎn)程桌面登錄樹(shù)莓派,就可以看到界面了,不過(guò)需要先安裝工具。
(1)安裝xdrp
在樹(shù)莓派的命令行終端輸入命令:
sudo apt-get install xrdp
按下回車之后,會(huì)彈出確認(rèn)窗口。輸入 y
之后,按下回車,繼續(xù)安裝。
安裝完畢:
(2)打開(kāi)windows遠(yuǎn)程桌面
在windows電腦上打開(kāi)運(yùn)行命令的窗口,輸入mstsc
來(lái)打開(kāi)遠(yuǎn)程桌面。
打開(kāi)遠(yuǎn)程桌面的窗口:
(3)連接樹(shù)莓派遠(yuǎn)程桌面
打開(kāi)遠(yuǎn)程桌面后,輸入樹(shù)莓派開(kāi)發(fā)板的IP地址,點(diǎn)擊連接。
如果彈出窗口,就選擇是
。
接下來(lái)就進(jìn)入到樹(shù)莓派開(kāi)發(fā)板的遠(yuǎn)程桌面的登錄窗口了。
接下來(lái)輸入面賬號(hào)和密碼。
賬號(hào):pi 密碼:yahboom
輸入后點(diǎn)擊OK
按鈕登錄。
正常情況下,就順利的進(jìn)入樹(shù)莓派的桌面了。接下來(lái)就可以進(jìn)行遠(yuǎn)程桌面開(kāi)發(fā)了。
【7】擴(kuò)展樹(shù)莓派SD卡可用空間
樹(shù)莓派系統(tǒng)默認(rèn)啟動(dòng)時(shí),樹(shù)莓派默認(rèn)沒(méi)有把整個(gè)存儲(chǔ)空間拓展到整張卡中,如果需要使用整個(gè)SD卡,這時(shí)候可以通過(guò)人為的把存儲(chǔ)空間拓展到整張卡上。
(1)查看內(nèi)存使用情況
打開(kāi)命令行終端,輸入df -h
命令。
(2)擴(kuò)展內(nèi)存
<1> 打開(kāi)樹(shù)莓派命令行終端輸入:
pi@raspberrypi:~ $ sudo raspi-config
<2> 在彈出的命令行里選擇Advanced Options
<3> 選擇第一個(gè)選項(xiàng)。
<4> 點(diǎn)擊確定
<5> 點(diǎn)擊右邊的Finish
按鈕保存退出。
確定之后,關(guān)閉界面,系統(tǒng)會(huì)自動(dòng)重啟,重啟之后,使用df命令查看是否擴(kuò)展成功(我這里插的是32G的SD卡)。
可以看到,我的系統(tǒng)已經(jīng)擴(kuò)展成功了,目前可以內(nèi)存空間是19G。
【8】樹(shù)莓派連接WIFI
(1)配置需要連接的WIFI
點(diǎn)擊右上角的數(shù)據(jù)連接圖標(biāo),打開(kāi)WIFI列表,點(diǎn)擊想要的WIFI進(jìn)行連接。
輸入密碼:
連接成功后的效果:
(2)通過(guò)WIFI的IP地址登錄遠(yuǎn)程桌面
在路由器的后臺(tái)可以看到,目前樹(shù)莓派連入了兩個(gè)IP地址。接下來(lái)把網(wǎng)線拔掉,使用WIFI無(wú)線也可以直接連接無(wú)線桌面,這樣就不用插網(wǎng)線了。
賬號(hào)和密碼:
賬號(hào):pi 密碼:yahboom
三、代碼設(shè)計(jì)
3.1 舵機(jī)控制代碼(機(jī)械手臂控制)
C語(yǔ)言代碼: 使用wiringPi庫(kù)控制樹(shù)莓派上的GPIO引腳,實(shí)現(xiàn)對(duì)舵機(jī)的控制。通過(guò)servo_rotate()
函數(shù)可以控制舵機(jī)旋轉(zhuǎn)到指定的角度。在main()
函數(shù)中,使用鍵盤輸入獲取目標(biāo)角度,并調(diào)用servo_rotate()
函數(shù)控制舵機(jī)旋轉(zhuǎn)到目標(biāo)角度。
舵機(jī)的控制方式為PWM脈沖寬度調(diào)制,即將角度轉(zhuǎn)換為脈寬值并輸出對(duì)應(yīng)的高低電平信號(hào)。將舵機(jī)信號(hào)線連接到GPIO18引腳,通過(guò)digitalWrite()
函數(shù)輸出高低電平來(lái)控制舵機(jī)旋轉(zhuǎn)。
#include <wiringPi.h>
#include <stdio.h>
#define SERVO_PIN 18 // SG90舵機(jī)信號(hào)線連接的GPIO引腳
void servo_rotate(int angle) {
int pulse_width = (angle * 11) + 500; // 將角度轉(zhuǎn)換為脈寬值
digitalWrite(SERVO_PIN, HIGH); // 輸出高電平
delayMicroseconds(pulse_width); // 延時(shí)脈寬值對(duì)應(yīng)的時(shí)間
digitalWrite(SERVO_PIN, LOW); // 輸出低電平
delay(20 - pulse_width / 1000); // 延時(shí)剩余時(shí)間
}
int main(void) {
wiringPiSetupGpio(); // 初始化wiringPi庫(kù)
pinMode(SERVO_PIN, OUTPUT); // 將舵機(jī)信號(hào)線接口設(shè)為輸出模式
while(1) {
// 從鍵盤輸入目標(biāo)角度
printf("Enter the angle to rotate (0-180): ");
fflush(stdout);
int angle;
scanf("%d", &angle);
// 旋轉(zhuǎn)到目標(biāo)角度
if(angle >= 0 && angle <= 180) {
servo_rotate(angle);
} else {
printf("Invalid angle! Please enter an angle between 0 and 180.n");
}
}
return 0;
}
Pyhon代碼: 使用RPi.GPIO庫(kù)來(lái)控制樹(shù)莓派上的GPIO引腳,實(shí)現(xiàn)對(duì)舵機(jī)的控制。通過(guò)setup()
函數(shù)進(jìn)行初始化設(shè)置,并通過(guò)set_angle()
函數(shù)控制舵機(jī)旋轉(zhuǎn)到指定的角度。
在main()
函數(shù)中,使用鍵盤輸入獲取目標(biāo)角度,并調(diào)用set_angle()
函數(shù)控制舵機(jī)旋轉(zhuǎn)到目標(biāo)角度。
import RPi.GPIO as GPIO
import time
SERVO_PIN = 18 # SG90舵機(jī)信號(hào)線連接的GPIO引腳
def setup():
GPIO.setmode(GPIO.BCM)
GPIO.setup(SERVO_PIN, GPIO.OUT)
global servo_pwm
servo_pwm = GPIO.PWM(SERVO_PIN, 50) # 創(chuàng)建PWM對(duì)象,頻率設(shè)置為50Hz
servo_pwm.start(0) # 啟動(dòng)PWM輸出,初始占空比設(shè)為0
def set_angle(angle):
duty_cycle = (angle / 18) + 2.5 # 將角度轉(zhuǎn)換為占空比值
servo_pwm.ChangeDutyCycle(duty_cycle)
time.sleep(0.3) # 等待舵機(jī)轉(zhuǎn)到指定角度
def main():
setup()
while True:
# 從鍵盤輸入目標(biāo)角度
angle = int(input("Enter the angle to rotate (0-180): "))
# 旋轉(zhuǎn)到目標(biāo)角度
if 0 <= angle <= 180:
set_angle(angle)
else:
print("Invalid angle! Please enter an angle between 0 and 180.")
if __name__ == '__main__':
try:
main()
finally:
servo_pwm.stop() # 停止PWM輸出
GPIO.cleanup() # 清理GPIO資源
3.2 調(diào)用算法識(shí)別目標(biāo)
(1)安裝PaddlePaddle和PaddleDetection庫(kù):
- 先安裝Python和pip。然后,打開(kāi)終端并執(zhí)行以下命令安裝PaddlePaddle和PaddleDetection庫(kù):
pip install paddlepaddle paddlepaddle-gpu pip install paddlehub pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple
(2)下載預(yù)訓(xùn)練模型:
- 百度飛槳提供了預(yù)訓(xùn)練的目標(biāo)檢測(cè)模型,可以從PaddleDetection的GitHub頁(yè)面下載這些模型。選擇適合的任務(wù)的模型,并將其解壓到合適的目錄中。
(3)編寫調(diào)用代碼:
- 創(chuàng)建一個(gè)Python腳本文件,例如
detect_fruits.py
,并使用以下代碼編寫腳本:import paddlehub as hub import cv2 def detect_fruits(image_path, model_path): # 加載模型 module = hub.Module(name='yolov3_mobilenet_v1_coco2017') input_dict = {'image': [image_path]} # 目標(biāo)檢測(cè) results = module.object_detection(data=input_dict) # 處理結(jié)果 for result in results: if len(result['data']) > 0: for obj in result['data']: label = obj['label'] confidence = obj['confidence'] left, top, right, bottom = obj['left'], obj['top'], obj['right'], obj['bottom'] print(f"Label: {label}, Confidence: {confidence:.2f}") print(f"Bounding Box: ({left}, {top}), ({right}, {bottom})") # 可視化結(jié)果 img = cv2.imread(image_path) for result in results: module.visualize(data=result, output_dir='output', score_thresh=0.5, use_visualize=True, visualization=True, plot_bbox=True, save_bbox_txt=True, image=img) if __name__ == '__main__': image_path = 'path/to/your/image.jpg' # 替換為你的圖片路徑 model_path = 'path/to/your/model' # 替換為你的模型路徑 detect_fruits(image_path, model_path)
在上面的代碼中,使用PaddleHub庫(kù)加載了預(yù)訓(xùn)練的
yolov3_mobilenet_v1_coco2017
模型,并將其應(yīng)用于指定的圖像。然后,處理檢測(cè)結(jié)果并進(jìn)行輸出。最后,使用OpenCV庫(kù)可視化結(jié)果并保存到指定目錄中。
(4)運(yùn)行腳本:
- 將目標(biāo)果實(shí)圖像放置在與腳本相同的目錄下(或根據(jù)需要修改圖像路徑)。然后,在終端中執(zhí)行以下命令運(yùn)行腳本:
python detect_fruits.py
腳本將分析圖像并輸出檢測(cè)到的目標(biāo)果實(shí)的標(biāo)簽、置信度和邊界框。會(huì)生成一個(gè)帶有目標(biāo)果實(shí)標(biāo)注的圖像。
3.3 機(jī)器人小車控制代碼
小車的電機(jī)驅(qū)動(dòng)采用L298N模塊,連接在GPIO17、GPIO18、GPIO27和GPIO22上。 使用了wiringPi庫(kù)來(lái)控制樹(shù)莓派上的GPIO引腳,實(shí)現(xiàn)對(duì)小車電機(jī)驅(qū)動(dòng)的控制。通過(guò)setup()
函數(shù)進(jìn)行初始化設(shè)置,并通過(guò)forward()
、backward()
、turn_left()
和turn_right()
函數(shù)控制小車前進(jìn)、后退和轉(zhuǎn)彎。其中,stop()
函數(shù)用于停止小車運(yùn)動(dòng)。
#include <wiringPi.h>
#define MOTOR_ENA_PIN 0 // L298N模塊ENA引腳連接的GPIO引腳
#define MOTOR_ENB_PIN 2 // L298N模塊ENB引腳連接的GPIO引腳
#define MOTOR_IN1_PIN 3 // L298N模塊IN1引腳連接的GPIO引腳
#define MOTOR_IN2_PIN 4 // L298N模塊IN2引腳連接的GPIO引腳
#define MOTOR_IN3_PIN 5 // L298N模塊IN3引腳連接的GPIO引腳
#define MOTOR_IN4_PIN 6 // L298N模塊IN4引腳連接的GPIO引腳
void setup() {
wiringPiSetup(); // 初始化wiringPi庫(kù)
pinMode(MOTOR_ENA_PIN, OUTPUT);
pinMode(MOTOR_ENB_PIN, OUTPUT);
pinMode(MOTOR_IN1_PIN, OUTPUT);
pinMode(MOTOR_IN2_PIN, OUTPUT);
pinMode(MOTOR_IN3_PIN, OUTPUT);
pinMode(MOTOR_IN4_PIN, OUTPUT);
}
void forward() {
digitalWrite(MOTOR_IN1_PIN, HIGH);
digitalWrite(MOTOR_IN2_PIN, LOW);
digitalWrite(MOTOR_IN3_PIN, LOW);
digitalWrite(MOTOR_IN4_PIN, HIGH);
digitalWrite(MOTOR_ENA_PIN, HIGH);
digitalWrite(MOTOR_ENB_PIN, HIGH);
}
void backward() {
digitalWrite(MOTOR_IN1_PIN, LOW);
digitalWrite(MOTOR_IN2_PIN, HIGH);
digitalWrite(MOTOR_IN3_PIN, HIGH);
digitalWrite(MOTOR_IN4_PIN, LOW);
digitalWrite(MOTOR_ENA_PIN, HIGH);
digitalWrite(MOTOR_ENB_PIN, HIGH);
}
void turn_left() {
digitalWrite(MOTOR_IN1_PIN, LOW);
digitalWrite(MOTOR_IN2_PIN, HIGH);
digitalWrite(MOTOR_IN3_PIN, LOW);
digitalWrite(MOTOR_IN4_PIN, HIGH);
digitalWrite(MOTOR_ENA_PIN, HIGH);
digitalWrite(MOTOR_ENB_PIN, HIGH);
}
void turn_right() {
digitalWrite(MOTOR_IN1_PIN, HIGH);
digitalWrite(MOTOR_IN2_PIN, LOW);
digitalWrite(MOTOR_IN3_PIN, HIGH);
digitalWrite(MOTOR_IN4_PIN, LOW);
digitalWrite(MOTOR_ENA_PIN, HIGH);
digitalWrite(MOTOR_ENB_PIN, HIGH);
}
void stop() {
digitalWrite(MOTOR_ENA_PIN, LOW);
digitalWrite(MOTOR_ENB_PIN, LOW);
}
int main() {
setup();
while (1) {
// 從鍵盤輸入指令
char cmd = getchar();
getchar(); // 忽略回車符
// 根據(jù)指令執(zhí)行動(dòng)作
switch (cmd) {
case 'w': // 前進(jìn)
forward();
break;
case 's': // 后退
backward();
break;
case 'a': // 左轉(zhuǎn)
turn_left();
break;
case 'd': // 右轉(zhuǎn)
turn_right();
break;
case 'x': // 停止
stop();
break;
default:
break;
}
}
return 0;
}
四、總結(jié)
隨著農(nóng)業(yè)技術(shù)的不斷進(jìn)步,自動(dòng)化、智能化已成為現(xiàn)代農(nóng)業(yè)生產(chǎn)的重要趨勢(shì)。本項(xiàng)目通過(guò)結(jié)合視覺(jué)識(shí)別技術(shù)、機(jī)器人技術(shù)和自動(dòng)化控制技術(shù),成功設(shè)計(jì)并實(shí)現(xiàn)了基于視覺(jué)識(shí)別的自動(dòng)采摘機(jī)器人系統(tǒng)。這一創(chuàng)新性的成果不僅提高了果園采摘的效率和準(zhǔn)確性,降低了人力成本,還為農(nóng)業(yè)生產(chǎn)的現(xiàn)代化和智能化發(fā)展提供了新的解決方案和思路。