導航:首頁 > 源碼編譯 > ros機器人導航演算法

ros機器人導航演算法

發布時間:2023-05-10 03:00:29

㈠ 怎麼用ROS實現自己的演算法

最近幾年各種移動機器人開始涌現出來,不論租遲是輪式的還是履帶式的,如何讓移動機器人移動都是最核心的工作。要讓機器人實現環境感知、機械臂控制、導航規劃等一系列功能,就需要弊則李操作系統的盯派支持,而ROS就是最重要的軟體平台之一

㈡ ROS機器人模擬(六)- 航行,路徑規劃和SLAM

實時建立環境地圖並定位,要依靠於昂貴的激光雷達,不過現在有了可替代的工具,可以偽造出激光雷達的效果,算是偽造吧。
可替代的工具是微軟的Kinect和Asus Xtion相機。可以看depthimage_to_laserscan和kinect_2d_scanner 兩個包的內容。
這一章主要以3個包的內容展開航行的設計:

move_base使用 MoveBaseActionGoal message ,看一下消息的定義:
rosmsg show MoveBaseActionGoal
會顯示以下信息:

這個看起來有點復雜,我們下面會使用簡單一點的東西來指定目標。

move_base運行之前需要設置四個文件。這些文件定義了障礙,機器人半徑,路徑需要規劃多遠,機器人運行多快等。
這四個設置文件可以在config文件夾下找到:

move base節點需要一個環境地圖才能運行,不過使用一個空地圖也是可以的。我們後面會使用真正的地圖。 rbx1_nav package包含了一個空地圖叫做 blank_map.pgm ,它在maps的子目錄下。描述文件叫blank_map.yaml。啟動move_base節點和空地圖的啟動文件叫fake_move_base_blank_map.launch,它在launch的子目錄下。
現在來看一下啟動文件。

首先在一個空白地圖上啟動了mao_server node.地圖的描述文件就是那個.yaml文件.
然後載入了fake_move_base.launch文件擾襲,它啟動了move_base node並且載入了必要的參數.
最後,因為我們使用了空白的地圖並且我們的模擬機器人沒有感測器,機器人不能使用掃描數據定位.我們對機器人量程框架和地圖框架,或者說坐標系,做一個靜態的簡單對應,換句話說,就是假設機器人的編碼器能夠獲得理想的數據.
然後我們再看一下fake_move_base.launch文件:

這個啟動文件運行了move_base node和五個rosparam來導入參數.costmap_common_params.yaml導入了兩次,是為了把這些參數同時設置在global_costmap namespace 和 local_costmap namespace.使用後面的ns來指定.
要在模擬中嘗試,首先啟動ArbotiX模擬器:

這里可以換成別的機器人.
然後在空白地圖上啟動move_base node:

如果你還沒有運行過RViz,可以使用配置好的參數文件啟動:

現在我們已經准備好了使用move_base控制機器人,而褲李液不是簡單的使用Twist消息.
為了測試一下.首先我們讓機器人前進1米.現在我們的機器人位於(0,0,0)在/map坐標系和/base_link坐標系.我們可以使用任意一個坐標系指定這次移動.
然而,第一次移動並不能讓機器人到達准確的位置,隨後的誤差要靠/base_link坐標系去比較消除.所以我們最好在/map上面設定目標.指令如下:

把機器人移動回原點,只要停止剛才的命令,然後按照相同的格式輸入原點坐標就可以了,像下面這樣:

你可以看到一個細細的綠線,那個是全局路徑規劃,還可以看到一個紅線,是實時更新的本地路徑規劃.想要更為清晰的看到這兩條線,可以在RViz上面關掉Odometry, Goal
Pose and Mouse Pose,然後重新運行上面的命令.

綠色的路徑比較平坦,是因為這中間沒有任何的障礙,另外,它還跟我們的一些參數設置有關.比如,pdist_scale (0.4) and gdist_scale (0.8),還有最大線速度( max_vel_x ).我們的局部路徑,跟我們的全局規劃路徑相差很大,想要讓我們的機器人更加貼近我們的全局規劃路徑,我們可以使用rqt_reconfigure增大pdist_scale參胡物數或者減小max_vel_x.
再打開一個新窗口,啟動rqt_reconfigure:

然後,打開move_base->TrajectoryPlannerROS,把pdist_scale設置的大一點,比如0.8,然後把gdist_scale設置的小一點,比如0.4.然後重新運行運動指令,看看有什麼變化.
好像是好了很多.

我們剛剛是使用nav.rviz文件啟動RViz的,這樣我們可以直接點擊2D Nav Goal在地圖上指定目標.點擊時不要放開,可以旋轉改變設定目標的方向.
我們可以再RViz的窗口上看到設置信息:

我們最好重新開始,關掉之前所有的node,然後:

然後執行命令:

程序裡面有很多注釋,可以自己打開看一下.

move_base最厲害的一點是,它可以在到達指定位置的同時躲避障礙.局部路徑規劃會重新計算路徑.
我們將會打開一個帶有障礙的地圖,然後仍然使用move_base_square.py運行機器人,看它是否會避開障礙,並且到達目標.
首先打開地圖:

