天天看點

機器人系統設計與制作:Python語言實作3.1 什麼是機器人仿真

<b>摘要</b>

用ros和gazebo進行機器人仿真

在上一章中,我們了解了機器人的機械設計過程,并着手設計了機器人的2d和3d模型。在這一章中,将對我們設計的機器人進行模拟仿真。在進行仿真之前,要先來了解一下機器人仿真的作用,它存在的優缺點,以及各式各樣的機器人仿真軟體工具。

本章中我們還将讨論機器人的運動學和動力學參數,它會有助于您了解機器人的各項功能。在讨論了這些概念之後,将确定用于機器人仿真的軟體平台。我們計劃是在機器人作業系統(robot operating system,ros)平台下,使用gazebo這個模拟仿真軟體工具。在熟悉了gazebo和ros這些基本概念之後,我們将在gazebo仿真環境下實作機器人的運動學和動力學模組化。最後,我們會将機器人置于一個模拟的酒店環境下,測試它在為顧客送遞食物過程中的自主導航能力。

<b></b>

<b>3.1 什麼是機器人仿真</b>

一般來說,機器人仿真就是對機器人進行虛拟模組化,并用它來對真實實體世界的機器人模組化過程進行仿真。通過模拟仿真,我們可以建立一個虛拟的機器人模型,并對其設計和代碼編寫過程進行測試。

對于仿真的定義,我們可以參考robert e. shannon和prentice hall的《系統仿真:科學與藝術》一書,書中是這樣描述的:

它是一個真實系統模型的設計過程,是輔助系統模型進行實驗的一種方法,這樣能夠有助于了解系統産生的行為,以及生成評價系統操作性能的各種政策。是以,仿真是模型設計中一個非常重要的步驟,它能夠模拟真實系統對一系列事件發生的響應行為。

在我們所定義的仿真術語中,模型和系統是兩個非常關鍵的部分。對于模型而言,我們指的是對一組對象或想法的表達,但并不是其實體本身。對于系統而言,我們指的是一組或是能夠配合完成既定目标的相關元素的集合。

機器人仿真器具體來說就是那些能夠對機器人進行模組化的軟體應用程式,它能夠搭建出一個虛拟環境來模拟機器人的真實環境。在我們的示例中,機器人的周圍環境是一個有桌子和椅子的典型酒店/餐廳。我們必須通過仿真器模拟出相同的場景,測試機器人在這個環境下的工作情況。

圖3-1顯示的是一種機器人仿真器gazebo。圖中有一個名為turtlebot的機器人和一些随機的物體對象。你将在接下來的章節中學習到更多關于gazebo和turtlebot的相關知識。

圖3-1 機器人仿真器gazebo

我們之前了解了機器人建構的基本需求和它的機械設計部分。接下來就是要對它的設計過程進行仿真。根據設計方案的需求,開發人員可以進行代碼測試,以及驗證機器人機械設計部分的有效性。機器人的虛拟模型可以根據需要進行任意修改,而不會增加任何的額外成本。

機器人仿真的一個主要優勢在于可以用較低的成本建立一個複雜機器人的虛拟原型樣機,其表現出的行為與實際設計的機器人相類似,我們可以不斷地對虛拟機器人進行測試,并根據測試結果不斷改進,直到滿足所有的性能要求。但機器人仿真的缺點在于仿真器不能模拟覆寫到真實實體世界中可能發生的所有場景。

仿真的優點在于:

在剛開始建構機器人的時候,能夠降低成本。

可以在仿真機器人上測試代碼。

可以在不增加成本的基礎上修改機器人的設計。

可以對機器人上的任何一個部分進行測試。

如果是一個複雜的系統工程,可以對機器人進行分階段地仿真和測試。

一個完整的仿真過程能夠對機器人是否滿足性能要求做出判定。

幾乎所有的仿真軟體都能适用于許多不同的程式設計語言。

仿真的缺點在于:

真實世界中的參數變化要遠比虛拟世界中多得多,在仿真模組化的時候,我們不可能考慮到所有的參數變化。

所有的仿真程式都是人為設定的,而不是随機的。

讓我們來了解一下最新的機器人仿真應用軟體:

gazebo:這是一個多機器人仿真器,支援多傳感器。軟體可以相容ros系統。這是一個免費、開源的仿真器,廣泛應用于機器人研究領域。gazebo的官方網站:www.gazebosim.org。

v-rep:這是由coppelia robotics公司設計的最先進的工業機器人3d仿真器中的一款。這個軟體支援多種程式設計語言,包括c/c++、python、java、lua、matlab和urbi。這個仿真器支援内置算法開發,是以可以模拟很多工業自動化的場景。同時,很多工程師也将它作為教育教育訓練中的一種開發平台。v-rep的官方網站:http://www.coppeliarobotics.com。

webots:這是由cyberbotics公司開發的一款3d仿真平台,主要用于工業機器人和服務機器人的模拟仿真。這款工具軟體支援windows、linux和apple作業系統,目前廣泛應用于教育或其他科研機構中。此軟體能夠使用多種程式設計語言,包括c、c++、python、java、matlab和urbi,對所有機器人進行模組化、程式設計和仿真。它還相容外部函數庫,如opencv(open source computer vision,開放源代碼計算機視覺類庫)等。

robologix:這是有logic design公司開發的一款3d工業仿真軟體平台。該平台可以用于模拟真實實體世界中五軸工業機器人的開發和應用。這樣,機器人上安裝的程式可以在一個很廣泛的實際應用中進行開發和測試。平台支援許多各種不同的工業機器人,包括abb、fanuc和kawasaki。

在進行模拟仿真之前,我們先要來學習一下機器人到底是如何工作的,它背後的數學模型又是什麼呢?

3.1.1 機器人數學模組化

移動機器人有一個非常重要的組成部分,就是它的轉向系統。它将幫助機器人在環境中行走。我們将選用差動驅動模型來降低機器人的複雜性和成本,并減小尺寸。差動式驅動的機器人主要是由安裝在同一個軸上的兩個輪子組成的,每個輪子分别由單獨的電機控制。差動式驅動系統或轉向系統是一個非完整系統,即意味着在其姿态改變時會産生一定的運動限制。例如,小汽車就是一個非完整運動限制系統,在不改變姿态的前提下,它是無法改變其位置的。下面,讓我們來看看機器人是如何工作的,以及如何對機器人進行數學模組化。

3.1.1.1 機器人運動學和差動轉向系統

機器人運動學研究的是在不考慮外力作用下機器人運動的數學模型。它主要是分析受控系統的幾何關系。而機器人動力學則是研究機器人在運動狀态下,對所有外力因素進行模組化。

