作者:李慢慢
來源:微信公眾號【車路漫漫】
前言:一直都覺得ROS很神秘,到底是個操作系統(tǒng),僅憑稱呼就讓我望而卻步了。但ROS和自動駕駛仿真有著千絲萬縷的聯(lián)系,作為仿真軟件和智駕算法的數(shù)據(jù)橋梁,ROS是個繞不開的話題,所以還是得硬著頭皮啃一啃。然后用大白話講給你聽,最好再做兩個小栗子,那可真是功德無量了。
本文將帶領(lǐng)大家了解ROS的核心概念,為后續(xù)學(xué)習(xí)“使用ROS框架為自動駕駛仿真平臺集成被控算法”打好基礎(chǔ)。
1、ROS簡介
ROS(Robot Operating System)是一個適用于機器人的開源框架,這個框架把原本松散的零部件耦合在了一起,為它們提供了通信架構(gòu)。ROS雖然叫做操作系統(tǒng),但是它卻要安裝在如Linux這種操作系統(tǒng)上才能運行。它的作用只是連接真正的操作系統(tǒng)(如Linux)和使用者自己開發(fā)的ROS應(yīng)用程序(比如自動駕駛的感知、規(guī)劃、決策等模塊),所以它也算是個中間件,在基于ROS的應(yīng)用程序之間建立起了溝通的橋梁。
所以,簡單點說, ROS就是一個分布式的通信框架,幫助程序進程之間更方便地通信。
為了更形象的理解ROS的應(yīng)用,這里從別的平臺找到一個非常好的科普視頻,供大家學(xué)習(xí)。
2、ROS的核心概念
在正式學(xué)習(xí)ROS之前,先介紹ROS的幾個特性,即元操作系統(tǒng)、分布式通信機制、松耦合軟件框架、豐富的開源功能庫等,來幫大家建立一些感性的認識。
ROS是一個機器人領(lǐng)域的元操作系統(tǒng)。也就是說,它并不是真正意義上的操作系統(tǒng),其底層的任務(wù)調(diào)度、編譯、設(shè)備驅(qū)動等還是由它的原生操作系統(tǒng)Ubuntu/Linux完成。
ROS實際上是運行在Ubuntu/Linux上的亞操作系統(tǒng) ,或者說軟件框架,但提供硬件抽象、函數(shù)調(diào)用、進程管理這些類似操作系統(tǒng)的功能,也提供用于獲取、編譯、跨平臺的函數(shù)和工具。
ROS的核心思想就是將機器人的軟件功能做成一個個節(jié)點,節(jié)點之間通過互相發(fā)送消息進行溝通。這些節(jié)點可以部署在同一臺主機上,也可以部署在不同主機上,甚至還可以部署在互聯(lián)網(wǎng)上。ROS網(wǎng)絡(luò)通信機制中的主節(jié)點(master)負責(zé)對網(wǎng)絡(luò)中各個節(jié)點之間的通信過程進行管理調(diào)度,同時提供一個用于配置網(wǎng)絡(luò)中全局參數(shù)的服務(wù)。
ROS是松耦合軟件框架,利用分布式通信機制實現(xiàn)節(jié)點間的進程通信。ROS的軟件代碼以松耦合方式組織,開發(fā)過程靈活,管理維護方便。
3、從ROS1到ROS2
2007年,一家名為柳樹車庫(Willow Garage)的機器人公司發(fā)布了ROS,ROS集開源、免費、高復(fù)用、低耦合、工具豐富等等諸多優(yōu)勢于一身,一經(jīng)推出便迅速吸引了大量的開發(fā)者、科研人員、硬件供應(yīng)商的加入,形成了穩(wěn)定且多樣的機器人生態(tài),水到渠成的ROS也成為了機器人領(lǐng)域的主流軟件框架并流行至今。
自ROS誕生的十幾年來,不管是機器人相關(guān)軟件、硬件還是ROS社區(qū)都發(fā)生了天翻地覆的變化,加之原本的ROS存在一些設(shè)計上的先天性缺陷,在各種內(nèi)外因素疊加下,導(dǎo)致老ROS在許多應(yīng)用場景下都已經(jīng)顯得力不從心了。此背景下,官方于2017正式推出了新一代機器人操作系統(tǒng)——ROS2(區(qū)別于老ROS,即ROS1),ROS2基于全新的設(shè)計框架,保留了ROS1的優(yōu)點并改進其缺陷,以適應(yīng)新時代的新需求。
ROS2是全新一代機器人操作系統(tǒng),不只是功能增強的ROS1。
所以,我們還是直接就學(xué)習(xí)ROS2吧。
4、ROS的發(fā)行版本
ROS最初是基于Ubuntu系統(tǒng)開發(fā)的,ROS的發(fā)行版本名稱也和Ubuntu采用了同樣的規(guī)則,即版本名稱由兩個相同首字母的英文單詞組成,版本首字母按字母表遞增順序選取,以下列表為ROS2各不同發(fā)布版本的簡單說明。
發(fā)行版 | 發(fā)布日期 | 停止維護日期 |
---|---|---|
Iron Irwini | 2023 年 5 月 23 日 | 2024 年 11 月 |
Iron Irwini | 2023 年 5 月 23 日 | 2024 年 11 月 |
Humble Hawksbill | 2022 年 5 月 23 日 | 2027 年 5 月 |
Galactic Geochelone | 2021 年 5 月 23 日 | 2022 年 11 月 |
Foxy Fitzroy | 2020 年 6 月 5 日 | 2023 年 5 月 |
Eloquent Elusor | 2019 年 11 月 22 日 | 2020 年 11 月 |
Dashing Diademata | 2019 年 5 月 31 日 | 2021 年 5 月 |
Crystal Clemmys | 2018 年 12 月 14 日 | 2019 年 12 月 |
Bouncy Bolson | 2018 年 7 月 2 日 | 2019 年 7 月 |
Ardent Apalone | 2017 年 12 月 8 日 | 2018 年 12 月 |
5、ROS的學(xué)習(xí)方法
要想學(xué)好以及用好ROS,需要進行大量的實踐操作。因此在快速了解ROS的核心概念和編程范式后,就要結(jié)合大量的實際項目來深入理解ROS。ROS的學(xué)習(xí)資源主要有以下幾個:
官網(wǎng):www.ros.org
源碼:github.com
Wiki:wiki.ros.org
6、ROS系統(tǒng)架構(gòu)
由于ROS的架構(gòu)比較復(fù)雜,為了后面容易理解遇到的各種概念,這里先討論一下ROS的系統(tǒng)架構(gòu),好讓大家對ROS中的各種概念有全面性把控。按照官方的說法,可以分別從計算圖 、 文件系統(tǒng)和開源社區(qū)視角來理解ROS架構(gòu)。
6.1、從計算圖視角理解ROS架構(gòu)
ROS中可執(zhí)行程序的基本單位叫 節(jié)點 (node),節(jié)點之間通過消息機制進行通信,這樣就組成了一張網(wǎng)狀圖,也叫計算圖,如下圖所示。
節(jié)點是可執(zhí)行程序,通常也叫進程。
ROS功能包中創(chuàng)建的每個可執(zhí)行程序在被啟動加載到系統(tǒng)進程中后,就是一個ROS節(jié)點,如上圖中的節(jié)點1、節(jié)點2、節(jié)點3等。
節(jié)點之間通過收發(fā)消息進行通信,消息收發(fā)機制分為 話題 (topic)、 服務(wù) (service)和 動作 (action)三種,如圖1-3中的節(jié)點2與節(jié)點3、節(jié)點2與節(jié)點5采用話題通信,節(jié)點2與節(jié)點4采用服務(wù)通信,節(jié)點1與節(jié)點2采用動作通信。計算圖中的節(jié)點、話題、服務(wù)、動作都要有唯一名稱作為標識。
ROS利用節(jié)點將代碼和功能解耦,提高了系統(tǒng)的容錯性和可維護性。所以最好讓每個節(jié)點都具有特定的單一功能,而不是創(chuàng)建一個包羅萬象的龐大節(jié)點。如果用C++編寫節(jié)點,需要用到ROS提供的roscpp庫;如果用Python編寫節(jié)點,需要用到ROS提供的rospy庫。
主節(jié)點負責(zé)各個節(jié)點之間通信過程的調(diào)度管理。因此主節(jié)點必須要最先啟動,可以通過roscore命令啟動。
消息是構(gòu)成計算圖的關(guān)鍵,包括消息機制和消息類型兩部分:消息機制有話題、服務(wù)和動作三種,每種消息機制中傳遞的數(shù)據(jù)都具有特定的數(shù)據(jù)類型(即消息類型);消息類型可分為話題消息類型、服務(wù)消息類型和動作消息類型;
數(shù)據(jù)包 (rosbag)是ROS中專門用來保存和回放話題中數(shù)據(jù)的文件,可以將一些難以收集的傳感器數(shù)據(jù)用數(shù)據(jù)包錄制下來,然后反復(fù)回放來進行算法性能調(diào)試。
參數(shù)服務(wù)器能夠為整個ROS網(wǎng)絡(luò)中的節(jié)點提供便于修改的參數(shù)。參數(shù)可以認為是節(jié)點中可供外部修改的全局變量,有靜態(tài)參數(shù)和動態(tài)參數(shù)。靜態(tài)參數(shù)一般用于在節(jié)點啟動時設(shè)置節(jié)點工作模式;動態(tài)參數(shù)可以用于在節(jié)點運行時動態(tài)配置節(jié)點或改變節(jié)點工作狀態(tài),比如電機控制節(jié)點里的PID控制參數(shù)。
6.2、從文件系統(tǒng)視角理解ROS架構(gòu)
ROS程序的不同組件要放在不同的文件夾中,這些文件夾根據(jù)不同的功能對文件進行組織,這就是ROS的文件系統(tǒng)結(jié)構(gòu),如下圖所示。
工作空間是一個包含功能包、編譯包和編譯后可執(zhí)行文件的文件夾,用戶可以根據(jù)自己的需要創(chuàng)建多個工作空間,在每個工作空間中開發(fā)不同用途的功能包。在上圖中,我們創(chuàng)建了一個名為catkin_ws的工作空間,其中包含src、build和devel三個文件夾。
src文件夾 放置各個功能包和配置功能包的CMake配置文件CMakeLists.txt。這里說明一下,由于ROS中的源碼采用catkin工具進行編譯,而catkin工具又基于CMake技術(shù),所以我們在src源文件空間和各個功能包中都會見到一個CMake配置文件CMakeLists.txt,這個文件起到配置編譯的作用。
build文件夾 放置編譯CMake和catkin功能包時產(chǎn)生的緩存、配置、中間文件等。
devel文件夾 放置編譯好的可執(zhí)行程序,這些可執(zhí)行程序是不需要安裝就能直接運行的。一旦功能包源碼編譯和測試通過后,可以將這些編譯好的可執(zhí)行文件直接導(dǎo)出與其他開發(fā)人員分享。
功能包是ROS中軟件組織的基本形式,具有創(chuàng)建ROS程序的最小結(jié)構(gòu)和最少內(nèi)容,它包含ROS節(jié)點源碼、腳本、配置文件等。
CMakeLists.txt是功能包配置文件,用于編譯Cmake功能包編譯時的編譯配置。
package.xml是功能包清單文件,用xml的標簽格式標記該功能包的各類相關(guān)信息,比如包的名稱、開發(fā)者信息、依賴關(guān)系等,主要是為了使功能包的安裝和分發(fā)更容易。
include/
msg、srv和action這三個文件夾分別用于存放非標準話題消息、服務(wù)消息和動作消息的定義文件。ROS支持用戶自定義消息通信過程中使用的消息類型。這些自定義消息不是必要的,比如程序只使用標準消息類型。
scripts目錄存放Bash、Python等腳本文件,為非必要項。
launch目錄存放節(jié)點的啟動文件,*.launch文件用于啟動一個或多個節(jié)點,在含有多個節(jié)點的大型項目中很有用,為非必要項。
src目錄存放功能包節(jié)點所對應(yīng)的源代碼,一個功能包中可以有多個節(jié)點程序來完成不同的功能,每個節(jié)點程序都可以單獨運行。這里src目錄存放的是這些節(jié)點程序的源代碼,你可以按需創(chuàng)建文件夾和文件來組織源代碼,源代碼可以用C++、Python等編寫。
6.3、從開源社區(qū)視角理解ROS架構(gòu)
ROS是開源軟件,各個獨立的網(wǎng)絡(luò)社區(qū)分享和貢獻軟件及教程,形成了強大的ROS開源社區(qū),如下圖所示。
ROS的發(fā)展依賴于開源和共享的軟件,這些代碼由不同的機構(gòu)共享和發(fā)布,比如GitHub源碼共享、Ubuntu軟件倉庫發(fā)布、第三方庫等。ROS的官方wiki是重要的文檔討論社區(qū),在里面可以很方便地發(fā)布與修改相應(yīng)的文檔頁面。ROS的answer主頁里有大量ROS開發(fā)者的提問和回答,對ROS開發(fā)中遇到的各種問題的討論很活躍。
7、ROS的安裝及測試
7.1、更新軟件源
再開始安裝之前,強烈建議大家更新一下系統(tǒng)源(很多基礎(chǔ)環(huán)境包都將從這里下載并安裝)。我這里使用了阿里的源,更新方法如下:
首先需要備份一下原始的源列表文件
sudocp-rf/etc/apt/sources.list/etc/apt/sources.list.bak
然后開始編輯源列表文件:
sudo gedit /etc/apt/sources.list
將sources.list中原本的內(nèi)容都刪除,然后填入以下的內(nèi)容后保存:
debhttp://mirrors.aliyun.com/ubuntu/jammymainrestricteduniversemultiverse deb-srchttp://mirrors.aliyun.com/ubuntu/jammymainrestricteduniversemultiverse debhttp://mirrors.aliyun.com/ubuntu/jammy-securitymainrestricteduniversemultiverse deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-securitymainrestricteduniversemultiverse debhttp://mirrors.aliyun.com/ubuntu/jammy-updatesmainrestricteduniversemultiverse deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-updatesmainrestricteduniversemultiverse debhttp://mirrors.aliyun.com/ubuntu/jammy-proposedmainrestricteduniversemultiverse deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-proposedmainrestricteduniversemultiverse debhttp://mirrors.aliyun.com/ubuntu/jammy-backportsmainrestricteduniversemultiverse deb-srchttp://mirrors.aliyun.com/ubuntu/jammy-backportsmainrestricteduniversemultiverse
注意:雖然同為阿里源,但也有針對系統(tǒng)的不同源版本,我的Ubuntu系統(tǒng)是jammy版本,阿里源也應(yīng)該是這個版本。然后根據(jù)這個源更新自己系統(tǒng)里的軟件:
sudoapt-getupdate sudoapt-getupgrade
這個過程應(yīng)該要挺久,但運行完畢不應(yīng)該報錯才行,有任務(wù)錯誤請自行度娘。
然后就是根據(jù)官方的教程進行ROS2的安裝。官方的安裝教程鏈接如下:
https://docs.ros.org/en/humble/Installation.html
7.2、檢查操作系統(tǒng)語言環(huán)境
在ROS2官方的文檔中,安裝ROS2之前需要首先檢查操作系統(tǒng)語言環(huán)境。官方解釋:確保你有一個支持UTF - 8的語言環(huán)境。如果你處在一個極小的環(huán)境(例如一個Docker容器)中,那么這個語言環(huán)境可能和POSIX一樣是極小的。我們通過以下設(shè)定進行檢驗。
我們可以Ctrl+Alt+T調(diào)出終端,輸入locale檢查是否支持 UTF-8,若不支持,則需要繼續(xù)執(zhí)行下邊的指令進行設(shè)置:
locale#檢查是否支持UTF-8 sudoaptupdate&&sudoaptinstalllocales sudolocale-genen_USen_US.UTF-8 sudoupdate-localeLC_ALL=en_US.UTF-8LANG=en_US.UTF-8 exportLANG=en_US.UTF-8 locale#驗證設(shè)置是否正確
7.3、Ubuntu universe存儲庫設(shè)置與啟動
在設(shè)置ROS2軟件源之前,我們需要首先啟動Ubuntu universe存儲庫,啟動Ubuntu universe存儲庫我們可以通過打開終端通過命令行進行操作。
根據(jù)官方文檔,我們可以在命令行輸入下面的指令來進行Ubuntu universe存儲庫的啟動:
sudoaptinstallsoftware-properties-common sudoadd-apt-repositoryuniverse
7.4、設(shè)置ROS軟件源
通過下面的命令,首先將ROS 2 apt存儲庫更新添加到系統(tǒng),然后通過apt授權(quán)ROS 2的GPG密鑰:
sudoaptupdate&&sudoaptinstallcurl sudocurl-sSLhttps://raw.githubusercontent.com/ros/rosdistro/master/ros.key-o/usr/share/keyrings/ros-archive-keyring.gpg
然后通過以下指令,將存儲庫添加到我們的源列表中。
echo"deb[arch=$(dpkg--print-architecture)signed-by=/usr/share/keyrings/ros-archive-keyring.gpg]http://packages.ros.org/ros2/ubuntu$(./etc/os-release&&echo$UBUNTU_CODENAME)main"|sudotee/etc/apt/sources.list.d/ros2.list>/dev/null
7.5、安裝ROS2
設(shè)置完存儲庫后,首先通過下面的指令更新apt存儲庫緩存
sudoaptupdate
由于ROS 2建立在頻繁更新的Ubuntu系統(tǒng)上。所以官方建議在安裝新的軟件包之前確保您的系統(tǒng)是最新的。我們可以通過下面的指令更新升級已安裝的軟件
sudoaptupgrade
ROS安裝版本選擇及安裝指令:
ROS2桌面版安裝(官方推薦),包括:ROS、Rviz、官方demo、教程
sudoaptinstallros-humble-desktop
ROS2基礎(chǔ)版安裝(裸機),包括:通信庫、消息包、命令行工具等,但沒有GUI工具。
sudoaptinstallros-humble-ros-base
這里我們安裝桌面版ROS2 ,輸入以下的安裝指令即可:
sudoaptinstallros-humble-desktop
7.6、環(huán)境配置
官方文檔給出了環(huán)境配置的方法,在終端下執(zhí)行ROS2程序之前,要調(diào)用下面的命令進行環(huán)境配置,才可正確執(zhí)行程序
#Replace".bash"withyourshellifyou'renotusingbash #Possiblevaluesare:setup.bash,setup.sh,setup.zsh source/opt/ros/humble/setup.bash
對于官方的環(huán)境配置方法,由于每次打開新的終端,都需要進行環(huán)境的配置,這降低了開發(fā)和測試的效率,為了避免每次打開新的終端都進行環(huán)境配置這個問題,我們可以將配置環(huán)境指令通過下面的指令寫入 ”~/.bashrc“ 文件,那么每次新啟動終端時,就不需要在手動配置環(huán)境:
#將配置環(huán)境指令通過下面的指令寫入”~/.bashrc“文件 echo"source/opt/ros/humble/setup.bash">>~/.bashrc #查看”~/.bashrc“文件 sudogedit~/.bashrc
至此,我們完成了ROS2的安裝與環(huán)境配置,接下來我們進行ROS2的環(huán)境測試。
8、ROS操作系統(tǒng)的使用案例
8.1、案例1-talker和listener
我們需要以此打開兩個終端窗口,各輸入以下一條指令。
啟動第一個終端,通過以下命令啟動一個數(shù)據(jù)的發(fā)布者節(jié)點:
ros2rundemo_nodes_cpptalker
啟動第二個終端,通過以下命令啟動一個數(shù)據(jù)的訂閱者節(jié)點:
ros2rundemo_nodes_pylistener
如果“Hello World”字符串在兩個終端中正常傳輸,說明通信系統(tǒng)沒有問題。如下所示:
8.2、案例2-小烏龜
在我們安裝的ROS2桌面完整版中,內(nèi)置了一些案例,我們可以運行這些案例來測試ROS2的安裝與配置是否正常。在這里,我們選用ROS2經(jīng)典的小烏龜案例來進行演示,實操如下:
使用快捷鍵‘Ctrll+Alt+T’分別打開兩個終端,并分別輸入下面兩個命令:
#啟動第一個終端 #啟動烏龜GUI節(jié)點界面,烏龜可以在界面中運動 ros2runturtlesimturtlesim_node
#啟動第二個終端 #啟動鍵盤控制節(jié)點,可以通過鍵盤控制烏龜運動 ros2runturtlesimturtle_teleop_key
運行效果的界面如下:
9、結(jié)語
本文初步完成了ROS基本概念的學(xué)習(xí),并完成了安裝和簡單測試。后續(xù)將繼續(xù)基于ROS和Carla,完成自定義節(jié)點的設(shè)置,并集成其他平臺的開源自動駕駛算法,以搭建更為完善的自動駕駛仿真測試平臺,歡迎大家持續(xù)關(guān)注。
文章來源:車路漫漫
-
機器人
+關(guān)注
關(guān)注
211文章
28423瀏覽量
207147 -
Linux
+關(guān)注
關(guān)注
87文章
11304瀏覽量
209543 -
操作系統(tǒng)
+關(guān)注
關(guān)注
37文章
6827瀏覽量
123335 -
自動駕駛
+關(guān)注
關(guān)注
784文章
13816瀏覽量
166471 -
ROS
+關(guān)注
關(guān)注
1文章
278瀏覽量
17011
原文標題:9、結(jié)語
文章出處:【微信號:robotmagazine,微信公眾號:機器人技術(shù)與應(yīng)用】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論