然後清理到move_base節點的資源:

這個命令會清理掉所有move_base已經退出的參數,它的清理程度僅次於重啟roscore.
然後運行載入地圖和move_base:

然後運行RViz:

黃色的部分就是障礙,其他顏色代表一個擴大的安全距離的緩沖.
也可以使用點擊,像之前那樣,設定目標.

㈢ 一、ROS機器人如何利用GPS模塊來精確定位

GPS模塊在戶外機器的定位導航方面是一個最基本的配置。注意這里主要是針對在戶外工作的機器人,若您的機器人是室內使用的,根本不會被允許到室外工作,那麼GPS模塊就沒有任何價值了。因為建築物的屋頂和牆體會把GPS衛星信號大幅度削弱,一般商用級別的GPS模塊根本接收不到符合要求的信號。是不是戶外機器人搭載GPS模塊,就可以精確知道自己的位置?璞數技術來為大家解答一洞虛液下:是,也不是!說是,是因為在大尺度地圖(比例尺一般為每厘米100米左右)上,普通商用經濟款的GPS模塊一般能達到的定位精度是20米~50米,在100米/厘米這個級別的地圖上可以比較准確的知道機器人當前位置。說不是,是指在機器人工作區域的微尺度地圖(一般是每厘米10米以下),GPS模譽陵塊給出的位置誤差范圍太大,僅僅利用GPS模塊算出來的經緯度坐標無法實現機器人的准確定位,當然更無法推納物算出機器人的准確運動方向。很遺憾,20米~50米的位置誤差對機器人完成指定任務的應用來說是不可接受的。

㈣ 激光雷達SLAM演算法

機器人研究的問題包含許許多多的領域,我們常見的幾個研究的問題包括:建圖(Mapping)、定位(Localization)和路徑規劃(Path Planning),如果機器人帶有機械臂,那麼運動規劃(Motion Planning)也是重要的一個環節,SLAM需要機器人在未知的環境中逐步建立起地圖,然後根據地區確定自身位置,從而進一步定位。

ROS系統通常由大量節點組成,其中任何一個節點均可以通過發布/訂閱的方式與其他節點進行通信。舉例來說,機器人上的一個位置感測器如雷達單元就可以作為ROS的一個節點,雷達單元可以以信息流的方式發布雷達獲得的信息,發布的信息可以被其他節點如導航單元、路徑規劃單元獲得。

ROS的通信機制:

ROS(機器人操作系統)中SLAM的一些功能包,也就是一些常用的SLAM演算法,例如Gmapping、Karto、Hector、Cartographer等演算法。我們不會去關注演算法背後的數學原理,而是更注重工程實現上的方法,告訴你SLAM演算法包是如何工作的,怎樣快速的搭建起SLAM演算法。

地圖 : ROS中的地圖很好理解,就是一張普通的灰度圖像,通常為pgm格式。這張圖像上的黑色像素表示障礙物,白色像素表示可行區域,灰色是未探索的區域

地圖在ROS中是以Topic的形式維護和呈現的,這個Topic名稱就叫做 /map ,由於 /map 中實際上存儲的是一張圖片,為了減少不必要的開銷,這個Topic往往採用鎖存(latched)的方式來發布。地圖如果沒有更新,就維持著上次發布的內容不變,此時如果有新的訂閱者訂閱消息,這時只會收到一個 /map 的消息,也就是上次發布的消息;只有地圖更新了(比如SLAM又建出來新的地圖),這時 /map 才會發布新的內容。 這種方式非常適合變動較慢、相對固定的數據(例如地圖),然後只發布一次,相比於同樣的消息不定的發布,鎖存的方式既可以減少通信中對帶寬的佔用,也可以減少消息資源維護的開銷。

Gmapping ,Gmapping演算法是目前基於激光雷達和里程計方案裡面比較可靠和成熟的一個演算法,它基於粒子濾波,採用RBPF的方法效果穩定,許多基於ROS的機器人都跑的是gmapping_slam。

gmapping的作用是根據激光雷達和里程計(Odometry)的信息,對環境地圖進行構建,並且對自身狀態進行估計。因此它得輸入應當包括激光雷達和里程計的數據,而輸出應當有自身位置和地圖。

論文支撐:R-LINS: A Robocentric Lidar-Inertial State Estimator for Robust and Efficient Navigation

6軸 IMU:高頻,聚焦自身運動,不採集外界環境數據
3D LiDAR:低頻,聚焦車體運動,採集外界環境數據

R-LINS使用以上兩種感測器來估計機器人的運動姿態, 對於任一感測器而言,單獨的依靠自己的數據是很難實現地圖構建的, 比如純雷達模型使用的感測器是激光雷達,可以很好的探測到外界的環境信息。但是,同樣的,也會受到這些信息的干擾,再長時間的運算中會產生一定的累計誤差。為了防止這種誤差干擾到後續的地圖構建中,需要使用另一種感測器來矯正機器人自身的位姿信息, 即IMU感測器,IMU感測器由於是自身運動估計的感測器,所以,採集的都是自身運動的姿態信息。可以很好的矯正激光雷達里程計的位姿信息。所以,通常使用激光雷達和慣導來進行數據融合,實現姿態信息的矯正。