一個移動機器人或小車,它通過6個自由度(dof)來表示它的姿态(x, y, z, 橫滾,偏航,俯仰)。其中,它的位置可以用(x, y, z)來表示,它的姿态可以用(橫滾角,俯仰角,偏航角)來表示。橫滾角(roll)是繞着側向旋轉的,俯仰角(pitch)是繞着前後旋轉的,而偏航角(yaw,也稱為方向角或航向角)表示機器人在x-y平面的前進方向上的航向角。差動式驅動的機器人在x-y平面上移動,是以它的平面姿态主要由x、y和θ來表示,其中θ是機器人頂部的前進方向與x軸形成的夾角。以上這些資訊已經足夠用來描述一個差動機器人的位置和姿态了,如圖3-2所示。

對差動式驅動機器人,可以通過調整左右兩邊的獨立被控的電機的速度,對其運動進行控制。也就是說,可以分别調整v-left和v-right兩個參數。圖3-3顯示了目前市場上流行的兩款差動式驅動機器人。

差動式驅動機器人的正向運動學方程可用于解決以下問題:

如果機器人在t時刻的位置為(x, y, θ),那麼在t+δt時刻機器人的姿态(x′, y′, θ′)由控制參數v-left和v-right來确定。

圖3-3 irobot、roomba和pioneer 3dx

這種方法可以用在機器人按照特定軌迹運動的情況。

3.1.1.2 正向運動學方程

我們先來看看正向運動學的一個示例方案。圖3-4所示的是一個輪式機器人的例子。

根據之前所提到的内容可知,繞着y軸所産生的運動被稱為橫滾。其餘的可視為側滑。假設在不産生側滑的情況下,輪子完整地轉完一圈,相當于走了2πr的距離,其中r為輪子的半徑。我們可以先假定運動是在二維平面上進行,這也就意味着這個平面必須是平坦無起伏的。

當機器人側傾時,必須繞着左右輪同軸延長線上的一個點進行旋轉。機器人旋轉所圍繞的這個點被稱為瞬時曲率中心(instantaneous center of curvature,icc)。圖3-5給出了差動式驅動機器人輪子的構造,并畫出了瞬時曲率中心。

圖3-4 機器人的一個輪子繞着本體y軸旋轉 圖3-5 差動式驅動機器人的輪子構造

機器人運動學方程推導的核心是機器人的角速度ω。每個輪子繞icc旋轉,輪子的半徑為r。

輪子的速度為v = 2πr/t,其中,t是輪子繞icc轉一圈所花費的時間。角速度ω是由2π/t得到,機關為弧度(或角度)/每秒。結合方程v和w可得ω = 2π/t。

v = rω(1)

差動式驅動系統的詳細模型,如圖3-6所示。

圖3-6 差動式驅動系統的詳細模型

如果将之前的方程同時用在兩個輪子上,其結果也是相同的,也就是說,ω可以表示為:

ω (r + l/2) = vr(2)

ω (r - l/2) = vl(3)

其中,r是從icc到兩輪軸距中點的距離,l是兩輪之間的軸長。有了ω和r之後,我們可以得到以下結果:

r = l/2 (vl + vr)/(vr - vl)(4)

ω = (vr - vl)/l(5)

上面的方程是用于解決正向運動學問題的。假設機器人以角速度ω運動了δt秒,它目前的朝向,或者說是角度将變為:

θ′ = ωδt + θ(6)

其中,圍繞icc旋轉的中心點的坐标,可以由基本的三角函數得到:

icc = [iccx, iccy] = [x - r sinθ, y + r cosθ](7)

機器人繞着icc轉了ωδt度後的圖形如圖3-7所示。

圖3-7 機器人繞着icc轉了ωδt度

給定了起始位置點(x, y),則新的位置點(x′, y′)可以由二維旋轉矩陣計算得到。以角速度ω繞着icc轉了δt秒之後,在t+δt時刻的位置點可由下面的公式計算得到:

(8)

在給定ω、δt和r之後,新的位姿(x′, y′, θ′)可以由方程(6)和(8)計算得到。

ω可以從方程(5)計算得到,但vr和vl很難通過精确測量得到。每個輪子的轉速不能直接測量得到,而是要通過輪速編碼器這種傳感器測量才能獲得。從輪速編碼器獲得的資料其實就是機器人的裡程計數值。這類傳感器被安裝在輪軸上,輪子每向前轉動一步(每一步大概0.1mm)都會按順序記錄下一個二進制信号。将這些二進制信号輸入到一個計數器,這樣vδt就是從t時刻到t+δt時刻所走過的距離:

n×step = vδt

這樣,我們就可以通過計算得到v:

v = n×step/δt(9)

如果把方程(9)代入方程(3)和(4),我們可以得到下面的結果:

r = l/2 (vl + vr)/(vr - vl) = l/2 (nl + nr)/(nr - nl)(10)

ωδt = (vr - vl) δt/l = (nr - nl)×step/l(11)

這裡,nl和nr分别為左右輪的編碼器計數結果。vl和vr分别為左右輪的速度。由此,機器人從目前點的位姿(x, y, θ),經過了δt時間之後,左右輪移動的總步數分别為nl和nr,得到新的點的位姿(x′, y′, θ′)為:

(12)

其中,

r = l/2 (nl + nr)/(nr - nl)(13)

ωδt = (nr - nl)×step/l(14)

icc = [x - r sinθ, y + r cosθ](15)

以上推導出的運動學方程與機器人的機械設計和幾何結構有很大關系。不同的設計方案導出的動力學方程也是不相同的。

3.1.1.3 逆向運動學

在給定輪速的情況下,正向運動學方程能夠提供一個實時更新的位置和姿态。現在,我們可以來考慮一下逆向的問題。

t時刻機器人的位姿為(x, y, θ),在确定了控制參數v-left和v-right之後,在t+δt時刻的位姿為(x′, y′, θ′)。

在差動式驅動機器人的運動學問題上,因為不能通過簡單設定輪子的速度,就讓機器人移動到任意指定的位姿,是以這個問題一直沒有一個比較好的解決方案。在非完整機器人的限制控制上這個問題可以解決,這種類型的機器人可以移動到任何指定的位置和

朝向。

在非完整機器人的限制控制中,如果可以給定一個差動序列(v-left, v-right),就可以采用一些方法來解決移動的限制性問題。我們将方程(12)代入方程(15),可以确定某些運動控制狀态下的特殊情況:

如果v-right = v-left =&gt; nr = nl =&gt; r = ∞, ωδt = 0 =&gt;:這意味着機器人是直線移動的,θ角不變。

如果v-right = -v-left =&gt; nr = - nl =&gt; r = 0, ωδt =2nl×step/l且icc = [iccx, iccy] =

