




已閱讀5頁,還剩57頁未讀, 繼續(xù)免費閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
北方工業(yè)大學(xué)北方工業(yè)大學(xué) 本科畢業(yè)設(shè)計(論文)本科畢業(yè)設(shè)計(論文) 題 目: 基于 ROS 機器人系統(tǒng)的智能小車研制 指導(dǎo)教師: 專業(yè)班級: 學(xué) 號: 姓 名: 日 期: 2015 年 6 月 15 日 基于 ROS 機器人系統(tǒng)的智能小車研制 摘要 隨著機器人技術(shù)的發(fā)展,ROS(Robot Operating System)機器人系統(tǒng)受 到越來越多人的研究和學(xué)習(xí)。通過本次設(shè)計研制出了一臺以優(yōu)秀的開源機器 人操作系統(tǒng) ROS 作為軟件基礎(chǔ)的智能小車,拋棄了傳統(tǒng)的單片機等嵌入式軟 件代碼從零寫起的開發(fā)方案,軟件代碼以 ROS 系統(tǒng)的代碼規(guī)范和理念進行設(shè) 計。硬件電路方面采用了當(dāng)下流行的開發(fā)電路板,這就對小車的可復(fù)制性, 給廣泛推廣提供了更大的空間,從而可以讓更多的人能夠參與到這種科技實 踐中,享受科技給生活帶來的樂趣。這個系統(tǒng)可以作為 ROS 系統(tǒng)的入門級學(xué) 習(xí)的實體解決方案,也可以作為家用可移動的監(jiān)控平臺,也可以作為物聯(lián)網(wǎng) 的一個終端設(shè)備。 關(guān)鍵詞:Robot Operating System;ROS;智能小車;物聯(lián)網(wǎng) Design of smart car based on Robot Operating System ABSTRACT The design chosen on the excellent open-source Robot Operating System as the basis for the design , abandoned the traditional development programs that written single-chip and other embedded software code from scratch, but written software code as the ROS system code specifications. I choosen the current popular development boards as hardware ,so the car can be easily copied , which allows more people to participate in the practice of this technology , science and enjoy technology more fun. The design of a web page for the interactive , the trolley car and the client is responsible for the implementation of client commands and image transfer , web client can receive the image transported by car , and you can control the trajectory of the car , observe the ROS system status . This system can be used as a ROS platform for beginner-level learners and as a home monitoring platform . It can be used as a terminal of the internet of things . KeywordsKeywords:Robot Operating System;smart car ;web server 目錄 1 引言1 1.1 課題研究背景1 1.2 本課題的發(fā)展現(xiàn)狀.1 1.2.1 機器人的發(fā)展概況.1 1.2.2 機器人軟件平臺的發(fā)展概況2 1.2.3 ROS 系統(tǒng)的誕生和發(fā)展3 1.3 本課題的主要研究內(nèi)容及安排.3 2 功能規(guī)劃及設(shè)計方案論證5 2.1 功能規(guī)劃5 2.2 本次設(shè)計方案選擇5 2.2.1 機械結(jié)構(gòu)方案6 2.2.2 主控板的選擇.7 2.2.3 驅(qū)動方案選擇.8 2.3 軟件方案選擇10 2.4 系統(tǒng)總體運行模式10 3 系統(tǒng)設(shè)置與測試11 3.1 ROS 機器人系統(tǒng)安裝配置.11 3.2 創(chuàng)建 ROS 工作空間.13 3.3 創(chuàng)建和編譯 MROB包.13 3.4 啟動文件14 3.5 ROS 機器人系統(tǒng)節(jié)點.15 3.6 單片機節(jié)點代碼.16 3.6.1 單片機開發(fā)環(huán)境的設(shè)置.16 3.6.2 單片機程序17 3.7 網(wǎng)頁設(shè)計.18 3.8 攝像頭驅(qū)動與參數(shù)設(shè)定20 3.9 攝像頭測試21 3.10 小車運動控制算法22 4 裝置整體調(diào)試.23 4.1 硬件連接23 4.2 啟動節(jié)點24 4.3 運行網(wǎng)頁測試25 結(jié)論27 致謝28 主要參考文獻29 附件30 外文資料翻譯及原文42 1 1 引言 1.1 課題研究背景 隨著機器人領(lǐng)域的快速發(fā)展和復(fù)雜化,代碼的復(fù)用性和模塊化的要求越 來越強烈,而已有的機器人開源機器人操作系統(tǒng)很難滿足要求。2010 年 Willow Garage 公司發(fā)布了開源機器人操作系統(tǒng) ROS(Robot Operating System), 很快在機器人領(lǐng)域展開了學(xué)習(xí)和應(yīng)用。 ROS 可以在許多 Linux 發(fā)行版本上運行,ROS 可以源碼安裝也可以采用 直接安裝,Willow Garage 公司僅僅提供了 Ubuntu 系統(tǒng)環(huán)境下的直接安裝方 法,在其他平臺上采用的多是源碼安裝方式。本次設(shè)計軟件上采用了 Ubuntu 系統(tǒng),作為 ROS 系統(tǒng)的安裝環(huán)境,方便了 ROS 的安裝以及可能存在的兼容 性問題。 Linux 作為開源系統(tǒng)對硬件平臺高度適應(yīng)性,使的它能夠很好的移 植到不同的平臺上,在嵌入式、服務(wù)器等領(lǐng)域得到了廣泛的應(yīng)用。Ubuntu 是 Linux 眾多發(fā)行版本中很優(yōu)秀的的版本,Ubuntu 建基于 Debian 的不穩(wěn)定分支, 是以桌面應(yīng)用為主的桌面操作系統(tǒng),運作主要依賴 Canonical 有限公司的支 持,同時亦有來自 Linux 社區(qū)的熱心人士提供協(xié)助?,F(xiàn)在搭載 ROS 系統(tǒng)的機 器人有 PR2、REEM-C 等,這些機器人都造假昂貴,適合實驗室作為研究, 但不太適合初學(xué)者做為學(xué)習(xí) ROS 的平臺。 1.2 本課題的發(fā)展現(xiàn)狀 1.2.1 機器人的發(fā)展概況 機器人的分類和定義有好多種,一般可以分為工業(yè)機器人和特種機器人, 工業(yè)機器人主要是應(yīng)用在工業(yè)現(xiàn)場的機械臂,特種機器人主要是具有一定智 能的,具有一定的自主性的機器人,例如服務(wù)性機器人、無人機等。 2 1920 年機器人一詞出現(xiàn)在一部文學(xué)作品中,1959 年第一臺機器人被設(shè)計 出來,標(biāo)志著機器人真正的誕生。經(jīng)過長達半個世紀(jì)的發(fā)展,機器人應(yīng)用的 領(lǐng)域不斷地擴大,普及的程度也越來越高。越來越多的工業(yè)機器人進入到共 生產(chǎn)中,大大降低了工業(yè)生產(chǎn)的成本,服務(wù)性機器人也在不斷的取得突破性 的發(fā)展。通過現(xiàn)在的市場調(diào)查發(fā)現(xiàn),越來越多的人愿意嘗試機器人產(chǎn)品,這 將大大刺激服務(wù)性機器人市場的發(fā)展,更多的新技術(shù)將會應(yīng)運而生。 1.2.2 機器人軟件平臺的發(fā)展概況 機器人軟件開發(fā)平臺或者開發(fā)框架是指為機器人開發(fā)提供了可重用的軟 件包、軟件開發(fā)、編譯、仿真工具等軟件的集合,機器人軟件平臺節(jié)約了機 器人開發(fā)者的時間和成本。目前有多種機器人開發(fā)框架和軟件開發(fā)平臺,商 用的機器人軟件開發(fā)平臺有 Evolution Robotics、Microsoft Robotics Studio(MSRS) 、Skilligent 等,開源的機器人框架有 Cylon.js、Artoo、Gobot、ROS 等。 MSRS 是微軟開發(fā)的機器人軟件平臺,能夠在微軟開發(fā)的 windows 和 windowsCE 下面運行,它提供了完備了的仿真和圖形化的開發(fā)環(huán)境。Cylon.js 是一個機器人 JavaScript 開發(fā)框架,可以使用 Node.js 進行機器人的開發(fā)和物 理計算,他支持多個硬件平臺。Artoo 是用 Ruby 語言寫成的 Cylon.js 機器人 開發(fā)框架的姐妹項目,編程語言偏門,不支持 c 語言等熱門的語言,不利于 機器人的擴展。Gobot 機器人開發(fā)框架采用 Go 語言編寫完成,Go 語言有 Google 開發(fā),主要用來做云計算和云服務(wù)的語言,更適合運用于服務(wù)器程序 的編寫。ROS 是開源的機器人系統(tǒng)可以與其他開源框架進行結(jié)合,ROS 提出 了自己獨特的解決方案,軟件開發(fā)標(biāo)準(zhǔn),集成了 SLAM 導(dǎo)航等功能,擁有獨 3 立的仿真環(huán)境,通過硬件抽象語言可以建立自己的機器人模型進行仿真學(xué)習(xí)。 1.2.3 ROS 系統(tǒng)的誕生和發(fā)展 ROS 系統(tǒng)起源于 2007 年斯坦福大學(xué)人工智能實驗室的 STAIR 項目與 Willow Garage 機器人技術(shù)公司的個人機器人項目(Personal Robots Program) 之間的合作,ROS 的軟件研究成果在機器人 PR2 上進行體驗展示。 在開源的交互中,ROS 得到完善和推廣.ROS 是一種開源的、用于機器 人的后操作系統(tǒng),或者說次級操作系統(tǒng)。它提供類似操作系統(tǒng)所提供的功能, 包含硬件抽象描述、底層驅(qū)動程序管理、共用功能的執(zhí)行、程序間的消息傳 遞、程序發(fā)行包管理等,也提供一些工具程序和庫用于獲取、建立、編寫和 運行多機整合的程序。 1.3 本課題的主要研究內(nèi)容及安排 本設(shè)計基于 Robot Operating System 和嵌入式開發(fā)板,設(shè)計一輛智能小車, 通過網(wǎng)頁可以實現(xiàn)對軟件系統(tǒng)的監(jiān)控。小車硬件部分主要是將成熟的硬件進 行適當(dāng)?shù)拇钆洌敬卧O(shè)計的重點是設(shè)計軟件,搭建 ROS 系統(tǒng)運行環(huán)境和 web 服務(wù)器,編寫相關(guān)的軟件代碼,主要包括網(wǎng)頁代碼和 ROS 節(jié)點代碼。 課題主要研究內(nèi)容及安排如下: 1. 查閱相關(guān)文獻資料; 2. 確定系統(tǒng)總體設(shè)計方案; 3. 對元器件進行選型、統(tǒng)計并采購; 4. 對硬件進行組裝; 4 5. 搭建軟件開發(fā)環(huán)境; 6. 單片機基礎(chǔ)代碼設(shè)計及調(diào)試; 7. 網(wǎng)頁代碼設(shè)計及調(diào)試; 8. 整合代碼及調(diào)試; 9. 撰寫畢業(yè)設(shè)計論文。 5 2 功能規(guī)劃及設(shè)計方案論證 2.1 功能規(guī)劃 本次設(shè)計需要搭建一個智能小車。通過網(wǎng)頁可以實現(xiàn)對小車的運動軌跡 的控制,小車可以響應(yīng)用戶指令完成前進和后退直線運動和轉(zhuǎn)向運動。網(wǎng)頁 端可以監(jiān)控系統(tǒng)的運行狀態(tài),可以清楚的了解系統(tǒng)運行狀況??梢詫崿F(xiàn)視頻 實時傳輸功能,用戶可以實時觀察到小車拍攝到的畫面。 2.2 本次設(shè)計方案選擇 硬件平臺的搭建需要設(shè)計合適的機械部分和硬件部分。機械部分主要包 含智能小車底盤、云臺、攝像頭、主控板、鍵盤、電機驅(qū)動等。硬件部分主 要負責(zé)運行系統(tǒng)和代碼,小車的運動控制。可選擇的方案如下: 方案 1 可以選擇電腦與單片機組合。電腦負責(zé)運行 Ubuntu 系統(tǒng)和 ROS 系統(tǒng)等,單片機負責(zé)底層的小車運行控制。電腦和單片機之間通過串口通訊。 電腦的運行速度快,處理能力強,系統(tǒng)運行更加流暢,能夠運行 ROS 系統(tǒng)的 完整版本,可以運行 rviz 3D 視圖等圖形化工具。缺點是電腦的體積大,重量 也較大,需要的車體盤會偏大,需要的更大的驅(qū)動力,會增加小車制作的成 本和控制的難度。 方案 2 選擇 arm 開發(fā)板作為小車的控制層,運行 Ubuntu 和 ROS 系統(tǒng)等, 并且負責(zé)小車的運動控制。優(yōu)點是 arm 開發(fā)板的成本較低,體積小,重量輕, 易于在小車上安裝,可以縮小小車的體積,減輕小車的重量,小車更加易于 控制。缺點是 ROS 的部分功能不能在 arm 平臺讓很好的運行,但是不影響核 心功能。Arm 開發(fā)板直接控制小車的運行,這樣可以使得系統(tǒng)更加的簡潔, 6 由于電機驅(qū)動功率較大,在電機運行時,電流或者電電壓的過大波動可能會 燒毀 arm 芯片,影響到系統(tǒng)的整體穩(wěn)定性。 方案 3 采用 arm 開發(fā)板和單片機的組合,開發(fā)板和單片機之間采用串口 進行通訊。ARM 開發(fā)板運行 Ubuntu 和 ROS 系統(tǒng),可以通過串口發(fā)送指令給 單片機。單片機可以產(chǎn)生 PWM 控制電機的轉(zhuǎn)動。這種方案既保證了小車體 積較小,成本低,也保證了系統(tǒng)的穩(wěn)定性。 通過以上的方案比較我們選擇方案三作為本次設(shè)計的硬件解決方案, 2.2.1 機械結(jié)構(gòu)方案 本次設(shè)計的是智能小車,需要選擇一個移動平臺作為開發(fā)的基礎(chǔ),由于 材質(zhì)的不同,價格差別也較多。底盤可以選擇鋁合金、鋼板、亞克力等,車 輪子可以選擇普通的塑料橡膠輪、履帶等。金屬的車盤會使得車子更加的穩(wěn) 定牢固,但是要求的電機的驅(qū)動能力更強,成本也偏高。綜合考慮本次采用 的是塑料材質(zhì)的車底盤。 圖 2.2 所示即為本次采用的小車平臺。小車底盤是亞克力材料,強度較 高,相對于鋁合金更加易于加工。小車底盤有 4 個輪子,每個輪子都有獨立 的電機進行驅(qū)動,小車轉(zhuǎn)向操作更加靈活,驅(qū)動力更強,可以搭載更多的傳 感器,完成復(fù)雜的任務(wù)。 云臺采用簡易的雙軸的舵機云臺,如圖 2.1,兩個舵機可以驅(qū)動攝像頭云 臺左右上下運動運行,本次設(shè)計沒有采用云臺配套的攝像頭,需要對云臺和 攝像頭進行一定的加工,才能將攝像頭固定在云臺上,通過云臺的移動,攝 像頭的拍攝范圍更加廣闊。 7 圖 2.1 云臺和攝像頭 圖 2.2 小車底盤 2.2.2 主控板的選擇 ARM 公司一直主導(dǎo)著嵌入式行業(yè),市面上流行的 ARM 嵌入式開發(fā)板種 類較多,卡片式也是一種嵌入式開發(fā)板,樹莓派是卡片式電腦的典型代表, 8 接上顯示屏鼠標(biāo)等就可以進行辦公瀏覽網(wǎng)頁等操作,使用起來十分方便,價 格低廉,性能上比不上真正意義的電腦,但是能夠滿足基本的需求。 本次設(shè)計計劃采用樹莓派 arm 開發(fā)板,樹莓派第一代產(chǎn)品作為一款開源 的 arm 開發(fā)板,在許多志愿者的參與下,各種應(yīng)用已經(jīng)形成規(guī)模,很容易上 手,做各種開發(fā)。但是由于第一代產(chǎn)品是 2012 年的產(chǎn)品,不支持 ubuntu 系 統(tǒng),在其他的 linux 版本下安裝 ROS,需要進行編譯等操作,存在兼容性問題, 不易于本次的設(shè)計開發(fā),而且性能較差,無法本次設(shè)計的要求。本次設(shè)計采 用國產(chǎn)的香蕉派開源板作為主控板,如圖 2.4(a)所示,相對于樹莓派,香 蕉派具有運行頻率高、內(nèi)存大、內(nèi)核更加先進等優(yōu)勢,而且支持 ubuntu 系統(tǒng), 系統(tǒng)運行流暢。表 2.1 為兩塊開板的硬件配置對照。 表 2.1 硬件配置對比 CPU內(nèi)存內(nèi)存板載存儲板載存儲電源電源USB 借口借口 Cortex-A7 雙核1GBDDR3SD 卡5V 直流電2 個 ARM1176JZF-S512MSD 卡5V 直流電2 個 2.2.3 驅(qū)動方案選擇 硬件電路部分需要設(shè)計控制板和驅(qū)動電路以及其他必要的傳感器電路。 本次設(shè)計采用單片機作為電機運動的控制板,控制電機運轉(zhuǎn)。單片機選擇 AVR 單片機,型號為 ATmega328,開發(fā)板選擇 Arduino,如圖 2.4(b)所示, Arduino 為一款開源硬件,具有標(biāo)準(zhǔn)的硬件接口,獨立的開發(fā)環(huán)境和標(biāo)準(zhǔn)的 函數(shù)庫,每一種擴展板都有對應(yīng)的函數(shù)庫,方便軟件代碼的編寫,可以不用 花太多的精力放在底層的開發(fā)上,可以更好的專注于邏輯功能的實現(xiàn)上。本 次設(shè)計中有 4 個直流電機,2 個舵機需要控制,電機驅(qū)動需要能夠驅(qū)動 4 個 9 電機。2 個舵機可以直接由單片機進行驅(qū)動。本次選擇了型號為 C3A3 的 arduino 電機驅(qū)動板,如圖 2.3 所示,此款電機驅(qū)動的板可以驅(qū)動 4 個直流電 機或者 2 個步進電機,同時可以驅(qū)動兩個舵機,能夠滿足本次設(shè)計的要求。 圖 2.3 電機驅(qū)動 (a) (b) 圖 2.4 單片機和主控板 10 2.3 軟件方案選擇 ROS 系統(tǒng)依賴于 Linux 系統(tǒng),本次設(shè)計選用了 Ubuntu 系統(tǒng)作為 ROS 系 統(tǒng)的依賴系統(tǒng),由于 Ubuntu 的衍生版本眾多,針對不同的應(yīng)用場合和硬件平 臺 Ubuntu 有多種衍生版本,由于本次設(shè)計選用的 arm 平臺,運算處理能力 有限,因此選用了對硬件要求不高的 Lubuntu14.04 做為本次設(shè)計的操作系統(tǒng)。 ROS 系統(tǒng)更新速度比較快,已發(fā)行多個版本,本次設(shè)計采用的是 indigo 版本, 雖然現(xiàn)在的許多中文資料是 hydro 版本或者更老的版本,但這并不會影響本 次設(shè)計。Indigo 版本的 ROS 和 Lubuntu 14.04 版本都有 5 年的官方支持的維 護更新,這樣能夠保證在 5 年內(nèi)不用跟新系統(tǒng),可以不升級系統(tǒng)的條件下將 繼續(xù)完善本次設(shè)計。 用戶需要通過 Web 服務(wù)器來訪問本機的網(wǎng)頁,本次設(shè)計采用 Apache 作 為本次設(shè)計的 web 服務(wù)器。Apache 網(wǎng)頁服務(wù)器是一款開源的軟件,是世界排 行第一的網(wǎng)頁服務(wù)器,它可以多種操作系統(tǒng)平臺上運行,具有簡單、速度快、 穩(wěn)定性高、安全性高等優(yōu)點,被許多世界知名的網(wǎng)站采用,例如亞馬遜,雅 虎等。 2.4 系統(tǒng)總體運行模式 本章主要是對整個系統(tǒng)設(shè)計的一個總體概括,通過對可行性方案的分析 與研究來決定采取哪種方案更加適合這次的畢業(yè)設(shè)計,本次選擇的方案運行 的基本模式如圖 2.5 所示。 圖中 ROS 系統(tǒng)核心在香蕉派開發(fā)板上運行,ROS 系統(tǒng)內(nèi)部節(jié)點之間通 過話題進行數(shù)據(jù)交換,Arduino 開發(fā)板和香蕉派之間采用 USB 線進行鏈接, 通過串口通信協(xié)議進行通信。通過串口可以實現(xiàn) ROS 系統(tǒng)和單片機的鏈接, 11 輸入設(shè)備可以時操縱桿、攝像頭、激光雷達等,本次設(shè)計中攝像頭作為輸入 設(shè)備,Arduino 開發(fā)板作為一個 ROS 系統(tǒng)節(jié)點,通過話題傳遞電機控制的指 令。 圖 2.5 系統(tǒng)運行模式 3 系統(tǒng)設(shè)置與測試 3.1 ROS 機器人系統(tǒng)安裝配置 1. 設(shè)置 local 指令,配置語言環(huán)境。 sudo update-locale LANG=C LANGUAGE=C LC_ALL=C LC_MESSAGES =POSIX 2. 設(shè)置源列表文件 sources.list。 sudo sh -c echo “deb /ros/ubuntu trusty main“ 12 /etc/apt/sources.list.d/ros-latest.list 3. 設(shè)置證書。 wget /ros/rosdistro/master/ros.key -O - | sudo apt-key add - 4. 安裝 ROS 系統(tǒng)基礎(chǔ)版本 sudo apt-get install ros-indigo-ros-base 5. 設(shè)置環(huán)境變量 在每個 shell 啟動的時候,通過下面這條指令可以實現(xiàn) ROS 環(huán)境變量被添 加到每個 bash 中 echo “source /opt/ros/indigo/setup.bash“ /.bashrc source /.bashrc 6. 運行 roscore 指令測試系統(tǒng)是否安裝成功。運行結(jié)果如下: 13 圖 3.1 運行結(jié)果 3.2 創(chuàng)建 ROS 工作空間 1. 創(chuàng)建工作目錄 跳轉(zhuǎn)到 home 目錄下: cd 運行指令創(chuàng)建工作目錄: mkdir -p /catkin_ws/src 2. 初始化工作空間 跳轉(zhuǎn)工作目錄: mkdir -p /catkin_ws/src 初始化指令: 14 catkin_init_workspace 3. 編譯工作空間 跳轉(zhuǎn)工作目錄: cd /catkin_ws/ 運行編譯指令: catkin_make 4. 設(shè)置工作空間環(huán)境變量 source devel/setup.bash 在每次打開終端是都需要運行一次這個指令,否則 ROS 指令找不到這個 工作空間下的任何包。 3.3 創(chuàng)建和編譯 Mrob 包 1. 跳轉(zhuǎn)工作目錄到 catkin 工作空間 cd /catkin_ws/src 2. 創(chuàng)建 Mrob 包 catkin_create_pkg Mrob std_msgs rospy roscpp 3. 編譯 Mrob 包 跳轉(zhuǎn)工作目錄:cd /catkin_ws 編譯 Mrob 包:catkin_make -pkg Mrob 通過添加pkg 選項可以選擇需要編譯的 catkin 包??梢圆挥镁幾g當(dāng)前工 作空間下無關(guān)的包,節(jié)省時間,提高編譯的效率 4. 添加當(dāng)前工作空間到 ROS 環(huán)境內(nèi) . /catkin_ws/devel/setup.bash 15 3.4 啟動文件 啟動文件的語言風(fēng)格上和 XML 文件相同,擁有自己獨特的標(biāo)簽,可以用 來設(shè)定節(jié)點啟動需要的參數(shù),可以啟動已經(jīng)編譯完成的 ROS 節(jié)點,在管理大 型的機器人項目時候,可以方便的管理需要啟動的節(jié)點,不用通過 rosrun 指 令單個的啟動節(jié)點。啟動文件代碼如下: 之間包含的是啟動文件的主要代碼,聲明了需要啟動的節(jié) 點和需要傳遞參數(shù)。聲明的是啟動文件需要啟動的節(jié)點,節(jié)點所 在的包是 rospy_tutorials,節(jié)點類型是 talker,名字是 talker,類型和包是直接 相關(guān)的參數(shù)不能夠隨便改寫,名字參數(shù)可以隨便改,但是一般和類型名字相 同。 編寫啟動文件需要在/catkin_ws/src/Mrob 目錄下面創(chuàng)建一個 launch 目錄, 每個工包的所有的啟動文件都存放在這個目錄下面,一般以.launch 作為文件名 字的結(jié)尾。編寫完成后可以通過 roslaunch 命令運行。啟動文件創(chuàng)建過程: 1. 跳轉(zhuǎn)工作目錄 cd /catkin_ws/src/Mrob 2. 運行指令創(chuàng)建 launch 目錄 mkdir launch 3. 編寫啟動文件并保存 vim test.launch. 16 3.5 ROS 機器人系統(tǒng)節(jié)點 節(jié)點在 ROS 系統(tǒng)是算法框圖級的概念,是 ROS 系統(tǒng)中運行的一個基本 單位,一個完整的 ROS 機器人系統(tǒng)包含若干個節(jié)點,節(jié)點負責(zé)數(shù)據(jù)的處理工 作,完成特定的功能,節(jié)點可以通過節(jié)點管理器進行管理,通過 ROS 幾點管 理器,各節(jié)點之間才能夠通信,單個節(jié)點不能夠直接進行通信。 每一個節(jié)點的代碼一般包含一個主函數(shù)和回調(diào)函數(shù),回調(diào)函數(shù)主要負責(zé) 數(shù)據(jù)運算,完成節(jié)點的主要職能。主函數(shù)通過節(jié)點的初始化,調(diào)用回調(diào)函數(shù) 處理數(shù)據(jù),完成節(jié)點主要功能。一般 ROS 節(jié)點與其他節(jié)點通信的方式有兩種, 一種是 publish,將節(jié)點運算的結(jié)果發(fā)布出去,一種是 subscribe,通過訂閱的 方式獲得其他節(jié)點的信息,作為節(jié)點數(shù)據(jù)的輸入。例如本次設(shè)計中網(wǎng)頁需要 攝像頭拍攝的畫面,就需要訂閱畫面的節(jié)點數(shù)據(jù),通過這種方式,ROS 會將 攝像頭的數(shù)據(jù)發(fā)布到網(wǎng)頁上,我們才能實時的觀測到攝像頭拍攝的畫面 3.6 單片機節(jié)點代碼 3.6.1 單片機開發(fā)環(huán)境的設(shè)置 本次設(shè)計沒有采用 AVR 開發(fā)環(huán)境,而是選擇了 Arduino 開發(fā)板特定的開發(fā)環(huán) 境,arduino 圖形開發(fā)環(huán)境 linux 也可以運行。AVR 在 linux 下直接開發(fā)需要 運用 gcc 等開發(fā)工具,設(shè)置起來十分麻煩,圖形開發(fā)環(huán)境還需要配合 eclipse,開發(fā)起來相對麻煩. 1.通過指令方式安裝 arduino 開發(fā)環(huán)境 sudo apt install arduino 2.設(shè)置 arduino 的工作目錄,arduino 開發(fā)環(huán)境安裝完成后,打開開發(fā)環(huán)境 17 選擇工作目錄 sketchbook 存放的地址。 3.安裝 arduinor 串口驅(qū)動 sudo apt-get install ros-indigo-rosserial-arduino sudo apt-get install ros-indigo-rosserial 4.安裝 ros 庫到 arduino 開發(fā)環(huán)境 跳轉(zhuǎn)工作目錄:cd /sketchbook/libraries 運行指令安裝庫:rosrun rosserial_arduino make_libraries.py . 完成上面的步驟以后,ros_lib 會出現(xiàn)在 arduino 開發(fā)環(huán)境下,如圖 3.2。 Arduino 開發(fā)環(huán)境下的 ros_lib 是將 ROS 系統(tǒng)內(nèi)發(fā)布節(jié)點函數(shù)、點閱訂閱節(jié) 點函數(shù)等移植到了單片機環(huán)境下,并且對單片機的串口波特率、系統(tǒng)時鐘等 進行了設(shè)置,使得 ROS 系統(tǒng)內(nèi)部的重要函數(shù)能夠在單片機的環(huán)境下運行,通 過串口單片機可以與 ROS 系統(tǒng)的主機進行通信。ros_lib 通過不同的編譯條件 可以適配到不同的單片機中,擴展了 ROS 系統(tǒng)的應(yīng)用場合。 18 圖 3.2 Arduino IDE 3.6.2 單片機程序 單片機在本次設(shè)計中是一個節(jié)點程序,負責(zé)控制 4 個電機和兩個舵機。 在 arduino 的開發(fā)環(huán)境下,沒有 main 函數(shù),需要運行的代碼都卸載 loop 函數(shù) 里面,loop 函數(shù)取代了 main 函數(shù)和死循環(huán) while(1),方便了開發(fā)。在代碼正 式運行前需要對代碼運行需要的硬件環(huán)境進行設(shè)置,所有設(shè)置在 setup()中完 成。這種編碼方式使得代碼清晰明了。流程圖如圖 3.3。 在單片機里需要完成的 ROS 節(jié)點代碼,需要編寫小車控制回調(diào)函數(shù) M_controlCallBack,負責(zé)小車的運動方向控制。舵機回調(diào)函數(shù)負責(zé)舵機的運 動控制。設(shè)定硬件資源。訂閱電機和舵機控制的話題 cmd_vel,初始化訂閱 結(jié)點,loop 函數(shù)里面每循環(huán)一次,運行一次 spinonce 函數(shù),spinonce 函數(shù)負 責(zé)調(diào)用回調(diào)函數(shù),完成控制動作。spinonce()在每次循環(huán)中值執(zhí)行一次,只調(diào) 用一次回調(diào)函數(shù)。spin()函數(shù)會從被調(diào)用的的時候一直調(diào)用回調(diào)函數(shù),知道系 統(tǒng)停止運行才返回,本次設(shè)計中通過 loop 函數(shù)和 spinonce()函數(shù)配合就可以 完成 spin()函數(shù)的功能。詳細代碼見附錄。 19 圖 3.3 流程圖 3.7 網(wǎng)頁設(shè)計 網(wǎng)頁代碼采用 html 和 JavaScript 語言進行編寫,詳細代碼見附錄,主要 實現(xiàn)實時圖像觀測、小車運動控制、舵機控制。頁面布局依靠 HTML 和 CSS,本 次采用表格的方式負責(zé)基本的布局,通過 JS 代碼在表格內(nèi)部添加具體的按鈕 等功能塊,JavaScript 是事件驅(qū)動的語言,本次設(shè)計中大量的采用點擊事件, 當(dāng)基本的頁面加載完成之后,JS 代碼開始運行,監(jiān)聽頁面的事件,當(dāng)對應(yīng)的 事件發(fā)生時,JS 會用相應(yīng)的代碼相應(yīng)這個事件。本次大量的運用了點擊事件, 通點擊頁面的按鈕,可以實現(xiàn)網(wǎng)頁與 ROS 的通信,可以發(fā)布節(jié)點、訂閱節(jié)點。 本次選用 ROS 的 JS 庫作為基礎(chǔ),文件名稱是 ros.js。這個庫主要定義了 與 rosbridge 通信的相關(guān)協(xié)議,以及 ROS 中訂閱節(jié)點、發(fā)布節(jié)點等函數(shù)的 JS 代碼實現(xiàn),可以通過定義定義 ROS 對象來調(diào)用其中的函數(shù)。在設(shè)計中需要考 20 慮頁面布局和需要訂閱的節(jié)點和發(fā)布的節(jié)點。本次設(shè)計中每個功能都被設(shè)計 在一個獨立的文件中,starting.js 文件主要實現(xiàn)網(wǎng)頁和 ROS 的通信,在 stating 文件中定義了 connection 對象,這個對象復(fù)擇設(shè)置 ip 地址,初始化各個模塊, 實現(xiàn)各個模塊的的頁面布局和事件監(jiān)聽設(shè)置。Connection 對象的所有方法存 在 connection.js 文件中,所有的 JS 文件通過 index.html 文件加載到瀏覽器中, 通過瀏覽器可以查看代碼,如圖 3.4。 rosbridge 軟件包可以作為網(wǎng)頁和 ROS 系統(tǒng)之間通信的橋梁,ROS 和瀏覽 器通過 WebSoket 協(xié)議進行通信。WebSocet 是 HTML5 的一中新的通信協(xié)議。 他實現(xiàn)了瀏覽器和服務(wù)器的全雙工通信。rosbridge_server 實現(xiàn)了 ROS 與瀏覽 器之間的通信。在使用網(wǎng)頁功能前需要開啟 rosbridge_server,否則瀏覽器和 ROS 系統(tǒng)之間不能正常的通信,網(wǎng)頁功能將不能實現(xiàn)。 21 圖 3.4 網(wǎng)頁代碼 3.8 攝像頭驅(qū)動與參數(shù)設(shè)定 本次設(shè)計采用的市面上常見的一般攝像頭,采用通用攝像攝像頭驅(qū)動既可以, 因此選的是 ROS 系統(tǒng)攝像頭包為 uvc_camera,uvc_camera 可以驅(qū)動一般的 攝像頭并且可以在 ROS 內(nèi)發(fā)布圖像消息,其他節(jié)點可以訂閱相關(guān)的消息作為 圖像處理或者傳輸?shù)膶ο?。如果想要在普通?quán)限下使用攝像頭,需要設(shè)計系 統(tǒng)的設(shè)備規(guī)則,設(shè)置方法: 1.創(chuàng)建并編輯 uvc.rules sudo vim /ect/udev/rules.d/uvc.rules 2.編輯 uvc.rules,對設(shè)備 ID 信息等進行設(shè)置 # UVC cameras SUBSYSTEMS=“usb“,ENVDEVTYPE=“usb_device“, ATTRSidVendor=“1871“, ATTRSidProduct=“0316“, MODE=“0666“ 通過 lsusb 指令可以查看產(chǎn)品的 ID 號、生產(chǎn)廠家 ID 號等。如下圖所示: 22 圖 3.6 USB 設(shè)備信息 3.9 攝像頭測試 將攝像頭插在 arm 開發(fā)上面通過 guvcview 軟件測試,guvcview 軟件可以 正常顯示畫面,說明攝像頭能夠正常的工作,arm 板的供電也能夠滿足攝 像頭的需要。 ROS 系統(tǒng)集成了許多優(yōu)秀的圖形化開發(fā)工具,rviz 是 3D 可視化工具,主 要用來查看圖像、坐標(biāo)、地圖等。rviz 對硬件的依賴較強,ROS 的基礎(chǔ)版 本里也沒有對 rviz 進行安裝。因此沒有采用 rviz 作為本次攝像頭的測試 工具,本次設(shè)計采用的是 image_view 包作為測試工具,用來訂閱 camera_uvc 發(fā)布的圖像信息,并且顯示在屏幕上面。測試結(jié)果如圖: 23 圖 3.7 攝像頭測試 3.10 小車運動控制算法 小車的控制信號來自網(wǎng)頁,通過網(wǎng)頁可以控制兩個 2 個舵機和 4 個電機, 可以實現(xiàn)舵機的上下左右運動,小車的前后運動和左右的轉(zhuǎn)向。小車的轉(zhuǎn)向 是通過采集鼠標(biāo)點擊畫布的坐標(biāo)實現(xiàn)的。畫布分為 8 個區(qū)域,每個區(qū)域發(fā)送 的坐標(biāo)不同,通過判斷坐標(biāo)所在的區(qū)域可以控制小車不同的運方向,8 個區(qū) 域分別對應(yīng)到小車的 4 種運行方式上,分別是向前運動、向后運動、左轉(zhuǎn)、 右轉(zhuǎn)。對應(yīng)的軟件代碼。 攝像頭的運動比較簡單,通過 4 個按鈕的點擊完成,每個按鈕可以發(fā)送 不同的坐標(biāo)信息,表征不同的運動方向,當(dāng)單片機接收到數(shù)據(jù)后,通過判斷 數(shù)值完成相應(yīng)的動作。點擊 UP 時,按鈕攝像頭可以向上運動,DOWN 按鈕 可以使攝像頭向下運動,可以完成向左向右的運動。 24 4 裝置整體調(diào)試 4.1 硬件連接 本次設(shè)計采用的電源是普通的移動電源, 攝像頭和主控制板板之間采用 USB 連接,單片機和主控板之間采用 USB 連接,USB 口負責(zé)單片機的供電。 將 4 個電機連接到驅(qū)動板,由于 USB 口的供電能力有限,選擇給驅(qū)動板單獨 供電。驅(qū)動板接線如圖 4.1 所示,驅(qū)動板兩側(cè)接直流電機,右下角是舵機接 線,上方為供電口,驅(qū)動板和單片機開發(fā)板通過排針鏈接,可將驅(qū)動板疊加 到 Arduino 上面。圖 1 為小車的整體效果圖: 圖 4.1 小車整體效果 25 圖 4.2 驅(qū)動板 4.2 啟動節(jié)點 本次設(shè)計中需要啟動節(jié)點有串口節(jié)點、攝像頭節(jié)點,需要啟動的服務(wù)是 圖片傳輸服務(wù)和 websoket 服務(wù)。啟動串口節(jié)點可以實現(xiàn)主板和單片機的通信。 通過 rostopic 指令可以查看 ROS 正在運行的話題如圖 4.3。 26 圖 4.3 話題指令 4.3 運行網(wǎng)頁測試 在局域網(wǎng)內(nèi)可以通過 IP 來訪問小車的網(wǎng)站,小車的登陸賬號為小車的 IP 地址,網(wǎng)頁的右上角是登陸欄,在登陸欄中輸入的設(shè)備的 IP 地址,點擊 connect 按鈕就可以連接到小車上,登陸后效果如圖 4.4,connect 按鈕會顯示 為 disconnect,可以點擊 disconnect 按鈕斷開與設(shè)備的連接。連接到設(shè)備后可 以進行相關(guān)的控制和操作,如提交話題、發(fā)布信息等。 網(wǎng)頁被分為 5 個區(qū)域,camera 區(qū)域顯示的是攝像頭拍攝的實時畫面, servo 是舵機的控制區(qū)域,joystick 區(qū)域為小車運動控制區(qū)域,可以遙控小車 27 的運動,左下角為 ROS 系統(tǒng)的檢測區(qū)域,通過此區(qū)域可以觀測 ROS 系統(tǒng)正 在運行的話題、服務(wù)、節(jié)點。 圖 4.4 網(wǎng)頁效果 28 結(jié)論 經(jīng)過對本課題的研究與實際制作,制作完成了一輛基于 ROS 機器人系統(tǒng) 的智能小車,制作了一個網(wǎng)站。小車拍攝圖像可以傳輸?shù)骄W(wǎng)頁,ROS 系統(tǒng)的 運行參數(shù)可以傳輸?shù)骄W(wǎng)頁,小車可以接收到網(wǎng)頁傳輸過來的指令,調(diào)整運動 的軌跡。主要完成的工作如下: 1.完成了智能小車硬件平臺的搭建工作,小車可以在相應(yīng)的指令下運動, 可以拍攝畫面,并且將畫面實時傳輸?shù)骄W(wǎng)頁當(dāng)中; 2.完成了網(wǎng)頁的設(shè)計,實現(xiàn)了網(wǎng)頁對小車的控制,通過網(wǎng)頁可以注冊節(jié) 點,提交話題,與 ROS 系統(tǒng)可以進行對話; 3.完成各種硬件選型和硬件連接調(diào)試,小車硬件系統(tǒng)的組裝; 4.完成了網(wǎng)頁服務(wù)器的搭建,能實現(xiàn)局域網(wǎng)內(nèi)通過 IP 訪問網(wǎng)頁; 5.完成了整體裝置測試,實現(xiàn)設(shè)計功能要求。通過本平臺可以學(xué)習(xí) ROS 系統(tǒng)的基礎(chǔ)知識。 本次設(shè)計中還存在一些問題和解決方式: 1.開機后需要通過終端進行 ROS 系統(tǒng)的啟動,在實際應(yīng)用中需要轉(zhuǎn)換 成隨系統(tǒng)自啟動。 2.網(wǎng)頁界面簡陋,后期需要做出美化工作。網(wǎng)頁存在 bug 需要修補。 3.由于安全證書的原因,網(wǎng)頁 SSH 不能夠很好的工作。 4.小車運動速度太慢,小車的驅(qū)動能力不夠強。后期需要自己設(shè)計驅(qū)動, 增加驅(qū)動能力。 29 致謝 非常感謝北方工業(yè)大學(xué)四年的培養(yǎng),北方工業(yè)大學(xué)不僅僅教會了我專業(yè) 知識也給予了我探索未知的勇氣。非常感謝楊老師對我的課題的理解和支持, 楊老師一直鼓勵著我去實踐,通過實踐不斷的學(xué)習(xí)知識,增長經(jīng)驗。非常感 謝斯坦福實驗室提供的 ROS 系統(tǒng),謝謝好心網(wǎng)友給我提供的幫助。 30 主要參考文獻 1 張建偉,張立偉,胡穎,張俊. 開源機器人操作系統(tǒng)ROSM. 科學(xué)出版社, 2012,09 2 Aaron Martinez Enrique Fernndez.ROS 機器人程序設(shè)計M.2014,09 3 王淑芳,電機驅(qū)動技術(shù)M.科學(xué)出版社,2008,10(3):90-94 4 葉青,周文遠,宋宇,田建國. 一種實時視頻采集處理系統(tǒng)的設(shè)計與實現(xiàn) J. 光電子激光,2006,1 5 Michael Dawson.Python 編程初學(xué)者指南M.北京:人民郵電出版社. 2014,06 6 吉鵬,馬云峰等. 微機原理與接口技術(shù)M. 北京:高等教育出版社, 2003.12 7 Jason M. OKane. A Gentle Introduction to ROSM,2013,10 8 潘光洋,蔡娜.Linux 從處學(xué)到入門M.電子工業(yè)出版社,2014,06 9 胡壽松. 自動控制原理M. 北京:科學(xué)出版社,2007 10胡向東. 傳感器與檢測技術(shù)M. 北京:機械工業(yè)出版社,2009 31 附件 1. 單片機代碼 #include #include #include #include AF_DCMotor motor1(1); AF_DCMotor motor2(2); AF_DCMotor motor3(3); AF_DCMotor motor4(4); Servo myservo1,myservo2; / create servo object to control a servo / a maximum of eight servo objects can be created int pos1 = 90; / variable to store the servo1 position int pos2 = 90; / variable to store the servo2 position float temp,temp1; ros:NodeHandle nh; void M_controlCallBack( const geometry_msgs:Twist else if(Mrun.linear.x0) else T_left(); if(Mrun.linear.x0) temp=Mrun.linear.x*(-1); if(temp=Mrun.angular.z) G_backward(); else T_left(); delay(100); if(Mrun.linear.x0) else T_right(); delay(100); if(Mrun.linear.x=temp1) G_backward(); else T_right(); 34 void servoContollCallBack(const geometry_msgs:Twist if(Mrun.linear.x=2.0) pos1+=10; myservo1.write(pos1); if(Mrun.linear.x=3) pos2+=10; if(Mrun.linear.x=4) pos2-=10; myservo2.write(pos2); ros:SubscriberservoSub(“cmd_vel1“,servoContollCal lBack); ros:SubscribermotorSub(“cmd_vel“,M_controlCallB ack); void setup() nh.initNode(); nh.subscribe(motorSub); nh.subscribe(servoSub); 35 / turn on motor motor1.setSpeed(255); / turn on motor motor2.setSpeed(255); / turn on motor motor3.setSpeed(255); / turn on motor motor4.setSpeed(255); realse_car(); myservo1.attach(9); / attaches the servo on pin 9 to the servo object myservo2.attach(10); myservo2.write(90); myservo2.write(90); void loop() nh.spinOnce(); 36 void realse_car() motor1.run(RELEASE); motor2.run(RELEASE); motor3.run(RELEASE); motor4.run(RELEASE); void G_forward() motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(FORWARD); motor4.run(FORWARD); void G_backward() motor1.run(BACKWARD); motor2.run(BACKWARD); 37 motor3.run(BACKWARD); motor4.run(BACKWARD); void T_left() motor1.run(BACKWARD); motor2.run(BACKWARD); motor3.run(FORWARD); motor4.run(FORWARD); void T_right() motor1.run(FORWARD); motor2.run(FORWARD); motor3.run(BACKWARD); motor4.run(BACKWARD); 38 2. 網(wǎng)頁代碼 gui 39 Camera servo Joystick Info Terminal var isConnecting=false; 40 function mov_servo(connection, servo_div) his.init=function() /while(servo_div.hasChildNode() /servo_div.removeChild(servo_div.lastChild); servo_UpButton=document.createElement(“input“); servo_UpButton.type=“button“; servo_UpButton.id=“servo_up“; servo_UpButton.value=“UP“; servo_div.appendChild(servo_UpButton); servo_DownButton=document.createElement(“input“); servo_DownButton.type=“button“; servo_DownButton.id=“servo_down“; servo_DownButton.value=“Down“; servo_div.appendChild(servo_DownButton); servo_LeftButton=document.createElement(“input“); servo_LeftButton.type=“button“; servo_LeftButton.id=“servo_up“; 41 servo_LeftButton.value=“Left“; servo_div.appendChild(servo_LeftButton); servo_RightButton=document.createElement(“input“); servo_RightButton.type=“button“; servo_RightButton.id=“servo_right“; servo_RightButton.value=“Right“; servo_div.appendChild(servo_RightButton); servo_AdviseButton=document.createElement(“input“); servo_AdviseButton.type=“button“; servo_AdviseButton.id=“servo_advise“; servo_AdviseButton.value=“Advise“; servo_div.appendChild(servo_AdviseButton); servo_AdviseButton.addEventListener(click,function(msg)advertise(connect ion,/cmd_vel,geometry_msgs/Twist);,false); servo_UpButton.addEventListene
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 北斗監(jiān)控考試題及答案
- 保險高考試題及答案
- 老年教育個性化課程設(shè)置與多元教學(xué)模式創(chuàng)新研究報告
- 安全實踐操作試題及答案
- 2025年鄉(xiāng)村振興戰(zhàn)略下職業(yè)技能培訓(xùn)的多元化發(fā)展報告
- 中國歷史災(zāi)難課件
- 國企法律思維培訓(xùn)課件
- 周末表揚小學(xué)生的課件
- 寵物專業(yè)入學(xué)教育
- 中國剪紙分類
- 山東省東營市2023-2024學(xué)年高二下學(xué)期7月期末 英語試題(含解析)
- 《人文英語4》形考任務(wù)(1-8)試題答案解析
- 北京市通州區(qū)2024-2025學(xué)年四年級語文下學(xué)期期末試卷新人教版
- 廣東省珠海市金灣區(qū)2023-2024學(xué)年八年級下學(xué)期7月期末歷史試題
- 社會語言學(xué)視角下網(wǎng)絡(luò)流行用語研究
- 數(shù)據(jù)庫程序設(shè)計智慧樹知到期末考試答案章節(jié)答案2024年外交學(xué)院
- 中職數(shù)學(xué)單招一輪總復(fù)習(xí)《集合》復(fù)習(xí)課件
- 設(shè)計投標(biāo)服務(wù)方案
- 外來醫(yī)療器械清洗消毒
- 內(nèi)科學(xué)(廣東藥科大學(xué))智慧樹知到期末考試答案2024年
- 再回首混聲合唱譜
評論
0/150
提交評論