一共分為三大塊:

㈤ ROS機器人里程計模型

3.5 移動機器人系統模型

相信大家的機器人平台STM32端底層控制和機器人urdf建模都已經順利完成了,在正式開始ros端編寫機器人啟動功能包之前,我們還不得不學習一些必要的理論知識。別擔心數學不好,這里基本都是高中數學。下面我們開始,Are you ready? 沒准備好也開始了。

3.5.1 常用坐標系系統模型

在移動機器人技術研究中,最為常用的坐標系統是笛卡爾坐標系統。而在SLAM演算法研究中,有如下幾個比較常見的笛卡爾坐標系統,它們分別為 機器人坐標系XR YR OR  、 感測器坐標系XS YS OS  、 世界坐標系XW YW OW  。顧名思義,世界坐標系是描述機器人全局信息的坐標系;機器人坐標系是描述機器人自身信息的坐標系;感測器坐標系是描述感測器信息的坐標系。他們之間的關系如下圖所示:

從圖中我們可以知道,首先世界坐標系是固定不變的,機器人坐標系和感測器坐標系是在世界坐標系下描述的。這里我們看到的是俯視圖,機器人坐標系和感測器坐標系原點重合但是存在一定的角度,不同的機器人坐標系關系是不同的。當我們使用感測器數據時,這些坐標系間的關系就是我們變換矩陣的參數,因為感測器的數據必定是要變換到機器人坐標系或者世界坐標系中使用的。

3.5.2 移動機器人位姿模型

移動機器人的位姿模型就是機器人在世界坐標系下的狀態。 常用隨機變數Xt =(xt ,yt ,θt )來描述t時刻的機器人在世界坐標系下的狀態,簡稱位姿 。其中(xt ,yt )表示的在t時刻機器人襲兄毀在世界坐標系下的位置,θt 表示機器人的方向。 默認世界坐標系的X正半軸為正方向,逆時針旋轉為旋轉正方向,初始時刻機器人坐標系和世界坐標系重合 。某時刻t機器人的位姿描述如下圖所示:

3.5.3 移動機器人里程計模型

簡單的說, 移動機器人的里程計就是機器人每時每刻在世界坐標系下位姿狀態 。 常用的激光SLAM和導航演算法通常都需要移動機器人的里程計作為控制輸入 。這也是我們對本章理論內容講解的必要性。

不同底盤的里程計模型有所不同,本文以兩輪差分輪式機器人為例介紹里程計模型以及如何計算里程計。在介紹里程計模型之前,要先介紹差分輪式機器人的運動學模型,這樣可以先了解一下機器人的物理特性。 首先明確差分模型的機器人始終做的是以R為半徑的圓弧運動 。如下圖所示,機器人的線速度V、角速度ω,左右輪速用VL和VR表示,用D表示輪間距,D=2d,右輪到旋轉中心的距離為L。

ROS端給機器人底盤(STM32端)發送的是機器人要達到的線速度V和角速度ω,而我們底盤控制板需要的是左右輪速VL和VR來進行速度控制。所以,我們通過高中知識可以得到他們之間的關系:

上面的公式是由角速度和線速度的關系得來,如果不知道這個關系,那就自行網路吧拍備,我相信你一定知道。 從這些公式我們是不是發現了什麼,機器人的輪間距影響著我們向左右輪分發速度以及合成角速度,所以這是個我們需要注意的參數,不同的機器人結構,該參數就不同。

有了上面坐標系系統模型、位姿模型的基礎,里程計就非常簡單了。 里程計的計算是指以機器人上電時刻為世界坐標系的起點(機器人的航向角是世界坐標系X正方向)開始累積計算任意時刻機器人在世界坐標系下的位姿塵行 。通常計算里程計方法是 速度積分推算 : ==通過左右電機的編碼器測得機器人的左右輪的速度VL和VR,在一個短的時刻△t內,認為機器人是勻速運動,並且根據上一時刻機器人的航向角計算得出機器人在該時刻內世界坐標繫上X和Y軸的增量,然後將增量進行累加處理,關於航向角θ採用的IMU的yaw值。然後根據以上描述即可得到機器人的里程計== 。具體計算如下圖所示:

至此,里程計模型原理及計算就結束了。

3.5.4 2D激光雷觀測模型

我們做移動機器人平台少不了使用2D激光雷達,所以了解激光雷達的觀測模型也是有必要的。

激光雷達通常由精準控制的旋轉電機、紅外激光發射器、紅外接收視覺系統和主控組成。

激光雷達的測距原理分為兩種,一種是基於三角測距,另一個是基於TOF(飛行時間)。基於三角測距的激光雷達表現出的特點,價格便宜、中近距離測距較准確、遠距離精度差。基於TOF的激光雷達表現出來的特點,價格昂貴、測距精度高、測距范圍廣、掃描頻率高。