[x, y] =&gt; x′ = x, y′ = y, θ′ = θ + ωδt =&gt;:這意味着機器人繞着icc旋轉,也就是說,在[x, y]不變的情況下,θ可以取任意值。

結合這些操作,采用下面的算法可以讓機器人從初始位姿移動到任意目标位姿:

1.?調整機器人的朝向,直到機器人朝向與初始位置到目标位置的連線方向一緻,v-right = -v-left = v-rot。

2.?沿着目前方向直行,直至目标位置,v-right = v-left = v-ahead。

3.?調整機器人的朝向,直至與目标方向一緻,v-right = -v-left = v-rot。

其中,v-rot和v-ahead可以取值任意。

關于運動學方程的更多資訊可參考:http://www8.cs.umu.se/~thomash/reports/kinem-aticsequationsfordifferentialdriveandarticulatedsteeringuminf-11.19.pdf。

讓我們來看看機器人仿真所要用到的具體工具軟體。了解了機器人的運動學,将幫助你更容易地建構機器人的仿真試驗,它還有助于機器人軟體的編寫。我們将用到的仿真工具軟體有:

機器人作業系統(robot operating system,ros)

gazebo

這些都是目前比較流行的機器人程式設計和仿真工具。現在,讓我們先來簡要了解一下ros和gazebo的定義和特性。緊接着,我們将會讨論如何使用這些工具進行機器人仿真。

3.1.2 ros和gazebo簡介

ros是一個編寫機器人軟體的平台架構。ros的主要目标在于全球範圍内機器人軟體的複用。它是由一系列的工具、庫和約定組成的,目的在于通過多樣化的機器人平台去簡化複雜的和魯棒的機器人行為。

ros的官方定義:

ros是一個适用于機器人的開源的元作業系統。它提供了作業系統應有的服務,包括硬體抽象、底層裝置控制、常用函數的實作、程序間消息傳遞和包管理。它還提供了用于擷取、建構、編譯和跨計算機運作代碼所需的工具和庫函數。ros在某些方面與“機器人架構”相似,例如player、yarp、orocos、carmen、orca、moos和microsoft robotics studio。

關于ros的更多資訊,請參考:http://wiki.ros.org/ros/introduction。

ros的主要特點有:

分布式架構:ros是一個分布式的架構,可以同時在多台機器上運作,是以機器人的計算可以分開在不同的機器上進行。它可以減少機器人的線上處理程式。

代碼複用:ros主要的設計目标是提高代碼的複用率。代碼複用使得ros能夠在世界範圍内形成一個良好的研究團隊和開發社群。ros下的可執行檔案被稱為節點。這些可執行檔案能夠組合成一個單獨完整的實體,被稱為ros包。一組這樣的包集合被稱為堆,堆便于共享和分發。

語言獨立性:ros架構可以使用目前流行的程式設計語言(如python、c++和lisp)。節點可以用任何一種語言來編寫,通過ros這個架構節點之間可以做到無障礙交流。

測試簡單:ros有一個内置的單元/內建測試架構rostest,用于測試ros功能包。

大規模:ros适合大型的運作時系統和開發過程。

免費并且開源:ros的源代碼是開放的,并且是完全免費使用的。在bsd(berkeley software distribution)協定許可下,ros的核心部分是可以被複用的,包括用于商業領域和不開源的産品上。

接下來的部分主要讨論ros的基本架構。

ros系統架構

ros系統架構主要分成三個層級:

ros檔案系統級

ros計算圖級

ros社群級

ros的檔案系統主要包括硬碟上ros檔案的組織形式。其中,我們必須要了解的有以下幾個方面:

功能包(package):ros功能包是ros軟體架構的主要單元。一個ros功能包可能包含可執行檔案、ros依賴庫、配置檔案等幾個部分。ros功能包可以複用和共享。

功能包清單(package manifest):清單檔案(package.xml)列出了所有功能包的詳細資訊,包括名稱、描述、許可資訊和依賴關系。

消息(msg)類型:消息描述存儲在一個功能包内的msg檔案夾下。ros消息是一組通過ros進行資料發送的資料結構。消息的定義存儲在擴充名為.msg格式的檔案裡。

服務(srv)類型:服務描述存儲在srv檔案夾下,檔案的擴充名為.srv。該檔案定義了ros下服務請求和響應的資料結構。

ros的計算圖是ros處理資料的一種點對點的網絡形式。ros計算圖級中的基本概念包括節點、ros控制器、參數伺服器、消息和服務。

節點(node):執行運算的程序。例如,機器人的一個節點釋出了機器人裡程計資料,另一個節點釋出了雷射掃描資料等。一個ros節點的編寫,需要ros用戶端庫檔案的支援(如roscpp和rospy)。我們會在建立示例節點的時候,介紹這個庫檔案。

ros控制器(master):提供計算圖級上的名稱注冊和查找。如果沒有運作這個控制器,節點将無法找到其他節點,也不能釋出消息。

參數伺服器(parameter server):允許資料存儲在系統的核心位置。

消息(message):節點之間通過傳遞消息進行通信。每個消息都是有着簡單固定格式的資料結構。它支援多種資料類型,如整型、浮點型、布爾類型等。

主題(topic):節點之間通過ros消息傳輸系統進行資料交換,我們稱之為“主題”。主題是用來确定消息的内容的。對某一類資料感興趣的一個節點将會訂閱相對應的主題。一般來說,消息的釋出者和訂閱者并不知道對方的存在,這樣做是為了将消息的釋出和訂閱解耦。從邏輯上講,可以認為一個主題就是一條單獨固定的消息資料總線。每條資料總線(主題)都有一個名稱,任何一個節點都能連接配接到總線上進行消息的發送或接收,隻要消息類型是正确的。

服務(service):釋出/訂閱模型是一種非常靈活的通信模式,但這種多對多的互動方式無法在單向傳輸模式下同時進行請求/應答,它需要一種分布式的系統來完成。是以,請求/應答需要通過服務來進行,它定義了一對消息結構:一個用于請求,一個用于應答。當一個節點提供某個服務時,必須有一個名稱和一個用戶端,這個用戶端是用來發送消息請求和等待消息應答的。ros用戶端庫通常為程式員提供這種互動方式,類似于一種遠端過程調用。

消息記錄包(bag):一種用于儲存和回放ros消息資料的檔案格式。消息記錄包是一種存儲資料的重要機制,例如它能夠擷取并記錄各種難以收集的傳感器資料,而這些資料對于算法的開發和測試是非常必要的。

在ros計算圖級中ros控制器提供命名服務。它為ros節點存儲主題和服務注冊資訊。節點之間通過控制器進行通信,釋出它們的注冊資訊。由于這些節點都能與控制器進行通信,是以就可以根據需要與其他注冊節點建立連接配接,并接收來其他節點的資訊。當節點的注冊資訊發生變化時,控制器對這些節點還會産生回調服務,這樣就可以允許動态建立新的節點連接配接并運作。

