1.?ROS?簡介
1.1?ROS?誕生背景
機器人是一種高度復雜的系統性實現,機器人設計包含了機械加工、機械結構設計、硬件設計、嵌入式軟件設計、上層軟件設計....是各種硬件與軟件集成,甚至可以說機器人系統是當今工業體系的集大成者。
機器人體系是相當龐大的,其復雜度之高,以至于沒有任何個人、組織甚至公司能夠獨立完成系統性的機器人研發工作。
一種更合適的策略是:讓機器人研發者專注于自己擅長的領域,其他模塊則直接復用相關領域更專業研發團隊的實現,當然自身的研究也可以被他人繼續復用。這種基于"復用"的分工協作,遵循了不重復發明輪子的原則,顯然是可以大大提高機器人的研發效率的,尤其是隨著機器人硬件越來越豐富,軟件庫越來越龐大,這種復用性和模塊化開發需求也愈發強烈。
在此大背景下,2007年,一家名為柳樹車庫(Willow Garage)的機器人公司發布了?ROS(機器人操作系統),ROS?是一套機器人通用軟件框架,可以提升功能模塊的復用性,并且隨著該系統的不斷迭代與完善,如今?ROS?已經成為機器人領域的事實標準。
1.2?ROS?相關概念
★? ROS?全稱為?Robot Operating System(機器人操作系統)。
★?ROS?是適用于機器人的開源元操作系統。
★?ROS?集成了大量的工具,庫,協議,提供類似?OS?所提供的功能,簡化了對機器人的控制。
★?ROS?提供了用于在多臺計算機上獲取,構建,編寫和運行代碼的工具和庫,ROS?在某些方面類似于“機器人框架”。
ROS?設計者將?ROS?表述為“ROS = Plumbing + Tools + Capabilities + Ecosystem”,即?ROS?是通訊機制、工具軟件包、機器人高層技能以及機器人生態系統的集合體。
1.3?ROS?設計目標
機器人開發的分工思想,實現了不同研發團隊間的共享和協作,提升了機器人的研發效率,為了服務“ 分工”,ROS?主要設計了如下目標:
? 代碼復用:ROS?的目標不是成為具有最多功能的框架,ROS?的主要目標是支持機器人技術研發中的代碼重用。
??分布式:ROS?是進程(也稱為Nodes)的分布式框架,ROS?中的進程可分布于不同主機,不同主機協同工作,從而分散計算壓力。
??松耦合:ROS?中功能模塊封裝于獨立的功能包或元功能包,便于分享,功能包內的模塊以節點為單位運行,以?ROS?標準的?IO?作為接口,開發者不需要關注模塊內部實現,只要了解接口規則就能實現復用,實現了模塊間點對點的松耦合連接。
??精簡:ROS?被設計為盡可能精簡,以便為?ROS?編寫的代碼可以與其他機器人軟件框架一起使用。ROS易于與其他機器人軟件框架集成:ROS?已與?OpenRAVE、Orocos?和?Player?集成。
??語言獨立性:包括Java,C++,Python等。為了支持更多應用開發和移植,ROS?設計為一種語言弱相關的框架結構,使用簡潔,中立的定義語言描述模塊間的消息接口,在編譯中再產生所使用語言的目標文件,為消息交互提供支持,同時允許消息接口的嵌套使用。
??易于測試:ROS?具有稱為?rostest?的內置單元/集成測試框架,可輕松安裝和拆卸測試工具。
??大型應用:ROS?適用于大型運行時系統和大型開發流程。
??豐富的組件化工具包:ROS?可采用組件化方式集成一些工具和軟件到系統中并作為一個組件直接使用,如RVIZ(3D可視化工具),開發者根據?ROS?定義的接口在其中顯示機器人模型等,組件還包括仿真環境和消息查看工具等。
??免費且開源:開發者眾多,功能包多。
1.4?ROS?發展歷程
ROS是一個由來已久、貢獻者眾多的大型軟件項目。在?ROS?誕生之前,很多學者認為,機器人研究需要一個開放式的協作框架,并且已經有不少類似的項目致力于實現這樣的框架。在這些工作中,斯坦福大學在2000年年中開展了一系列相關研究項目,如斯坦福人工智能機器人(STandford AI Robot, STAIR)項目、個人機器人(Personal Robots, PR)項目等,在上述項目中,在研究具有代表性、集成式人工智能系統的過程中,創立了用于室內場景的高靈活性、動態軟件系統,其可以用于機器人學研究。
2007年,柳樹車庫(Willow Garage)提供了大量資源,用于將斯坦福大學機器人項目中的軟件系統進行擴展與完善,同時,在無數研究人員的共同努力下,ROS?的核心思想和基本軟件包逐漸得到完善。
ROS?的發行版本(ROS distribution)指?ROS?軟件包的版本,其與Linux的發行版本(如Ubuntu)的概念類似。推出?ROS?發行版本的目的在于使開發人員可以使用相對穩定的代碼庫,直到其準備好將所有內容進行版本升級為止。因此,每個發行版本推出后,ROS?開發者通常僅對這一版本的?bug?進行修復,同時提供少量針對核心軟件包的改進。
版本特點: 按照英文字母順序命名,ROS?目前已經發布了?ROS1?的終極版本:noetic,并建議后期過渡至?ROS2?版本。noetic?版本之前默認使用的是?Python2,noetic?支持?Python3。
【建議版本】:?noetic?或?melodic?或?kinetic。
2.?ROS?安裝
我們使用的是?ROS?版本是?Noetic,因此可以在?Ubuntu20.04、Mac?或?Windows10?系統上安裝。雖然一般用戶平時使用的操作系統以?Windows?居多,但是?ROS?之前的版本基本都不支持?Windows,所以當前我們選用的操作系統是?Ubuntu,以方便向歷史版本過渡。
Ubuntu?安裝常用方式有兩種:
??方案1:實體機安裝?Ubuntu?(較為常用的是使用雙系統,Windows?與?Ubuntu?并存)。
??方案2:虛擬機安裝?Ubuntu。
兩種方式比較,各有優缺點:
??方案1:可以保證性能,且不需要考慮硬件兼容性問題,但是和?Windows?系統交互不便。
??方案2:可以方便的實現?Windows?與?Ubuntu?交互,不過性能稍差,且與硬件交互不便。
在?ROS?中,一些仿真操作是比較耗費系統資源的,且經常需要和一些硬件(雷達、攝像頭、imu、STM32、arduino....)交互,因此,原則上建議采用方案1,不過如果只是出于學習目的,那么方案2也基本夠用,且方案2在?Windows?與?Ubuntu?的交互上更為方便,對于學習者更為友好,因此本教程在此選用的是方案2。當然,具體采用哪種實現方案,請按需選擇。
如果采用虛擬機安裝?Ubuntu,再安裝?ROS?的話,大致流程如下:
1、安裝虛擬機軟件(比如:virtualbox?或?VMware);
2、使用虛擬機軟件虛擬一臺主機;
3、在虛擬主機上安裝?Ubuntu 20.04;
4、在?Ubuntu?上安裝?ROS;
5、測試?ROS?環境是否可以正常運行。
虛擬機軟件選擇上,對于我們學習而言?virtualbox?和?VMware?都可以滿足需求,二者比較,前者免費,后者收費。
2.1?安裝虛擬機軟件
安裝?VMware Workstation?需要先訪問官網,下載安裝包。
官網下載地址:官網下載。
下載后正常安裝。
2.2?虛擬一臺主機
使用?VMware?虛擬計算機的過程也不算復雜,只需要按照提示配置其相關參數即可。
打開?VMware?Workstation?,在主界面點擊【創建新的虛擬機】:
下一步:
選擇稍后安裝操作系統:
依次選擇?Linux,Ubuntu 64位:
設置虛擬機名稱、存放位置:
為虛擬機分配磁盤大小(上限),不是真實大小,用多少占多少:
硬件信息配置,設置內存(最低4G)、移除打印機:
最終信息如下:
創建完成:
2.3?安裝?Ubuntu
2.3.1?系統安裝
首先,下載?Ubuntu?的鏡像文件,阿里云官網鏡像下載鏈接。
然后,配置虛擬主機,關聯?Ubuntu?鏡像文件。
使用下載好的?ISO?鏡像文件:
最后,打開虛擬機,安裝系統,系統正常安裝就好。
『可能出現的問題一』
安裝界面顯示不全,無法進行正常安裝。
『解決步驟』
1、選擇語言,點擊試用系統;
2、右上角點擊設置,設置屏幕分辨率;
3、點擊桌面的安裝系統;
4、開始安裝。
【溫馨提示】?
root?初始密碼更改命令如下:
sudo passwd root
2.3.2?配置遠程連接
①?安裝?openssh-server?服務
sudo apt-get install openssh-server
②?安裝?ufw
sudo apt-get install ufw
③?使用?ufw?開啟22端口
sudo ufw enablesudo ufw allow 22
④?查看?ip?命令
sudo apt install net-toolsifconfig
⑤?使用?Xshell?測試連接
2.3.3?文件交互配置
使用?Xshell?來操作服務非常方便,傳文件也比較方便,就是使用rz,sz。
首先,服務器要安裝了rz,sz:
sudo apt install lrzsz
? 運行?sudo rz?,會將?Windows?的文件傳到?Linux?服務。
? 運行?sudo sz filename?,會將文件下載到?Windows本地。
2.4?安裝?ROS
Ubuntu?安裝完畢后,就可以安裝?ROS?操作系統了,大致步驟如下:
①?配置?Ubuntu?的軟件和更新;
②?設置安裝源;
③?設置?key;
④?安裝;
⑤?配置環境變量;
⑥?安裝構建依賴。
2.4.1?配置?Ubuntu?的軟件和更新
配置?Ubuntu?的軟件和更新,允許安裝不經認證的軟件。
首先打開“軟件和更新”對話框,具體可以在?Ubuntu?搜索按鈕中搜索。打開后按照下圖進行配置(確保勾選了"restricted", "universe," 和 "multiverse.")。
2.4.2?設置安裝源
配置國內南京大學的安裝源:(推薦)
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.nju.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
或:官方默認安裝源:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
或:來自國內清華的安裝源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
或:來自國內中科大的安裝源
sudo sh -c '. /etc/lsb-release && echo "deb http://mirrors.ustc.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list'
2.4.3?設置?key
sudo apt install curlcurl -s https://gitee.com/zhao-xuzuo/rosdistro/raw/master/ros.asc | sudo apt-key add -
下載密鑰文件:文件鏈接。
下載后,保存文件名為 “ros.asc”,傳入虛擬機。
在文件所在文件夾下打開終端,輸入:
sudo apt-key add ros.asc
2.4.4 安裝
首先,更新?apt(以前是 apt-get,官方建議使用 apt 而非 apt-get),apt?是用于從互聯網倉庫搜索、安裝、升級、卸載軟件或操作系統的工具。
sudo apt updatesudo apt upgrade
等待...
此處可能出現報錯。。。
然后,再安裝所需類型的?ROS。ROS?的多個類型:Desktop-Full、Desktop、ROS-Base。這里介紹較為常用的Desktop-Full(官方推薦)安裝:?ROS, rqt, rviz, robot-generic libraries, 2D/3D simulators, navigation and 2D/3D perception。
sudo apt install ros-noetic-desktop-full
等待......(比較耗時)
友情提示:?由于網絡原因,導致連接超時,可能會安裝失敗,可以多次重復調用 更新 和 安裝命令,直至成功。
2.4.5?配置環境變量
配置環境變量,方便在任意終端中使用?ROS。
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrcsource ~/.bashrc
2.4.6?安裝構建依賴
在?noetic?最初發布時,和其他歷史版本稍有差異的是:沒有安裝構建依賴這一步驟。隨著?noetic?不斷完善,官方補齊了這一操作。
首先,安裝構建依賴的相關工具:
sudo apt install python3-rosdep python3-rosinstall python3-rosinstall-generator python3-wstool build-essential
ROS?中使用許多工具前,要求需要初始化?rosdep?(可以安裝系統依賴) -- 上一步實現已經安裝過了。
sudo apt install python3-rosdep
初始化?rosdep:
sudo rosdep initrosdep update
如果一切順利的話,rosdep?初始化與更新的打印結果如下:
但是,在?rosdep?初始化時,多半會拋出異常。
出現問題:?Rosdep experienced an error: The read operation timed out?
解決方法:
wget -qO - https://raw.fastgit.org/my-rds-store/my_space/master/source/ros/shell/rosdep_repair.sh | bash
然后進行初始化:
然后更新,發現讀取源列表超時,這是網絡原因。
解決:
方法一:使用手機熱點進行更新。
方法二:XX,模式設置為【全局模式】。
? 然后進行更新,此刻就能更新成功。
2.5?測試?ROS
ROS?內置了一些小程序,可以通過運行這些小程序以檢測 ROS 環境是否可以正常運行
首先,啟動三個命令行(ctrl + alt + T)
???命令行【1】鍵入:?roscore?
??命令行【2】鍵入:?rosrun turtlesim turtlesim_node?,此時會彈出圖形化界面。
??命令行【3】鍵入:?rosrun turtlesim turtle_teleop_key?,在【3】中可以通過上下左右控制【2】中烏龜的運動。
??注意:光標必須聚焦在鍵盤控制窗口【3】,否則無法控制烏龜運動。
最終結果如下所示:
3.?ROS?快速體驗
編寫?ROS?程序,在控制臺輸出文本:?Hello World,分別使用?C++?和?Python?實現。
3.1?Hello World?實現簡介
ROS 中涉及的編程語言以 C++ 和 Python 為主,ROS 中的大多數程序兩者都可以實現,在本系列教程中,每一個案例也都會分別使用 C++ 和 Python 兩種方案演示,大家可以根據自身情況選擇合適的實現方案。
ROS 中的程序即便使用不同的編程語言,實現流程也大致類似,以當前 Hello World 程序為例,實現流程大致如下:
①?先創建一個工作空間;
②?再創建一個功能包;
③?編輯源文件;
④?編輯配置文件;
⑤?編譯并執行。
上述流程中,C++ 和 Python 只是在步驟3和步驟4的實現細節上存在差異,其他流程基本一致。本節先實現 C++ 和 Python 程序編寫的通用部分步驟1與步驟2,1.3.2節和1.3.3節再分別使用C++和Python編寫HelloWorld。
3.1.1?創建工作空間并初始化
mkdir -p 自定義空間名稱/srccd 自定義空間名稱catkin_make
上述命令,首先會創建一個工作空間以及一個?src?子目錄,然后再進入工作空間調用?catkin_make?命令編譯。
3.1.2?進入?src?創建?ros?包并添加依賴
cd srccatkin_create_pkg 自定義ROS包名 roscpp rospy std_msgs
上述命令,會在工作空間下生成一個功能包,該功能包依賴于?roscpp、rospy?與?std_msgs,其中?roscpp?是使用?C++?實現的庫,而?rospy?則是使用 Python?實現的庫,std_msgs?是標準消息庫,創建?ROS?功能包時,一般都會依賴這三個庫實現。
注意:?在?ROS?中,雖然實現同一功能時,C++?和?Python?可以互換,但是具體選擇哪種語言,需要視需求而定。兩種語言相較而言:?C++?運行效率高但是編碼效率低,而?Python?則反之。基于二者互補的特點,ROS?設計者分別設計了?roscpp?與?rospy?庫,前者旨在成為?ROS?的高性能庫,而后者則一般用于對性能無要求的場景,旨在提高開發效率。
3.2?HelloWorld(C++版)
我們已經創建了?ROS?的工作空間,并且創建了?ROS?的功能包,那么就可以進入核心步驟了,本節使用?C++?編寫程序實現?HelloWorld。
3.2.1?進入?ros?包的?src?目錄編輯源文件
cd 自定義的包
創建?xxx.cpp?文件,文件名自定義,使用?vim?打開文件進行編輯。
C++源代碼:
#include "ros/ros.h"int main(int argc, char *argv[]) {//執行 ros 節點初始化ros::init(argc,argv,"hello");//創建 ros 節點句柄(非必須)ros::NodeHandle n;//控制臺輸出 hello worldROS_INFO("hello world!");return 0; }
保存并退出。
3.2.2?編輯?ros?包下的?Cmakelist.txt?文件
add_executable(C++源文件名src/C++源文件名.cpp )target_link_libraries(C++源文件名${catkin_LIBRARIES} )
3.2.3?進入工作空間目錄并編譯
cd 自定義ros空間名稱catkin_make
生成?build devel ....
3.2.4?執行
終端1:先啟動?ROS?核心
roscore
終端2:再啟動節點
cd 工作空間source ./devel/setup.bashrosrun 包名 C++節點名
命令行輸出:?HelloWorld!
PS:
?source ~/工作空間/devel/setup.bash?可以添加進?.bashrc?文件,使用上更方便。
? 添加方式1:直接使用?gedit?或?vim?編輯?.bashrc??文件,最后添加該內容。
? 添加方式2:?echo?"source ~/工作空間/devel/setup.bash"?>> ~/.bashrc?
3.3?HelloWorld(Python版)
我們已經創建了?ROS?的工作空間,并且創建了?ROS?的功能包,那么就可以進入核心步驟了,本節使用?Python?編寫程序實現:
3.3.1?進入?ros?包添加?scripts?目錄并編輯?python?文件
cd ros包mkdir scriptscd scripts
新建?python?文件,文件名自定義。
Python文件源代碼:
#! /usr/bin/env python"""Python 版 HelloWorld """ import rospyif __name__ == "__main__":rospy.init_node("Hello")rospy.loginfo("Hello World!!!!")
3.3.2?為?python?文件添加可執行權限
chmod +x 自定義文件名.py
3.3.3?編輯?ros?包下的?CamkeList.txt?文件
catkin_install_python(PROGRAMS scripts/自定義文件名.pyDESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} )
3.3.4?進入工作空間目錄并編譯
cd 自定義空間名稱catkin_make
3.3.5?進入工作空間目錄并執行
終端1:先啟動?ROS?核心
roscore
終端2:再啟動節點
cd 工作空間source ./devel/setup.bashrosrun 包名 自定義文件名.py
輸出結果:Hello World!!!!