本文採用市面上比較便宜的基於三角測距的低成本激光雷達RPLIDAR A1。該激光雷達在每次測距過程中,發射器發射紅外激光信號,視覺採集系統接收激光反射信號。在經過主控實時解算後,將激光雷達幾何中心到被測物體的距離值以及當時的角度值,通過主控的通信介面發出。RPLIDAR A1 工作原理如圖所示。

激光雷達在整個SLAM和導航中起著不可替代的作用。 第一,通過激光雷達觀測數據與地圖進行匹配,估計出機器人的位姿 ;第 二,當機器人估計出較准確的位姿時,通過激光雷達的觀測數據建立環境地圖 ; 第三,在機器人導航過程中,檢測地圖中的未知障礙物 。本文主要使用的觀測感測器是2D激光雷達RPLIDAR A1如下圖所示:

RPLIDAR A1是一款360度激光雷達,角度解析度≤1,輸出的每一個激光點的數據都是使用極坐標的方式描述,一個距離值以及一個對應的角度值。

㈥ ROS機器人底盤(2)-運動解算

這里以 zeus 為例子講述運動正解與逆解

從整體速度轉換為各個輪子速度即為正解,關系著如何根據既定速度控制機器人正確運行

我們知道 ROS 裡面驅動小車最終下發的為線速度穗橡和角速度,通過 rosmsg show 可以看到

可以看到 ROS 坐標系規定

對於每個輪子:
前輪,左輪及後輪速度分別設為 Vf, Vl,Vr (假設輪子使得底盤逆時針時的線速度為正);輪子所在圓直接為 L

從各個輪子速宴族埋度(行徑距離)轉換晌螞為整體機器人的速度(坐標、姿態)

只需從正解

反推即可得到

通過正解可以轉換對機器人的速度控制為對各個輪子的速度控制;通過逆解,通過積分可以根據每個輪子的行徑距離求得機器人的坐標和姿態

model.h 模型介面類

differential.h 差分輪解算實現

omni3.h 三輪全向輪解算

根據配置選擇載入對應模型介面解耦模型的正反解算

㈦ ROS(機器人操作系統)

現在還只是個草稿,後面會陸續更新改正,保證大家一看就會,絕對不廢

只是幫助大家理解,很多知識點只是類比推理,是有錯誤的,哈哈,勿噴

蠻多人在學習ROS的時候,其實還是不太理解什麼是ROS,為什麼要去ROS,以及怎麼樣去學習ROS,我大二的時候開始接觸到ROS,也經歷過比較痛苦的一段時間,所以希望用這篇文章來幫助大家對ROS有一個較好的理解。

首先我們拋開ROS來說,如果我們要寫一個程序,程序需要完成特定的功能,就拿C語言中的加法函數來說吧。我們定義了一個加法函數,輸入兩個整數最後返回兩個整數的和,然後定義完函數以後,在main()函數里調用這個加法函數,就可以在鍵盤上輸入兩個整數,然後計算兩個整數的和了。

那麼問題來了   如果我要在別的程序需要使用加法函數所返回的值,應該怎麼做呢?

一種方式  定義一個全局變數,將加法函數返回的值賦給這個全局變數,那麼在一個工程文件下的程序都可以使用這個全局變數了,這就達到了其他程序使用這個變數的目的了

那麼問題又來了,如果不是在同一個工程目錄下的程序,要怎麼樣才能使用到這個加法函數的返回值呢?

一種方式  將第一個程序的加法返回值寫到一個文檔中,然後其他程序去讀這個文件,這樣也可以達到使用這個數據的目的了

上面的例子,想給大家傳遞的知識點就是  我們在寫程序的時候,大多數人是只有一個main()函數的,也就是只有一個可執行文件,那麼問題就來了,要是不同的main()函數之間需要相互使用對方的數據,那應該怎麼辦呢,這就引申出了程序與程序之間到交流問題,也就是通信問題。這也是ROS裡面我個人覺得必須首先要搞清楚的問題。大家先理解到這個地方,然後往下看。

開始進入主題  到底什麼是ROS,ROS就是Robot Operating System 的縮寫,這大家都知道,對吧,翻譯成中文也就是機器人操作系統,可是除了這個大家對操作系統是什麼大家有了解過么,為什麼需要操作系統,也就是操作系統能幹什麼,大家有簡單的了解過么

操作系統(先空白,後面再填坑)

在了解操作系統以後,我們就可以開始分析我們的機器人操作系統了,話不多說,先放狗,不不不,先放圖:

我們知道,操作系統本身也是一個軟體,但是他的特殊之處在於能夠完成對硬體的調配,而其他的應用軟體,比如網易雲,他如果想放歌,他需要打開播放器,是得需要操作系統去完成的,它本身沒有這個能力去直接打開播放器,而是對操作系統說,大哥,能不能幫我打開一下播放器,求求你了,哈哈。

我們也知道,在win上安裝了許許多多的軟體,向上面的solidworks(三維制圖軟體),matalab(數據計算軟體) QQ(聊天軟體)   網易雲 (聽歌軟體) 騰訊視頻(播放軟體)......