節點之間是直接連接配接的,控制器類似一個dns伺服器,隻提供查找資訊服務。節點之間通過訂閱和釋出同一個主題進行連接配接請求,并在建立連接配接之後共同遵守一個約定的連接配接協定。ros中最常見的協定就是tcpros,它用的是标準tcp/ip的套接字。

圖3-8顯示了在節點和控制器之間,主題和服務的工作流程。

ros社群級的概念主要是關于ros資源的,它能夠通過獨立的網絡社群分享軟體和知識。這些資源包括:

發行版(distributions):ros發行版是一個可以獨立安裝、帶有版本号的一系列功能包集。它像linux發行版一樣發揮類似的作用:它們更容易安裝軟體,而且能夠通過一個軟體集合來維持一緻的版本。

軟體源(repositories):ros依賴于共享開源代碼與軟體源的網站或主機服務,在這裡不同的機構可以釋出和分享各自的機器人軟體元件。

ros wiki:用于記錄ros資訊文檔的主要論壇。任何人都可以注冊自己的賬戶,并貢獻自己的文檔,提供修正、更新,編寫教程等服務。

郵件清單(mailing lists):使用者郵件清單ros-users是關于ros更新的主要交流管道。同時它也是一個論壇,使用者可以在上面關于ros軟體使用中的遇到的問題進行提問。

在ros的官方網站www.ros.org上,可以獲得關于ros更多的概念及相關資訊。現在,我們來看看ros的安裝過程。

3.1.3 在ubuntu 14.04.2下安裝ros indigo

根據前面的讨論,我們了解到ros是一個元作業系統,需要安裝在一個主機系統上。ros完全支援ubuntu和linux,但對于windows和os x還處于實驗階段。下面列出了一些最新的ros發行版本。

發行版本 釋出時間

ros indigo igloo 2014.7.22

ros hydro medusa 2013.9.4

ros groovy galapagos 2012.12.31

下面,我們将要來看看在ubuntu 14.04.2 lts下安裝最新版本ros indigo igloo的過程。ros indigo igloo主要針對的是ubuntu 14.04 lts。如果你是windows或os x使用者,那麼你可以先在虛拟機(virtualbox)上安裝ubuntu,然後再安裝ros。virtualbox的下載下傳連結:https://www.virtualbox.org/wiki/downloads。

安裝說明如下:

1.?為了允許下載下傳restricted、universe和multiverse,需要配置ubuntu軟體庫。可以用ubuntu中的software &amp; update工具進行配置。我們可以在ubuntu unity查找菜單下進行簡單搜尋,勾選下列選項,如圖3-9截圖所示。

圖3-9 ubuntu軟體和更新工具

2.?設定系統,從packages.ros.org中接收ros功能包。ros indigo版本隻能在ubuntu 13.10和ubuntu 14.04下安裝。将packages.ros.org存儲到ubuntu apt庫清單下,使用下面的指令:

3.?接下來,添加apt-keys。apt-key是用于管理密鑰清單的,apt通過密鑰對功能包進行認證。經過這些密鑰認證過的功能包将被認為是可信的。使用下面的指令可以将apt-keys添加到ros功能包:

4.?添加了apt-keys之後,必須更新ubuntu功能包的索引。使用下面的指令添加并更新ros包和ubuntu包:

5.?更新了ros包之後,我們就可以開始安裝功能包了。使用下面的指令安裝ros必要的庫和工具:

6.?在桌面安裝完成之後,可能還需要安裝一些附加的功能包。每個附加安裝的功能包在書中後續适當的部分都會提到。桌面安裝需要花費一些時間。在ros安裝完成之後,你已經完成了大部分工作。下一步就是要初始化rosdep,有了它可以很容易地安裝ros資源包的依賴項進而進行編譯,并運作ros的核心元件:

7.?為了在目前的bash shell下使用ros工具和指令行,可以添加ros環境變量到.bashrc檔案中。這将會在每個bash會話開始的時候執行。使用下面的指令添加ros環境變量到.bashrc檔案:

下面的指令将在目前shell下執行.bashrc腳本,并在目前shell下産生變化:

8.?在安裝過程中有一個非常有用的工具rosinstall,這個工具需要單獨安裝。它僅需要一個指令就可以幫助你很容易地下載下傳到很多ros包的資源樹:

在安裝完ros之後,我們将讨論如何建立一個ros的示例包。在建立一個功能包之前,我們先要建立一個ros的工作區,然後在ros工作區中建立功能包。我們将采用catkin來建構系統,即使用ros下的一系列工具集合來建立功能包。catkin建構系統能夠将源代碼生成可執行檔案或共享庫。ros indigo使用catkin建構系統來建立功能包。下面,讓我們先來看看catkin是什麼。

什麼是catkin

catkin是ros的官方編譯建構系統。在使用catkin之前,ros用的是rosbuild系統建構功能包。在最新版本的ros中,catkin代替了它。catkin結合了cmake宏指令和python腳本來提供類似于cmake的通用工作流程。catkin提供了一個比rosbuild系統更好的包的分發功能,更好的交叉編譯以及更好的可移植性。有關catkin更多資訊可以參考wiki.ros.org/catkin。

catkin工作區是一個檔案夾,可以進行修改、建構以及安裝catkin包。

現在,我們來看一下如何建立一個ros下的catkin工作區。

使用下面的指令建立一個名為catkin_ws的父目錄和名為src的子檔案夾:

使用下面的指令将目錄切換到src檔案夾。我們将在src檔案夾中建立功能包:

使用下面的指令初始化catkin工作區:

在完成catkin工作區初始化之後,使用下面的指令能夠很容易地建構功能包(即使在沒有源檔案的情況下):

catkin_make指令用于在src目錄中建構功能包。在建構功能包之後,我們會在catkin_ws目錄下看到一個build檔案夾和一個devel檔案夾。可執行檔案被存儲在build檔案夾和devel檔案夾中,同時有shell腳本檔案添加到ros環境下的工作區中。

建立ros功能包

在本節中,我們将看到如何建立一個功能包,它包含兩個python節點。其中,一個節點用于釋出一個hello world消息主題,另一個節點訂閱該主題。

使用catkin_create_pkg指令在ros工作區建立一個catkin ros功能包。

在建立工作區的過程中,需要建立src檔案夾,并在該檔案夾下建立功能包。在建立包之前,使用下面的指令先切換到src檔案夾:

使用下面的指令建立一個hello_world包及std_msgs依賴項,這個依賴項包含标準的消息定義。ros下python用戶端庫是rospy:

在功能包成功建立後,會傳回下面的資訊:

在hello_world包被成功建立之後,需要添加兩個python節點或腳本,用于示範主題的訂閱和釋出。

首先,使用下面的指令在hello_world包中建立一個名為scripts的檔案夾:

切換到scripts檔案夾,并建立一個名為hello_world_publisher.py的腳本和一個hello_world_subscriber.py腳本,用于釋出和訂閱hello world消息。下面的章節将涉及這些腳本或是節點的代碼和說明。

hello_world_publisher.py

節點hello_world_publisher.py主要釋出了一個歡迎資訊hello world到主題hello_pub中,釋出的頻率為10hz。

這段代碼的分步解釋如下:

1.?如果編寫一個ros python的節點,則需要導入rospy。它包含python的api,其與ros的主題、服務等互相作用。

2.?為了發送hello world消息,需要從std_msgs包中導入一個string的資料類型。它對标準的資料類型有一個消息定義。使用下面的指令進行導入:

3.?下面的代碼建立了一個對象釋出到主題hello_pub上。資料類型是string,queue_size等于10。如果設定的訂閱頻率太慢來不及接收資料,可以調整queue_size選項:

4.?下面這行代碼強制初始化了所有ros python節點。初始化的時候需要給每個節點配置設定一個名稱。有了名稱之後,節點才能啟動。每個節點以名稱為唯一辨別,與其他節點進行通信。如果運作中兩個節點有相同的節點名稱,其中一個将會關閉。如果想要同時運作這兩個節點,使用标記anonymous = true。

5.?下面這行代碼建立一個速率對象r。在對象rate中使用sleep()方法,可以設定更新循環的速率。這裡,我們設定速率為10:

6.?下面這個循環将檢查rospy能否建構标記rospy.is_shutdown()。執行這個循環,在鍵入ctrl + c時,循環退出。

在循環内部,消息hello world會被列印在終端上,同時以10hz的速率釋出在主題hello_pub上:

7.?除了對python正常檢查__main__的之外,下面的代碼還将捕獲異常rospy.rosinterruptexception,當鍵入ctrl + c或者是其他原因使得節點關閉時,通過rospy.sleep()方法和rospy.rate.sleep()方法能将這個異常抛出。有了這個異常處理之後,就不會繼續執行sleep()後面的代碼了。

在釋出主題之後,我們來看看如何訂閱主題。接下來的部分介紹了訂閱hello_pub主題的相關代碼。

hello_world_subcriber.py

訂閱主題的代碼如下:

下面的代碼是當一個消息到達hello_pub主題後,執行一個回調函數。data這個變量包含了來自主題的消息,使用函數rospy.loginfo()可以将其列印出來:

下面将開始啟動節點hello_world_subscriber,并訂閱hello_pub主題。

1.?消息的資料類型為string,當消息到達這個主題後,執行一個名為callback的回調函數:

2.?直到節點被關閉,下面的代碼才使節點退出:

3.?檢查python代碼。主體部分是調用listener()方法,這個方法将訂閱hello_pub主題:

4.?在儲存了兩個python節點之後,需要使用chmod指令更改執行權限:

5.?在更改了檔案權限之後,使用catkin_make指令建構功能包:

6.?添加目前ros工作區路徑到所有終端,這樣就能夠在這個工作區内通路ros功能包:

下面是訂閱和釋出節點的輸出:

1.?首先,需要運作roscore以啟動節點。不同節點之間需要通過roscore指令或ros控制器進行通信。是以,執行第一條指令:

2.?在執行了roscore之後,使用下面的指令運作每個節點。

3.?釋出節點:

4.?訂閱節點。這個節點訂閱了hello_pub主題,如圖3-10所示:

以上我們簡要介紹了ros的一些基本概念。下面,我們來看看什麼是gazebo,以及在ros下如何使用gazebo。

圖3-10 訂閱節點

什麼是gazebo

gazebo是一個開源免費的機器人仿真器,可以用它來進行算法測試、機器人設計,以及真實場景下的回歸測試。gazebo可以準确有效地用于機器人群的仿真,模拟出複雜的室内和室外環境。gazebo擁有強大的實體引擎、高品質的圖形顯示能力、實用的程式設計接口和圖形界面。

gazebo有以下這些特點:

動态仿真:使用gazebo的一個實體引擎,可以進行機器人的動力學仿真,例如,open dynamics engine (ode) (http://opende.sourceforge.net/),bullet (http://bulletphysics.org/wordpress/),simbody (https://simtk.org/home/simbody/),dart(http://dartsim.github.io/)等。

先進的3d圖形顯示:gazebo使用ogre架構(http://www.ogre3d.org/),可以提供高品質的渲染、燈光、陰影、紋理效果。

傳感器支援:gazebo能夠支援大部分的傳感器,包括雷射測距儀、kinect型傳感器、2d/3d相機等。在仿真時可以選擇模拟噪聲或沒有噪音。

插件:可以為機器人、傳感器以及環境控制,開發自定義的插件。插件可以通路gazebo api。

機器人模型:gazebo可以提供目前主流的機器人模型,例如pr2、pioneer 2 dx、irobot create和turtlebot。同時也可以自定義機器人模型。

tcp//ip傳輸:可以在遠端計算機上運作仿真程式,通過gazebo的一個界面接口運作基于套接字的消息傳遞服務。

雲仿真:使用cloudsim架構在雲伺服器上運作仿真程式(http://cloudsim.io/)。

指令行工具:擴充的指令行工具用來檢查和記錄仿真過程。

gazebo安裝

gazebo安裝後可以作為ros下的一個獨立應用程式或內建應用程式使用。在本章中,我們将在ros下使用gazebo進行仿真,并在ros架構下測試我們所編寫的代碼。

如果想嘗試安裝最新的gazebo獨立仿真器,可以按照http://gazebosim.org/download 上給出的步驟進行安裝。

我們不需要分别單獨安裝gazebo和ros,因為gazebo是内置于完整版的ros桌面安裝程式中的。

ros功能包裡已經內建了gazebo程式包gazebo_ros_pkgs,就是在标準版gazebo之外加了一個封裝器。這個功能包為gazebo環境下的機器人仿真提供了必要的接口,并通過使用ros的消息服務實作。

使用下面的指令,可以完成ros indigo下gazebo_ros_pkgs的完整安裝:

在ros下測試gazebo

假定ros的環境已配置完成,在開始使用gazebo之前需要先運作roscore:

運作ros下的gazebo指令:

運作gazebo實際上需要兩個可執行檔案,分别是gazebo伺服器和gazebo用戶端。gazebo伺服器将執行仿真過程,gazebo用戶端則運作gazebo的gui。運作上面的指令,将同時并行運作gazebo的伺服器和用戶端。

gazebogui的螢幕截圖如圖3-11所示。

在運作gazebo之後,将生成下列主題。使用rostopic指令,我們會發現以下主題清單:

圖3-11 gazebogui界面

使用下面的指令,可以分别運作伺服器和用戶端。

運作gazebo伺服器:

運作gazebo用戶端:

我們已經在ros下安裝了gazebo基礎功能包。如果你不打算建構機器人的硬體部分,可以直接購買已經完成硬體設計的機器人turtlebot來進行下一步的仿真實驗,其網址為http://store.clearpathrobotics.com/products/turtlebot-2。

接下來,我們來看看如何在ros下安裝turtlebot。

ros indigo下安裝機器人turtlebot功能包集合

turtlebot從它的來源介紹到安裝過程,都可以參考:

http://wiki.ros.org/robots/turtlebot。

下面介紹的是turtlebot的一個快速安裝過程,及來自apt包管理器的依賴項。

1.?首先,需要安裝synaptic包管理器,可以使用下面的指令實作。synaptic是apt的圖形包管理程式,它基于gtk+的gui前端應用,提供了一個與apt-get指令行程式相類似的功能:

2.?在安裝了synaptic包管理器之後,打開它,通過使用關鍵字ros-indigo-rocon進行搜尋和過濾。

3.?安裝synaptic清單上所有的功能包,如圖3-12所示。

圖3-12 synaptic上的功能包

rocon也稱為機器人音樂會,是turtlebot包集合的一個依賴項。這個包的主要作用是将ros用到多機器人的平闆裝置上。關于更多rocon的資訊可參考http://wiki.ros.org/rocon。

在安裝rocon之後,還需要安裝另一個名為kobuki包的依賴項。kobuki非常類似于yujin機器人的移動平台(http://wiki.ros.org/kobuki)。turtlebot包依賴于這些功能包集合。

通過synaptic可以安裝ros-indigo-kobuki功能包,例如rocon包。圖3-13所示的是安裝過程的螢幕截圖。

圖3-13 功能包安裝過程螢幕截圖

通過以下每一步的詳細過程,展示了從ros indigo下的源代碼直接安裝和建構turtlebot最新版的ros包。這些包依賴項的安裝過程在前面已經提到過了。

1.?在home檔案夾下建立一個turtlebot檔案夾:

2.?切換到turtlebot目錄下:

3.?下載下傳turtlebot最新的源代碼:

https://raw.github.com/yujinrobot/yujin_tools/master/rosinstalls/indigo/turtlebot.rosinstall

4.?安裝所有依賴項的源代碼:

5.?建構源代碼:

6.?添加指令source ~/turtlebot/devel/setup.bash 到.bashrc檔案中,使得所有終端都能通路turtlebot :

7.?執行.bashrc檔案:

ubuntu下用apt包管理器安裝turtlebot的ros功能包

如果不想通過編譯源代碼的方式安裝turtlebot包,那麼可以使用apt包管理器。下面的指令是安裝ros下的turtlebot包:

現在,讓我們來看看如何在gazebo下對turtlebot進行仿真,并将機器人移置到一個空的環境下。

ros和gazebo環境下對turtlebot進行仿真

turtlebot仿真器功能包包含了turtlebot_gazebo包,可以在gazebo下對turtlebot進行仿真。

在turtlebot包安裝成功後,在ros和gazebo環境下鍵入下面的指令,打開turtlebot仿真器:

在另一個終端,運作下面的指令。它将執行一個python腳本,使得可以通過鍵盤來控制turtlebot,這就是所謂的鍵盤遠端操作:

輸出的螢幕截圖如圖3-14所示。

上圖視窗左上角顯示的是終端在執行仿真指令,視窗左下角顯示的是在執行teleop指令。

我們可以用螢幕上提到的關鍵詞通過鍵盤遠端操作來移動機器人。還可以用rostopics指令來監測機器人模型的值。使用下面的指令,還可以檢視目前主題:

圖3-14 輸出的螢幕截圖

傳感器檢測到的所有值都會釋出出來,例如kinect傳感器、車輪編碼器的裡程計值、裡程計的慣導(imu)值,以及gazebo的狀态值。

通過turtlebot包克隆得到的機器人模型和仿真參數都是不一樣的。我們可以對大部分擁有差動轉向系統的移動機器人執行這樣的克隆操作。通過複制turtlebot代碼,可以為機器人建立多樣的功能包。為我們自己定義的機器人命名為chefbot代替原來的turtlebot,并根據這個名字來命名這個機器人的所有功能包。

用turtlebot包進行gazebo模組化

在turtlebot的包集合裡,可以用turtlebot_gazebo和turtlebot_description這兩個包來實作機器人的運動學模型和仿真。其中,turtlebot_gazebo功能包提供了在gazebo下啟動仿真程式所需的檔案。turtlebot_description功能包涵蓋了機器人的運動學模型和gazebo模型。

通過對turtlebot包進行複用和定制,可以為我們的機器人重新建立相同的功能包集合。我們的機器人被命名為chefbot,那麼就可以建立chefbot_gazebo功能包,其中包含啟動仿真程式的檔案。ros下的啟動檔案是一個xml檔案,在這裡可以通過運作單個檔案,達到能夠同時啟動多個節點并且設定多個參數的目的。需要使用roslaunch指令,運作啟動檔案。

可以在http://wiki.ros.org/roslaunch上查到已經實作的chefbot的ros功能包。

下面的指令完整地複制了chefbot的ros功能包:

chefbot_description功能包涵蓋了機器人的運動學模型和gazebo模型。圖3-15中列出了這兩個功能包中各種不同的檔案。

圖3-15 chefbot_description和chefbot_gazebo功能包

切換到目錄catkin_ws,我們進行ros包的建立和開發。在src檔案夾中,首先建立一個名為chefbot的檔案夾。然後,使用下面的指令建立chefbot的所有功能包:

使用下面的指令,建立chefbot_gazebo包以及所需要的依賴項:

在建立了功能包之後,你可以從packt publishing網站下載下傳的章節源代碼中,複制chefbot_gazebo包中的兩個檔案夾。這段代碼改編自turtlebot_gazebo包,也可以參考它的原始代碼進行更深入的開發。

以下内容是每個檔案的使用說明。首先讨論的是chefbot_gazebo包。在啟動檔案夾下,對每個功能都有一個啟動檔案。

chefbot_empty_world.launch:該檔案在gazebo下啟動chefbot模型,設定周圍環境為空,機器人的環境資訊存儲在一個gazebo檔案裡。

chefbot_playground.launch:該檔案在gazebo下啟動chefbot模型,設定的gazebo仿真環境包含一些随機的障礙物,例如圓柱體和盒子等。

gmapping_demo.launch:該檔案實作的是同步定位與映射(simultaneous localiza-tion and mapping,slam)。通過slam技術,可以将周圍環境建立地圖,并儲存下來供将來使用。在我們的示例中,可以使用這個功能包建立酒店環境的地圖。我們将在下一章讨論更多關于gmapping的功能實作。關于slam的更多詳細資訊,可以參考http://wiki.ros.org/gmapping。

amcl_demo.launch:amcl(adaptive monte carlo localization)即自适應蒙特卡羅定位(http://wiki.ros.org/amcl)。在建立好環境地圖之後,機器人可以在地圖上完成自身定位,同時通過輪速得到回報,進而實作自主導航。機器人的回報被稱為裡程計。amcl定位算法和導航算法,如路徑規劃等,都是通過這個啟動檔案實作的。

chefbot_base.launch.xml:這個xml檔案解析了一個xacro檔案chefbot_circles_kinect.urdf.xacro,用于chefbot_description檔案夾下的urdf。将xacro檔案轉換為urdf格式之後,相當于生成了ros下的機器人模型。在後續部分,我們将學習到更多關于urdf和xacro的相關知識。

在生成了urdf格式的機器人模型之後,這個xml檔案将從urdf格式的機器人描述中生成新的适用于gazebo環境下的模型描述。同時,它也會啟動一個速度優化節點,将優先考慮機器人收到指令的反應速度。指令速度的一個實際例子是通過鍵盤或操縱杆對機器人進行操控時機器人的反應速度。根據不同的優先級配置設定,不同的指令以不同的優先級到達機器人中。下面,我們開始了解更多關于urdf和xacro的介紹,進而對機器人能夠進行更清楚地描述。

什麼是機器人模型,urdf、xacro還是robot state publisher

ros下機器人模型的功能包有很多,使用它們可以對各式各樣的機器人進行模組化,對于模型的描述有固定的格式(urdf),它們都存儲在xml檔案中。功能包集合的核心是urdf,它的作用是解析urdf檔案,并建構一個機器人對象模型。

unified robot description format(urdf,統一機器人描述格式)是xml規範格式,用來描述機器人模型。我們可以用urdf來表示機器人的下列特點:

機器人的動力學和運動學描述

機器人的可視化表示

機器人的碰撞模型

機器人的描述是由一系列連接配接、部件和關節組成的,這些關節能夠把不同的連接配接組合在一起。一個典型的機器人描述如下面的代碼所示:

如果想了解更多有關urdf的資訊,可以參考:

http://wiki.ros.org/urdf

http://wiki.ros.org/urdf/tutorials

xacro(xml宏)是一種xml格式的計算機宏語言。有了xacro,我們可以建立更簡短且可讀性更強的xml檔案。可以在urdf下使用xacro來簡化urdf檔案。如果要添加xacro到urdf,需要調用另外的解析節點将xacro轉換為urdf。

有關xacro更多的介紹,可以參考:http://wiki.ros.org/xacro。

robot_state_publisher可以将機器人的狀态釋出到tf上(http://wiki.ros.org/tf)。狀态一旦釋出,系統的所有元件就都可以使用tf。這個功能包的輸入是機器人的關節角,并且通過機器人的運動學樹模型計算得出機器人連接配接的3d姿态,進行釋出。這個包可以看成是一個庫,或者相當于一個ros節點。這個包已經經過測試,且代碼是穩定可靠的。在一段時間内,是不會有很大改變的。

world files:這些檔案表示機器人的周圍環境會跟機器人模型一起加載到gazebo上。兩個world檔案,empty.world和playground.world,都包含在啟動檔案裡,是以在啟動gazebo時就已經将其自動加載。

cmakelist.txt和package.xml:這些檔案是在建立包的時候一起建立的。在一個功能包内,cmakelist.txt檔案幫助建構節點或庫,package.xml檔案内的清單列出了這個包的所有依賴項。

在ros下建立一個chefbot_description

chefbot_description功能包包括機器人的urdf模型。在建立這個包之前,可以通過下載下傳得到chefbot的功能包集合。這樣能幫助你加快建立的過程。

下面,我們來看看如何建立chefbot_description。以下步驟将指導你如何建立這個功能包:

1.?首先,需要切換到src目錄下的chefbot檔案夾中:

2.?使用下面的指令建立機器人的描述功能包,以及它的依賴項,例如urdf、xacro和kobuki的描述功能包,并建立移動機器人:

3.?從下載下傳的源代碼中,複制meshes、urdf和robots這三個檔案夾到package檔案夾下。mesh檔案夾涵蓋機器人的三維模型描述,urdf檔案夾包含urdf描述和機器人傳感器資訊。整個機器人模型被拆分成為一系列的xacro檔案,使其具有更好的可讀性,也更容易進行調試。

下面,我們來看看這個包裡每個檔案的功能。可以參考下載下傳的源代碼來檢查這些檔案,也可以将這些下載下傳的檔案直接複制到新建立的檔案夾中。每個urdf檔案夾的功能介紹如下:

chefbot_base.urdf.xacro:這個xacro檔案表示的是機器人的運動學模型。它用urdf标簽對機器人的所有連接配接單元進行模組化。連接配接單元包括兩個輪子、兩個腳輪和陀螺儀等。3d kinect傳感器的模組化不包含在這個檔案中。它還為每個連接配接附加了網格資訊。這個檔案是對kobuki移動裝置功能包的複用。

chefbot_base_gazebo.urdf.xacro:這個檔案是對gazebo下機器人每個連接配接的模型表示。它包括執行機構的定義、傳感器的定義、差動機器人的參數設定等。gazebo讀取這些具體數值來執行仿真試驗。可以通過改變這些檔案中參數的值,對機器人的參數進行調整。

chefbot_gazebo.urdf.xacro:之前的gazebo中的urdf不包含kinect 3d傳感器的定義。這個檔案可以用于啟動kinect_openni,它是一個gazebo插件,用于仿真機器人的kinect傳感器。

chefbot_library.urdf.xacro:這個檔案包含所有的xacro檔案和機器人傳感器。僅這個檔案就可以啟動機器人的所有描述。

chefbot_properties.urdf.xacro:這個檔案包括了kinect 3d傳感器在機器人模型中的位置。

common_properties.urdf.xacro:這個檔案包含了網格的屬性,例如網格的顔色。

kinect.urdf.xacro:這個檔案存放在sensors檔案夾下,包含了gazebo下的kinect參數。chefbot_gazebo.urdf.xacro和chefbot_properties.urdf.xacro這兩個檔案都包含了這個檔案,它用于kinect的參數設定。

chefbot_circles_kinect_urdf.xacro:這個檔案存放在robot檔案夾下。它包括chef-bot_library.urdf.xacro檔案,會加載開始仿真時所需要的機器人的所有描述檔案。

在meshes檔案夾中,主要的内容是機器人的身體和輪子兩部分,以及機器人chefbot的3d模型。

與turtlebot相似,使用下面的指令可以啟動chefbot仿真:

當執行這個指令時,啟動檔案将會按照圖3-16所示的順序執行。

我們已經了解了每個檔案的功能。還需要重點讨論以下幾個檔案:

chefbot_gazebo.urdf.xacro

kinect.urdf.xacro

chefbot_base.urdf.xacro

圖3-16 啟動檔案的執行順序

我們來看看chefbot_base_gazebo.urdf.xacro這個檔案。這個檔案的定義很長,這裡我們隻讨論其中重要的部分。

在讨論gazebo的定義之前,可以參考urdf中提到的gazebo的标簽參數。對于urdf的各種标簽,可以參考http://osrf-distributions.s3.amazonaws.com/sdformat/api/1.5.html。

在前面講述的urdf部分,提到過gazebo下每個連接配接的定義用标簽&lt;gazebo&gt;&lt;/gazebo&gt;辨別。下面描述的是通過使用gazebo參數,對urdf定義的機器人的各個關節連接配接進行模組化的過程。這裡的關節包括主動輪和腳輪部分的關節。其中,參數mu1和mu2表示摩擦系數,kp和kd表示關節的動力剛度和阻尼。mindepth表示在使用接觸修正脈沖之前允許的最低深度。maxvel表示最大接觸修正速度的截斷項:

下面代碼描述的是慣性測量單元(inertial measurement unit,imu)在gazebo下對機器人的模組化過程(http://en.wikipedia.org/wiki/inertial_measurement_unit)。imu在機器人上的主要作用是能夠得到一個準确的裡程計值。

下面給出了gazebo下差分驅動控制器插件的代碼。kobuki驅動系統下的差分驅動插件将被重用。在這一節中,還會提到機器人的主要測量度量,如輪子間的距離、輪子直徑、電機的轉矩等。本節内容還包括懸崖感應傳感器,但它不會用在我們所搭建的機器人模型中。如果不用它,也可以忽略這部分内容:

這個檔案主要包含各個關節的定義和kinect傳感器的連接配接。

這個檔案還包括兩個啟動檔案:

檔案chefbot_gazebo.urdf.xacro是由gazebo下的kinect插件組成的。我們将複用turtlebot的這個插件。kinect插件實質上就是libgazebo_ros_openni_kinect.so檔案,我們還可以定義kinect參數,如下面的代碼所示:

這個檔案定義了機器人的關節和連接配接,還包括chefbot_gazebo.urdf.xacro檔案。機器人的關節主要是主動輪、腳輪等。其中,xml檔案定義了機器人的身體、主動輪和

腳輪。

機器人的基本連接配接包括機器人的身體,但不包括輪子。可以從blender軟體中導出機器人身體部分的網格檔案,并用meshlab将其儲存成擴充名為.dae的檔案(http://en.wikipedia.org/wiki/collada)。基礎關節部分是一個固定類型檔案,在底座上沒有固定運動部分。可以定義機器人每個連接配接的配置檔案和慣性。這些檔案都是從turtlebot裡複用過來的,如下面的代碼所示:

3.1.4 在酒店環境下進行chefbot和turtlebot仿真

詳細讨論了每個檔案之後,開始嘗試在酒店環境下對兩個機器人進行仿真。仿真的過程和螢幕截圖如下。

與turtlebot相似,可以使用下面的指令啟動chefbot:

圖3-17顯示的是gazebo環境下的機器人模型。

圖3-17 gazebo環境下的機器人模型

退出gazebo,開始建構機器人的酒店環境。

第一步是建立一個world檔案,并将其儲存為擴充名為.world的檔案。一個典型的酒店環境,有9個矩形桌子,如下面的螢幕截圖所示。可以通過下面的指令建立一個空的gazebo的world檔案,選用基本形狀,在gazebo下搭建一個環境:

1.?啟動roscore:

2.?在gazebo下打開一個空的world檔案:

3.?現在已經建立了一個環境,如圖3-18所示,并儲存為empty.world檔案。

4.?複制empty.world檔案到chefbot_decription包下的world檔案夾中。使用下面的指令,啟動機器人環境:

在對機器人chefbot進行仿真之前,我們将建立一個相同的環境。對于機器人turtlebot,過程也是相類似的。

與chefbot_description不同,對于turtlebot使用者,需要複制turtlebot_description檔案夾:

圖3-18 建立的環境

1.?開始啟動gmapping檔案,進行區域映射。使用下面的指令啟動gmapping過程:

2.?對于turtlebot,使用下面的指令:

3.?啟動gmapping過程,如果想檢視映射過程,啟動rviz,它是一種ros下的傳感器資料可視化工具(http://wiki.ros.org/rviz)。對于turtlebot,使用相同的指令:

rviz工具的螢幕截圖如圖3-19所示。

建立一個房間的地圖,必須啟動鍵盤遙控操作:

1.?使用鍵盤操控功能,可以通過操作鍵盤移動機器人,這樣可以對整個區域進行建圖:

2.?對于turtlebot,使用的指令相同。一個完整的周圍環境地圖如圖3-20所示。

3.?地圖建構完成之後,使用下面的指令将地圖儲存為hotel_world檔案:

對于turtlebot,使用的指令相同。

4.?地圖儲存完成之後,退出目前正在使用的所有其他應用程式。

圖3-19 rviz工具的界面

圖3-20 完整的環境地圖

5.?地圖生成之後,下一步是使用生成的地圖,進行機器人的定位和自主導航。

6.?使用下面的指令,啟動gazebo:

7.?對于turtlebot,使用下面的指令:

8.?對于chefbot,進行amcl的示範。需要注意路徑,每個使用者的路徑可能會不一樣。

9.?對于chefbot,使用下面的指令:

10.?對于turtlebot,使用下面的指令:

11.?使用下面的指令,運作rviz。對于turtlebot和chefbot,所用的指令是相同的:

現在,通過2d nav goal功能按鈕,可以指令機器人移動到地圖上的某個位置。單擊這個按鈕,選擇一個桌子附近的位置。在點選了這個位置之後,它将進行路線規劃,機器人按照規劃的路線移動到這個位置,如圖3-21所示。

圖3-21 機器人的規劃路線

機器人能夠繞過障礙,并規劃出一條距離目标位置最短的路徑。如果建構的地圖是準确的,在經過幾次運作之後,會發現機器人的移動過程非常完美。地圖建構的過程可以參考連結http://wiki.ros.org/costmap_2d進行不斷優化。作為提供食物服務的應用來說,機器人需要有精度很高的環境地圖,這樣能為它傳送食物提供精确的位置。