那麼問題又來了  你能讓你的扣扣去跟網易雲說  我想聽歌,然後網易雲就會打開播放么,當然你要是杠桿定理學得好,那我認了,哈哈,大多數人是應該是覺得這應該不可以,因為扣扣怎麼跟網易雲通信嘛,對吧。

所以我們安裝在win上的各個軟體只負責自己的問題,不會跟其他的軟體有過多的交流。

哈哈,所以我有了一個大膽的想法,讓我的電腦同時登錄3個扣扣,那麼這三個扣扣總該可以相互發消息了吧,沒錯,這就是我想要講的東西,我只在我的電腦上安裝三個軟體 也就是3個扣扣軟體,他們肯定是可以相互交流的。因為他們是同一類軟體。

是的,ROS也是這么乾的,在ROS上也安裝了向扣扣這樣的可執行程序,只不過在ROS中換了個說法,可執行程序叫做節點,這應該不拿理解吧。要記住在ROS上安裝了許許多多的軟體哦,也就是許許多多的可執行程序,也就是許許多多的節點,如果你現在理解了節點是什麼了,那麼恭喜你,已經邁出了一小步了,你說巧不巧,安裝在ROS上的這些程序,它還可以相互通信,也就是相互交流,哈哈。

好了,理解到這一步呢就理解了節點是個什麼東西了。

下面又開始了一個新的例子,我們的手機上有一個扣扣,我們需要和其他人聊天對吧,那麼你知道你要和別人聊天需要先做什麼么,你肯定說,登錄賬號加好友啊,不對的,首先要做的就是把騰訊的伺服器打開,不然你登錄不上去的,也就是說,騰訊的伺服器不打開,你是登錄不上扣扣的,只不過這一步不是我們操作的,人家的伺服器他已經給我門打開了,然後我們再登錄扣扣,想一下,我們在登錄的時候,做了什麼,對吧,大家都知道,我們也就是輸入賬號密碼就可以登錄了吧對吧,這個過程呢就是向騰訊的伺服器注冊自己的信息,告訴騰訊伺服器,我上線了,然後騰訊伺服器就把你加入到注冊表中,裡麵包含了你的一些信息,你想要和別人連天,那麼別人是不是也要跟你一樣,也要先登錄,過程和你的一樣,所以這個時候,騰訊伺服器那邊是已經有了你和你想要聊天的對象的一些信息的,比如ip地址之類的東西,這樣,你想發消息給你的朋友(後面再填坑)

類比一下 伺服器 就相當於ROS裡面的ros master

只不過這個rosmaster需要我們自己開啟而已。

事實上,ros並不是一個操作系統,他並不能直接運行在硬體之上,只不過他把硬體做了一個給操作系統的介面  和網易雲一樣   網易雲大不了就使用一個喇叭唄,只不過ros使用了太多的硬體,比如激光雷達,相機,編碼器,imu等等。

因此ROS本身也就是一個軟體,和qq一樣,運行在操作系統之上,所不同的是,在ROS上又可以安裝許許多多的同類軟體,這些安裝在ROS上的程序(節點)之間可以按照ROS所規定的通訊機制進行相互交流通訊。比如激光雷達節點(程序)通過ROS提供的介面,讓操作系統把激光數據傳上來,交給建圖所需要的Gmapping節點使用,然後Gmaping節點把所構建的地圖給move_base節點使用,move_base節點的輸入是一個速度和角度的命令,先由move_base下發給ros,然後ros下發給操作系統,然後操作系統調用硬體,在這里是電機,讓電機按照ROS下發的速度的角速度進行運動.

大家應該會有一點點理解了吧

總結下  就是ros是一個類似於win上的一個軟體,但是這個軟體上又安裝了很多軟體,在ros上安裝的這些軟體可以相互通信,然後可以藉助ROS,去調用操作系統去調用硬體。

這就是為什麼我們每次想要聊天的時候,需要先打開qq這個軟體,也就是我們想要用ROS的時候,先運行roscore這個命令打開ROS了吧

接下來是 

ros中的通訊方式

ros中的一些工具

ros中的一些已經有了的功能包(演算法)

慢慢寫,不著急

㈧ 機器人操作系統ROS--簡介(一)

網址: http://www.ros.org/

ROS (機器人操作系統,Robot Operating System),是專為機器人軟體開發所設計出來的一套電腦[操作系統]架構。它是一個開源的元級操作系統(後操作系統),提供類似於操作系統的服務,包括硬體抽象描述、底層驅動程序管理、共用功能的執行、程序間消息傳遞、程序發行包管理,它也提供一些工具和庫用於獲取、建立、編寫和執行多機融合的程序。
ROS究竟為何物?
2007年Morgan Quigley,Eric Berger和Andrew Ng發布了一紙有關STAIR的論文,講述了用Switchyard可以在各軟體程序之間傳遞信息,可以幫助機器人有效的完成一蘆兄些復雜的任務。這個項目是斯坦福大學和機器人技術公司Willow Garage的個人機器人項目Personal Robots Program合作進行的,2008年後完全由這家公司推廣,相關發布文件稱Switchyard可以讓機器人編譯模塊化,而且不需要重新設計框架,ROS操作系統也就隨之問世了,2012年ROS團隊成立了一個非盈利組織(OSRF),經過這幾年的發展ROS從最初的無人問津的小眾操作系統,到現在已是主流的機器人操作系統之一鉛嘩凱。

ROS的運行架構是一種使用ROS通信模塊實現模塊間P2P的松耦合的網路連接的處理架構,它執行若干種類型的通訊,包括基於服務的同步RPC(遠程過程調用)通訊、基於Topic的非同步數據流通訊,還有參數伺服器上的數據存儲。但是ROS本身並沒有實時性。
ROS的主要特點可以歸納為以下幾條槐喚:
(1)點對點設計

㈨ 如何設計一款基於ROS的移動機器人

最近幾年各種移動機器人開始涌現出來,不論是輪式的還是履帶式的,如何讓移動機器人移動都是最核心的工作。要讓機器人實現環境感知、機械臂控制、導航規劃等一系列功能,就需要操作系統的支持,而ROS就是最重要的軟體平台之一,它在科研領域已經有廣泛的應用。
不過有關ROS的書籍並不多,國內可供的學習社區就更少了。本期硬創公開課就帶大家了解一下如何利用ROS來設計移動機器人。

分享嘉賓李金榜:EAI科技創始人兼CEO,畢業於北京理工大學,碩士學位。 曾在網易、雪球、騰訊技術部有多年linux底層技術研發經驗。2015年聯合創立EAI科技,負責SLAM演算法研發及相關定位導航軟體產品開發。EAI科技,專注機器人移動,提供消費級高性能激光雷達、slam演算法和機器人移動平台。
移動機器人的三個部分
所謂的智能移動, 是指機器人能根據周圍的環境變化,自主地規劃路線、避障,到達目標地。
機器人是模擬人的各種行為,想像一下,人走動需要哪些器官的配合? 首先用眼睛觀察周圍環境,然後用腦去分析如何走才能到達目標地,接著用腿走過去, 周而復始,直到到達目標地址為至。機器人如果要實現智能移動,也需要眼、腦和腿這三部分的緊密配合。

「腿」是機器人移動的基礎。機器人的「腿」不局限於類人或類動物的腿,也可以是輪子、履帶等,能讓機器人移動起來的部件,都可以籠統地稱為「腿」。
類人的腿式優點是:既可以在復雜路況(比如爬樓梯)下移動、也可以更形象地模仿人的動作(比如跳舞),缺點是:結構和控制單元比較復雜、造價高、移動慢等。
所以大部分移動的機器人都是輪式機器人,其優勢在於輪子設計簡單、成本低、移動快。而輪式的也分為多種: 兩輪平衡車、三輪、四輪和多輪等等。目前最經濟實用的是兩個主動輪+一個萬向輪。
眼睛

機器人的眼睛其實就是一個感測器。它的作用是觀察周圍的環境,適合做機器人眼睛的有激光雷達、視覺(深度相機、單雙相機)、輔助(超聲波測距、紅外測距)等。
「腦」
機器人的大腦就負責接收「眼睛」傳輸的數據,實時計算出路線,指揮腿去移動。
其實就是要把看到的東西轉換為數據語言。針對如何描述數據,如何實現處理邏輯等一系列問題。 ROS系統給我們提供一個很好的開發框架。

ROS簡介
ROS是建立在linux之上的操作系統。它的前身是斯坦福人工智慧實驗室為了支持斯坦福智能機器人而建立項目,主要可以提供一些標准操作系統服務,例如硬體抽象,底層設備控制,常用功能實現,進程間消息以及數據包管理。
ROS是基於一種圖狀架構,從而不同節點的進程能接受、發布、聚合各種信息(例如感測,控制,狀態,規劃等等)。目前ROS主要支持Ubuntu操作系統。
有人問ROS能否裝到虛擬機里,一般來說是可以的,但是我們建議裝個雙系統,用Ubuntu專門跑ROS。

實際上,ROS可以分成兩層,低層是上面描述的操作系統層,高層則是廣大用戶群貢獻的實現不同功能的各種軟體包,例如定位繪圖,行動規劃,感知,模擬等等。ROS(低層)使用BSD許可證,所有是開源軟體,並能免費用於研究和商業用途,而高層的用戶提供的包則使用很多種不同的許可證。
用ROS實現機器人的移動
對於二維空間,使用線速度 + 角速度可以實現輪式機器的隨意移動。
線速度:描述機器人前後移動的速度大小
角速度:描述機器人轉動的角速度大小
所以控制機器人移動主要是要把線速度角速度轉換為左右輪的速度大小,然後,通過輪子直徑和輪間距,可以把線速度和角速度轉化為左輪和右輪的速度大小。
這里有一個關鍵問題就是編碼器的選擇和pid的調速。
編碼器的選擇:一般編碼器和輪子是在一個軸上,目前來說,速度在0.7m/s以下的話,編碼器選600鍵到1200鍵之間都ok。不過需要注意的是,編碼器最好用雙線的,A、B兩線輸出,A向和B向輸出相差90度,這樣可以防抖動。防抖動就是可以在之後里程計算時可以更准確。
左輪和右輪的速度大小的控制,通過輪子編碼器反饋,通過PID實時調整電機的PMW來實現。實時計算出小車的里程計(odom),得到小車移動位置的變化。
計算車的位置變化是通過編碼器來計算的,如果輪子打滑等情況,那麼計算的變化和實際的變化可能不同。要解決這個問題,其實是看那個問題更嚴重。要走5米只走了4.9米重要,還是要走180度只走了179度重要。
其實角度的不精確對小車的影響更大。一般來說,小車的直線距離精確度可以控制在厘米范圍內,在角度方面可以控制精準度在1%~2%。因為角度是比較重要的參數,所以很多人就用陀螺儀來進行矯正。
所以有時候大家問小車精度有多高?其實現在這樣已經精度比較高了,難免打滑等問題,不可能做到百分之百的精準。
小車在距離和角度方面做到現在這樣對於自建地圖導航已經是可以接受的,要提高更高的精度可能就要其他設備輔助,比如激光雷達來進行輔助,激光雷達可以進行二次檢測進行糾正。
激光雷達數據的存儲格式,它首先會有一個大小范圍,如果超出范圍是無效的。還有就是有幾個采樣點,這樣就可以激光雷達可以告訴你隔多少度有一個采樣點。

另外最後那個Intensities是告訴大家數據的准確率,因為激光雷達也是取最高點的數據,是有一定的准確率的。上面的ppt其實就是用激光雷達掃了一個牆的形狀。
激光雷達掃出一個靜態形狀其實沒有意義,雷達建圖的意義其實在於建立房間的地圖。
如何繪制地圖?
第一步是收集眼睛數據:
針對激光雷達,ROS在sensor_msgs 包中定義了專用了數據結構來存儲激光消息的相關信息,成為LaserScan。
它指定了激光的有效范圍、掃描點采樣的角度及每個角度的測量值。激光雷達360度實時掃描,能實時測出障礙物的距離、形狀和實時變化。
第二步就是把眼睛看到的數據轉化為地圖:

ROS的gmapping把激光雷達的/scan數據轉換為柵格map數據,其中黑色代表障礙物、白色代表空白區域,可以順利通行、灰色 :未知領域。隨著機器人的移動,激光雷達可以在多個不同方位觀測同一個位置是否有障礙物,如果存在障礙物的閾值超過設置值是,就標定此處是存在障礙物;否則標定不存在障礙物。 把障礙物、空白區域和未知領域的尺寸用不同灰度表示出來,就是柵格地圖。便於下一步定位和導航。
有時候會出現很直的牆,機器人卻無法直著行走,這時的問題可能就是機器人的輪子出現打滑等其他問題,而走歪了,這時繪制出的地圖也可能是歪的。這種情況可以通過加一個陀螺儀來避免這個情況。因為激光雷達的特性,有時候遇到黑色或鏡面會導致測距不準。
目前的解決方法就是不用激光雷達,或者用激光雷達和超聲波進行輔助處理。
ROS的地圖是分多層的,我可以在不同高度放多台激光雷達來一起疊加,共同繪制一張地圖。地圖繪制結束之後,就可以進行定位和導航等工作。
如何定位和導航?
定位:其實是概率性的定位,而不是100%的精度。根據激光雷達掃描周圍障礙物的形狀,與地圖的形狀做匹配,判斷機器人所在位置的概率
機器人的定位是否成功,與地圖特徵有很大關系,如果區域特徵明顯,那麼機器人就很容易判斷自己的位置。如果出現難以定位的問題,可能需要人給指定初始位置,或者加led來進行位置識別,或者其他的定位設備來協助定位。
目前的視覺通過色彩或者光的技術越來越多。
導航:全局路徑規劃+局部調整(動態避障)
導航其實就是全局定位,首先根據現有地圖進行規劃,但是在運行過程中會進行局部的路線規劃。但是總體還是根據全局路徑來走。
導航中工作量還很大,比如掃地機的路徑規劃和服務機器人的路徑規劃是不一樣的,掃地機器人可能要全覆蓋的有牆角的地圖,而服務機器人主要圍繞指定的路徑或者最短路徑來進行規劃,這部分是ROS工作量最大的一塊。
路徑規劃根據不同應用場景變化比較大,但是ROS提供基礎的路徑規劃的開發包,在這個基礎上我們會做自己的路徑規劃。
機器人描述和坐標系變換

在導航時,哪些區域可以通過,取決於機器人形狀等信息,ROS通過URDF(UnifiedRobot Description Format) 就是描述機器人硬體尺寸布局,比如輪子的位置、底盤大小、激光雷達安裝位置,這些都會影響到坐標系的轉換。
坐標系遵循的前提是每個幀只能有一個父幀,再往上進行一些眼神或者關聯。
激光雷達的安裝位置直接影響/scan輸出數據。所以激光雷達和機器人的相對位置是需要做坐標變換,才能把激光雷達的數據轉化為機器人視角的數據。
ROS的坐標系,最終歸結為三個標准框架,可以簡化許多常見的機器人問題:
1)全局准確,但局部不連續的幀(』map」)
2)全局不準確,但局部光滑框架(』odom」)
3)機器人自身框架(』base_link」)
多種感測器(像激光雷達、深度攝像頭和陀螺儀加速度計等)都可以計算base_link和odom的坐標關系,但由於「每個幀只能有一個父幀」,所以只能有一個節點(比如 robot_pose_ekf 融合多感測器)發布base_link和odom的坐標關系。
Base link自身的坐標系,因為不同元件裝在機器人上不同位置,都要對應到base link的坐標系中,因為所有的感測器都是要通過機器人的視角來「看」。
有些朋友問我,激光雷達在建地圖的時候,小車移動後地圖就亂了,這是因為小車的底盤坐標系和激光雷達的坐標系沒有標定準確。
map和odom之間的關聯
因為小車移動需要一個局部聯系,比如小車在向前走,不停的累加,這是里程計的作用,map起到全局的、不連續的作用,經過激光雷達和map對應。
如果要學習ROS的話,坐標系的變化是重要的點。坐標系的變換還有一個點,就是每個幀都只有一個父幀,有時候兩個坐標都和它有關聯的話,就是A和B關聯,B再和C關聯,而不是B/C都和A關聯。
三個坐標幀的父子關系如下:
map –> odom –> base_link
其實, map和odom都應該和base_link關聯,但為了遵守「每個幀只能有一個父幀」的原則,根據map和base_link 以及 odom->base_link的關系,計算出map與odom的坐標關系並發布。
odom->base_link的坐標關系是由里程計節點計算並發布的。
map -> base_link的坐標關系是由定位節點計算出來,但並不發布,而是利用接收odom->base_link的坐標關系,計算出map->odom的坐標關系,然後發布。
只有里程計的時候,沒有激光雷達,也可以跑,但是要先根據預設地圖進行簡單避障。
精彩問答
Q:還有ROS的實時性有什麼改進進展嗎 ?
A:實時改進要看ROS2.0的設計,其實ROS2.0的進展網上有公開。但是實際上他的進展離實際應用還有一定距離,至少今年下半年還達不到穩定,不過可以去研究下他的代碼,他對內存管理,線程管理,在實時性上有了很大改善。
Q:vSLAM對內存和CPU要求頗高。實際工程中,李老師使用的是什麼硬體配置?可以做多大的地圖呢?
A:確實如此,目前來說我們還是使用激光雷達和感測器輔助來進行,這個和地圖大小沒有太大關系,主要是與地形障礙物復雜程度有關。

㈩ ros2在不同樓層之間怎麼建圖導航

ROS2
ros2與windows入門攜做教程-融合建圖和導航

創客智造
原創
關注
0點贊·128人閱讀
系列文章目錄
ros2與windows入門教程-windows上安裝ROS2 foxy
ros2與windows入門教程-控制小烏龜
ros2與windows入門教程-監臘豎聽和發布話題
ros2與windows入門教程-編譯ROS2包
ros2與windows入門教程-ROS2 導航Navigation2
ros2與windows入門教程-修改域Domain_ID
ros2與windows入門教程-控制walking機器人移動
ros2與windows入門教程-創建工作空間和功能包
ros2與windows入門教程-使用rviz2
ros2與windows入門教程-slam_toolbox演算法建圖
ros2與windows入門教程-融合建圖和導航
說明:

介紹如何在windows下融合建圖和導航
步驟:

啟動底盤
ros2 launch walking_bringup robot.launch.py
登錄後復制
啟動導航,默認使用slam_toolbox演算法建圖
ros2 launch walking_navigation bringup_v1.launch.py use_slam:=true
登錄後復制
啟動windows 10

新打開一個cmd命令提示符窗口,執行以下命令

使用call命令設置環境

call C:\opt\ros\foxy\x64\local_setup.bat
call C:\test_ws\install\local_setup.bat
登錄後復制
設置域ID為2
set ROS_DOMAIN_ID=2
登錄後復制
啟動rviz2
ros2 launch test_tools rviz_view.launch.py
登錄後復制
啟動導航和rviz,效果圖
選擇單點導航模式

在點擊2D Goal Pose按鈕,指定一個機器人要到達的位置即選擇機器人要達到地圖上位置,選擇後即開始導航

大數據
ROS2
walking
誰說辦辯局衡公筆記本配置就不能高了?
精選推薦
廣告

閱讀全文

與ros機器人導航演算法相關的資料

熱點內容
我的世界國際服為什麼登不進伺服器 瀏覽:994
微盟程序員老婆 瀏覽:928
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:97
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:476
單片機液晶驅動 瀏覽:854
魔拆app里能拆到什麼 瀏覽:130
新預演算法的立法理念 瀏覽:144
wdcpphp的路徑 瀏覽:134
單片機p0口電阻 瀏覽:926
瀏覽器中調簡訊文件夾 瀏覽:594
五菱宏光空調壓縮機 瀏覽:68
為什麼app佔用幾百兆 瀏覽:680
自動解壓失敗叫我聯系客服 瀏覽:486
易語言新手源碼 瀏覽:458
oa伺服器必須有固定ip地址 瀏覽:46
傳奇源碼分析是什麼 瀏覽:271