ROS機器人項目開發(fā)(第2版)_第1頁
ROS機器人項目開發(fā)(第2版)_第2頁
ROS機器人項目開發(fā)(第2版)_第3頁
ROS機器人項目開發(fā)(第2版)_第4頁
ROS機器人項目開發(fā)(第2版)_第5頁
已閱讀5頁,還剩328頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ROS機器人項目開發(fā)11例(第2版)目錄TOC\h\h第1章ROS入門\h1.1技術(shù)要求\h1.2ROS概述\h1.2.1ROS發(fā)行版\h1.2.2支持的操作系統(tǒng)\h1.2.3支持的機器人及傳感器\h1.2.4為什么選擇ROS\h1.3ROS基礎(chǔ)\h1.3.1文件系統(tǒng)層級\h1.3.2計算圖層級\h1.3.3ROS社區(qū)層級\h1.3.4ROS中的通信\h1.4ROS客戶端庫\h1.5ROS工具\h1.5.1ROS的可視化工具RViz\h1.5.2rqt_plot\h1.5.3rqt_graph\h1.6ROS模擬器\h1.7在Ubuntu18.04LTS上安裝ROSMelodic\h1.8在VirtualBox上設(shè)置ROS\h1.9Docker簡介\h1.9.1為什么選擇Docker\h1.9.2安裝Docker\h1.10設(shè)置ROS工作空間\h1.11ROS在工業(yè)界和學(xué)術(shù)界的機遇\h1.12本章小結(jié)\h第2章ROS-2及其特性簡介\h2.1技術(shù)要求\h2.2ROS-2概述\h2.2.1ROS-2發(fā)行版\h2.2.2支持的操作系統(tǒng)\h2.2.3支持的機器人及傳感器\h2.2.4為什么選擇ROS-2\h2.3ROS-2基礎(chǔ)\h2.3.1什么是DDS\h2.3.2DDS的實現(xiàn)\h2.3.3計算圖\h2.3.4ROS-2社區(qū)層級\h2.3.5ROS-2中的通信\h2.3.6ROS-2的變化\h2.4ROS-2客戶端庫\h2.5ROS-2工具\h2.5.1RViz2\h2.5.2Rqt\h2.6安裝ROS-2\h2.6.1開始安裝\h2.6.2獲取ROS-2源碼\h2.6.3ROS-1、ROS-2以及共存環(huán)境設(shè)置\h2.6.4運行測試節(jié)點\h2.7設(shè)置ROS-2工作空間\h2.8編寫ROS-2節(jié)點\h2.8.1ROS-1代碼示例\h2.8.2ROS-2代碼示例\h2.8.3ROS-1發(fā)布者節(jié)點與ROS-2發(fā)布者節(jié)點的區(qū)別\h2.9ROS-1和ROS-2的通信\h2.10本章小結(jié)\h第3章構(gòu)建工業(yè)級移動機械臂\h3.1技術(shù)要求\h3.2常見的移動機械臂\h3.3移動機械臂應(yīng)用場景\h3.4移動機械臂構(gòu)建入門\h3.4.1單位及坐標(biāo)系\h3.4.2Gazebo及ROS機器人模型格式設(shè)定\h3.5機器人底座構(gòu)建\h3.5.1機器人底座需求\h3.5.2軟件參數(shù)\h3.5.3機器人底座建模\h3.5.4機器人底座模擬\h3.5.5機器人底座測試\h3.6機械臂構(gòu)建\h3.6.1機械臂需求\h3.6.2軟件參數(shù)\h3.6.3機械臂建模\h3.6.4機械臂模擬\h3.6.5機械臂測試\h3.7系統(tǒng)集成\h3.7.1移動機械臂建模\h3.7.2移動機械臂模擬與測試\h3.8本章小結(jié)\h第4章基于狀態(tài)機的復(fù)雜機器人任務(wù)處理\h4.1技術(shù)要求\h4.2ROS動作機制簡介\h4.2.1服務(wù)器–客戶端結(jié)構(gòu)概述\h4.2.2actionlib示例:機械臂客戶端\h4.2.3基于actionlib的服務(wù)器–客戶端示例:電池模擬器\h4.3服務(wù)員機器人應(yīng)用示例\h4.4狀態(tài)機簡介\h4.5SMACH簡介\h4.6SMACH入門\h4.6.1SMACH-ROS的安裝與使用\h4.6.2簡單示例\h4.6.3餐廳機器人應(yīng)用示例\h4.7本章小結(jié)\h第5章構(gòu)建工業(yè)級應(yīng)用程序\h5.1技術(shù)要求\h5.2應(yīng)用案例:機器人送貨上門\h5.3機器人底座智能化\h5.3.1添加激光掃描傳感器\h5.3.2配置導(dǎo)航棧\h5.3.3環(huán)境地圖構(gòu)建\h5.3.4機器人底座定位\h5.4機械臂智能化\h5.4.1Moveit簡介\h5.4.2安裝與配置Moveit\h5.4.3通過Moveit控制機械臂\h5.5應(yīng)用程序模擬\h5.5.1環(huán)境地圖構(gòu)建與保存\h5.5.2選擇目標(biāo)點\h5.5.3添加目標(biāo)點\h5.5.4狀態(tài)機構(gòu)建\h5.6機器人改進(jìn)\h5.7本章小結(jié)\h第6章多機器人協(xié)同\h6.1技術(shù)要求\h6.2集群機器人基本概念\h6.3集群機器人分類\h6.4ROS中的多機器人通信\h6.4.1單個roscore和公共網(wǎng)絡(luò)\h6.4.2群組/名稱空間的使用\h6.4.3基于群組/名稱空間的多機器人系統(tǒng)構(gòu)建示例\h6.5多master概念簡介\h6.5.1multimaster_fkie功能包簡介\h6.5.2安裝multimaster_fkie功能包\h6.5.3設(shè)置multimaster_fkie功能包\h6.6多機器人應(yīng)用示例\h6.7本章小結(jié)\h第7章嵌入式平臺上的ROS應(yīng)用及其控制\h7.1技術(shù)要求\h7.2嵌入式板基礎(chǔ)知識\h7.2.1重要概念介紹\h7.2.2機器人領(lǐng)域微控制器和微處理器的區(qū)別\h7.2.3板卡選型步驟\h7.3微控制器板簡介\h7.3.1ArduinoMega\h7.3.2STM32\h7.3.3ESP8266\h7.3.4ROS支持的嵌入式板\h7.3.5對比表格\h7.4單板計算機簡介\h7.4.1CPU板\h7.4.2GPU板\h7.5Debian與Ubuntu\h7.6在TinkerboardS平臺上設(shè)置操作系統(tǒng)\h7.6.1基礎(chǔ)需求\h7.6.2安裝TinkerboardDebian操作系統(tǒng)\h7.6.3安裝Armbian和ROS\h7.6.4使用可用的ROS鏡像安裝\h7.7在BeagleBoneBlack平臺上設(shè)置ROS\h7.7.1基礎(chǔ)需求\h7.7.2安裝Debian操作系統(tǒng)\h7.7.3安裝Ubuntu和ROS\h7.8在RaspberryPi3/4平臺上設(shè)置ROS\h7.8.1基礎(chǔ)需求\h7.8.2安裝Raspbian和ROS\h7.8.3安裝Ubuntu和ROS\h7.9在JetsonNano平臺上設(shè)置ROS\h7.10通過ROS控制GPIO\h7.10.1TinkerboardS\h7.10.2BeagleBoneBlack\h7.10.3RaspberryPi3/4\h7.10.4JetsonNano\h7.11嵌入式板基準(zhǔn)測試\h7.12Alexa入門及連接ROS\h7.12.1Alexa技能構(gòu)建前提條件\h7.12.2創(chuàng)建Alexa技能\h7.13本章小結(jié)\h第8章強化學(xué)習(xí)與機器人學(xué)\h8.1技術(shù)要求\h8.2機器學(xué)習(xí)概述\h8.2.1監(jiān)督學(xué)習(xí)\h8.2.2無監(jiān)督學(xué)習(xí)\h8.2.3強化學(xué)習(xí)\h8.3理解強化學(xué)習(xí)\h8.3.1探索與開發(fā)\h8.3.2強化學(xué)習(xí)公式\h8.3.3強化學(xué)習(xí)平臺\h8.3.4機器人領(lǐng)域的強化學(xué)習(xí)應(yīng)用\h8.4馬爾可夫決策過程與貝爾曼方程\h8.5強化學(xué)習(xí)算法\h8.5.1出租車問題應(yīng)用示例\h8.5.2TD預(yù)測\h8.5.3TD控制\h8.6ROS中的強化學(xué)習(xí)功能包\h8.6.1gym-gazebo\h8.6.2gym-gazebo2\h8.7本章小結(jié)\h第9章ROS下基于TensorFlow的深度學(xué)習(xí)\h9.1技術(shù)要求\h9.2深度學(xué)習(xí)及其應(yīng)用簡介\h9.3機器人領(lǐng)域的深度學(xué)習(xí)\h9.4深度學(xué)習(xí)庫\h9.5TensorFlow入門\h9.5.1在Ubuntu18.04LTS上安裝TensorFlow\h9.5.2TensorFlow概念\h9.5.3在TensorFlow下編寫第一行代碼\h9.6ROS下基于TensorFlow的圖像識別\h9.6.1基礎(chǔ)需求\h9.6.2ROS圖像識別節(jié)點\h9.7scikit-learn簡介\h9.8SVM及其在機器人領(lǐng)域的應(yīng)用簡介\h9.9本章小結(jié)\h第10章ROS下的自動駕駛汽車構(gòu)建\h10.1技術(shù)要求\h10.2自動駕駛汽車入門\h10.3典型自動駕駛汽車基本組件\h10.3.1GPS、IMU和車輪編碼器\h10.3.2攝像頭\h10.3.3超聲波傳感器\h10.3.4LIDAR與RADAR\h10.3.5自動駕駛汽車的軟件模塊體系結(jié)構(gòu)\h10.4ROS下的自動駕駛汽車模擬與交互\h10.4.1VelodyneLIDAR模擬\h10.4.2ROS下的Velodyne傳感器接口\h10.4.3激光掃描儀模擬\h10.4.4模擬代碼擴展\h10.4.5ROS下的激光掃描儀接口\h10.4.6Gazebo下的立體與單目攝像頭模擬\h10.4.7ROS下的攝像頭接口\h10.4.8Gazebo下的GPS模擬\h10.4.9ROS下的GPS接口\h10.4.10Gazebo下的IMU模擬\h10.4.11ROS下的IMU接口\h10.4.12Gazebo下的超聲波傳感器模擬\h10.4.13低成本LIDAR傳感器\h10.5Gazebo下帶傳感器的自動駕駛汽車模擬\h10.6ROS下的DBW汽車接口\h10.6.1功能包安裝\h10.6.2自動駕駛汽車及傳感器數(shù)據(jù)可視化\h10.6.3基于ROS與DBW通信\h10.7Udacity開源自動駕駛汽車項目簡介\h10.7.1Udacity的開源自動駕駛汽車模擬器\h10.7.2MATLABADAS工具箱\h10.8本章小結(jié)\h第11章基于VR頭盔和LeapMotion的機器人遙操作\h11.1技術(shù)要求\h11.2VR頭盔和LeapMotion傳感器入門\h11.3項目設(shè)計和實施\h11.4在Ubuntu14.04.5上安裝LeapMotionSDK\h11.4.1可視化LeapMotion控制器數(shù)據(jù)\h11.4.2使用LeapMotion可視化工具\h11.4.3安裝用于LeapMotion控制器的ROS驅(qū)動程序\h11.5RViz中LeapMotion數(shù)據(jù)的可視化\h11.6使用LeapMotion控制器創(chuàng)建遙操作節(jié)點\h11.7構(gòu)建ROS-VRAndroid應(yīng)用程序\h11.8ROS-VR應(yīng)用程序的使用及與Gazebo的交互\h11.9VR下的TurtleBot模擬\h11.9.1安裝TurtleBot模擬器\h11.9.2在VR中控制TurtleBot\h11.10ROS-VR應(yīng)用程序故障排除\h11.11ROS-VR應(yīng)用與LeapMotion遙操作功能集成\h11.12本章小結(jié)\h第12章基于ROS、OpenCV和Dynamixel伺服系統(tǒng)的人臉識別與跟蹤\h12.1技術(shù)要求\h12.2項目概述\h12.3硬件和軟件基礎(chǔ)需求\h12.4使用RoboPlus配置Dynamixel伺服系統(tǒng)\h12.5Dynamixel與ROS連接\h12.6創(chuàng)建人臉跟蹤器ROS功能包\h12.7使用人臉跟蹤ROS功能包\h12.7.1理解人臉跟蹤器代碼\h12.7.2理解CMakeLists.txt\h12.7.3track.yaml文件\h12.7.4啟動文件\h12.7.5運行人臉跟蹤器節(jié)點\h12.7.6face_tracker_control功能包\h12.7.7平移控制器配置文件\h12.7.8伺服系統(tǒng)參數(shù)配置文件\h12.7.9人臉跟蹤控制器節(jié)點\h12.7.10創(chuàng)建CMakeLists.txt\h12.7.11測試人臉跟蹤器控制功能包\h12.7.12節(jié)點集成\h12.7.13固定支架并設(shè)置電路\h12.7.14最終運行\(zhòng)h12.8本章小結(jié)第1章ROS入門機器人技術(shù)是未來能夠改變世界的技術(shù)之一。機器人可以在很多方面替代人,我們都害怕它們偷走我們的工作。有一點是肯定的:機器人技術(shù)將是未來最具影響力的技術(shù)之一。當(dāng)一項新技術(shù)獲得發(fā)展動力時,該領(lǐng)域的各種機會也會增加。這意味著機器人和自動化技術(shù)可以在未來創(chuàng)造很多就業(yè)機會。機器人技術(shù)中能提供大量工作機會的主要領(lǐng)域之一是機器人軟件開發(fā)。眾所周知,軟件賦予機器人或任何機器生命。我們可以通過軟件擴展機器人的能力。對于一個機器人而言,它的控制、傳感和智能等能力都是通過軟件實現(xiàn)的。機器人軟件涉及相關(guān)技術(shù)的融合,如計算機視覺、人工智能和控制理論。簡而言之,為機器人開發(fā)軟件并不是一項簡單的任務(wù),需要開發(fā)人員具有許多領(lǐng)域的專業(yè)知識。如果讀者正在尋找iOS或Android的移動應(yīng)用程序開發(fā)支持,則可以選擇基于相應(yīng)的軟件開發(fā)工具包(SoftwareDevelopmentKit,SDK)構(gòu)建應(yīng)用程序。那么對于機器人應(yīng)用程序開發(fā)有沒有可供使用的通用軟件框架呢?回答是肯定的。最流行的機器人軟件框架之一就是機器人操作系統(tǒng)(RobotOperatingSystem,ROS)。在本章中,我們將了解ROS的抽象概念,學(xué)習(xí)ROS的安裝方法,概要介紹模擬器的相關(guān)內(nèi)容,并描述如何在虛擬系統(tǒng)上進(jìn)行使用。然后我們將介紹ROS的基本概念,以及支持ROS的不同機器人、傳感器和執(zhí)行器。我們還將介紹ROS在工業(yè)界和學(xué)術(shù)界的應(yīng)用情況。由于整本書都致力于ROS項目,因此本章將是這些項目的啟動指南,在本章中,我們將幫助讀者完成ROS的安裝與配置。本章涵蓋的主題包括:·ROS概述?!OS基礎(chǔ)。·ROS客戶端庫?!OS工具。·ROS模擬器?!ぐ惭bROS。·在VirtualBox上設(shè)置ROS?!ocker簡介。·設(shè)置ROS工作空間?!すI(yè)界與學(xué)術(shù)界中的ROS應(yīng)用。下面,一起來入門ROS吧。1.1技術(shù)要求學(xué)習(xí)本章內(nèi)容的相關(guān)要求如下:·Ubuntu18.04(Bionic)系統(tǒng),預(yù)先安裝ROSMelodicMorenia?!ぬ摂M機VirtualBox和Docker?!r間線及測試平臺:■預(yù)計學(xué)習(xí)時間:平均約65分鐘?!鲰椖繕?gòu)建時間(包括編譯和運行):平均約60分鐘?!鲰椖繙y試平臺:惠普Pavilion筆記本電腦(Intel?CoreTMi7-4510UCPU@2.00GHz×4,8GB內(nèi)存,64位操作系統(tǒng),GNOME-3.28.2桌面環(huán)境)。1.2ROS概述ROS是一個開源的、靈活的機器人軟件框架,用于機器人應(yīng)用程序編寫。ROS提供了一個硬件抽象層,開發(fā)者可以在其中構(gòu)建機器人應(yīng)用程序,而不必?fù)?dān)心底層硬件。ROS還提供不同的軟件工具來可視化和調(diào)試機器人數(shù)據(jù)。ROS框架的一個核心是消息傳遞中間件,在這個中間件中,進(jìn)程可以相互通信和交換數(shù)據(jù),即使它們運行在不同的機器上。ROS消息傳遞可以是同步的,也可以是異步的。ROS中的軟件以功能包的形式組織,具有良好的模塊性和可重用性。使用ROS消息傳遞中間件和硬件抽象層,開發(fā)人員可以創(chuàng)建大量的機器人功能,例如,地圖構(gòu)建和導(dǎo)航(在移動機器人中)。ROS中的幾乎所有功能對機器人而言都是“不可知”的(即基于標(biāo)準(zhǔn)接口封裝起來的),因此所有類型的機器人都可以使用它。新的機器人可以直接使用那些功能包,而無須修改功能包中的任何代碼。ROS在大學(xué)里有著廣泛的合作關(guān)系,許多開發(fā)人員對ROS的發(fā)展做出了貢獻(xiàn)??梢哉fROS是一個由全世界開發(fā)者支持的社區(qū)驅(qū)動項目。這個活躍的開發(fā)者生態(tài)系統(tǒng)將ROS與其他機器人框架區(qū)分開來。簡而言之,ROS是管道(或通信,即通信機制)、(開發(fā))工具、(應(yīng)用)功能和生態(tài)系統(tǒng)的組合,這些功能如圖1.1所示。ROS項目于2007年在斯坦福大學(xué)以Switchyard為名啟動,隨后在2008年由一家名為WillowGarage的機器人研究初創(chuàng)公司進(jìn)行開發(fā)。ROS的主要開發(fā)工作由WillowGarage完成。2013年,WillowGarage的研究人員成立了開源機器人基金會(OpenSourceRoboticsFoundation,OSRF)。ROS現(xiàn)在由OSRF積極維護(hù)。下面,讓我們介紹幾個ROS發(fā)行版。圖1.1ROS“公式”(圖片來源:。基于知識共享授權(quán)協(xié)議CC-BY-3.0:\h/licenses/by/3.0/us/legalcode)下面是兩個組織的網(wǎng)址。WillowGarage:\h/。OSRF:\h/。1.2.1ROS發(fā)行版ROS發(fā)行版與Linux發(fā)行版非常相似,即由ROS功能包構(gòu)建成的版本集。每個發(fā)行版都維護(hù)一組穩(wěn)定的核心功能包,直到發(fā)行版的生命周期結(jié)束(EndOfLife,EOL)。ROS發(fā)行版與Ubuntu完全兼容,大多數(shù)ROS發(fā)行版都是根據(jù)各自的Ubuntu版本進(jìn)行規(guī)劃的。圖1.2展示了ROS網(wǎng)站上推薦使用的一些最新的ROS發(fā)行版(截至本書英文版撰寫時)。圖1.2最新ROS發(fā)行版(圖片來源:?;谥R共享授權(quán)協(xié)議CC-BY-3.0:\h/licenses/by/3.0/us/legalcode)最新的ROS發(fā)行版是MelodicMorenia,對此版本的支持時間將延續(xù)到2023年5月。這個最新的ROS發(fā)行版的一個問題是,目前大多數(shù)功能包都不可用,這是因為把功能包從以前的發(fā)行版遷移到該版本需要時間。如果讀者正在尋找一個穩(wěn)定的發(fā)行版,那么可以選擇ROSKineticKame,該版本發(fā)行于2016年,大部分功能包都可以正常使用。不建議讀者選擇ROSLunarLoggerhead,因為該發(fā)行版的支持時間僅延續(xù)至2019年5月。1.2.2支持的操作系統(tǒng)ROS的主要目標(biāo)操作系統(tǒng)是Ubuntu。ROS發(fā)行版是根據(jù)Ubuntu的發(fā)布版進(jìn)行規(guī)劃的。目前,除了Ubuntu以外,UbuntuARM、Debian、Gentoo、macOS、ArchLinux、Android、Windows和OpenEmbedded也提供了對ROS不完全支持(部分功能不可用)。表1.1展示了新的ROS發(fā)行版和支持的特定操作系統(tǒng)版本。表1.1ROS發(fā)行版及支持的操作系統(tǒng)版本ROSMelodic和Kinetic均為長期支持版(Long-TermSupport,LTS),支持時間與Ubuntu的長期支持版的支持時間一致。使用LTS發(fā)行版的優(yōu)點是可以獲得最長的支持壽命。在下一節(jié)中,我們將介紹ROS支持的機器人和傳感器。1.2.3支持的機器人及傳感器ROS框架是最成功的機器人技術(shù)框架之一,世界各地的大學(xué)都對其做出了貢獻(xiàn)。由于其活躍的生態(tài)系統(tǒng)和開源性質(zhì),ROS廣泛應(yīng)用于大多數(shù)機器人,并且兼容主要的機器人硬件和軟件。圖1.3展示了一些完全在ROS上運行的著名機器人。圖1.3ROS支持的主流機器人型號(圖片來源:?;谥R共享授權(quán)協(xié)議CC-BY-3.0:\h/licenses/by/3.0/us/legalcode)ROS支持的機器人型號詳見\h/Robots。讀者可以從以下鏈接獲取相應(yīng)機器人的ROS功能包:·Pepper:\h/Robots/Pepper。·REEM-C:\h/Robots/REEM-C?!urtleBot2:\h/Robots/TurtleBot?!obonaut:\h/Robots/Robonaut2?!niversal機械臂:\h/universal_robot。圖1.4展示了ROS支持的一些主流傳感器。圖1.4ROS支持的主流傳感器(圖片來源:?;谥R共享授權(quán)協(xié)議CC-BY-3.0:\h/licenses/by/3.0/us/legalcode)ROS支持的傳感器類型與型號詳見\h/Sensors。以下是相應(yīng)傳感器的ROSwiki主頁:·Velodyne:\h/velodyne?!EDCamera:\h/zed-ros-wrapper?!eraranger:\h/teraranger。·Xsens:\h/xsens_driver?!okuyo激光測距儀:\h/hokuyo_node?!ntelRealSense:\h/realsense_camera。下面,我們介紹ROS有哪些優(yōu)勢和特點。1.2.4為什么選擇ROS構(gòu)建ROS框架的主要目的是打造機器人的通用軟件框架。盡管在ROS之前就有了許多機器人學(xué)的相關(guān)研究,但大多數(shù)軟件都是各自的機器人獨有的。這些獨有的軟件可能是開源的,但很難重用。與現(xiàn)有的其他機器人框架相比,ROS在以下方面表現(xiàn)出色:·協(xié)作開發(fā):正如我們討論過的,ROS是開源的,可以免費用于工業(yè)界和學(xué)術(shù)界。開發(fā)人員可以通過添加功能包的方式擴展ROS的功能。幾乎所有的ROS功能包都在一個硬件抽象層上工作,因此它可以很容易地被其他機器人應(yīng)用程序重用。所以,如果一所大學(xué)擅長移動導(dǎo)航,另一所大學(xué)擅長機器人操控,則可以把相應(yīng)的功能包貢獻(xiàn)給ROS社區(qū),這樣其他開發(fā)人員就可以重用這些功能包并構(gòu)建新的應(yīng)用程序。·多語言支持:ROS通信框架可以使用多種現(xiàn)代編程語言輕松實現(xiàn)。它支持的流行語言包括C++、Python和Lisp,此外它還有Java和Lua的實驗庫?!旒桑篟OS具有與許多第三方機器人庫的接口,如開源計算機視覺(OpenCV)、點云庫(PCL)、OpenNI、OpenRAVE和Orocos。開發(fā)人員可以輕松地使用這些庫進(jìn)行應(yīng)用程序開發(fā)。·模擬器集成:ROS還與開源模擬器(如Gazebo)聯(lián)系緊密、相互融合,并與專有模擬器(如Webots和V-REP)有良好的接口?!ごa測試:ROS提供了一個名為rostest的內(nèi)置測試框架來檢查代碼質(zhì)量和錯誤?!た缮炜s性:ROS框架設(shè)計考慮了可伸縮性??梢允褂肦OS與機器人一起執(zhí)行繁重的計算任務(wù),其中ROS可以放在云上,也可以放在異構(gòu)集群上?!た啥ㄖ菩裕赫缥覀冇懻撨^的,ROS是完全開源和免費的,因此可以根據(jù)機器人的實際需求定制這個框架。如果我們只想使用ROS消息平臺,那么可以刪除所有其他組件并僅使用它。我們甚至可以為特定的機器人定制ROS以獲得更好的性能?!ど鐓^(qū):ROS是一個社區(qū)驅(qū)動的項目,主要由OSRF領(lǐng)導(dǎo)。大型社區(qū)支持是ROS的一大優(yōu)勢,這意味著我們可以輕松地開始機器人應(yīng)用程序開發(fā)。以下是可與ROS集成的庫和模擬器的URL:·OpenCV:\h/vision_opencv?!CL:\h/pcl_ros。·OpenNI:\h/openni_launch?!penRAVE:\h/?!rocos:\h/?!-REP:\h/。下面讓我們了解ROS的一些基本概念,這些概念是ROS項目的基礎(chǔ)。1.3ROS基礎(chǔ)了解ROS的基本工作流程及其術(shù)語,可以幫助讀者理解已有的ROS應(yīng)用程序,并在此基礎(chǔ)上構(gòu)建自己的應(yīng)用程序。這一節(jié)將向讀者介紹重要的概念,這些概念在接下來的章節(jié)中將會使用到。如果讀者發(fā)現(xiàn)本章中缺少某個主題,請放心,稍后將在相應(yīng)的章節(jié)中進(jìn)行介紹。ROS有三個不同層級的概念,分別是文件系統(tǒng)層級、計算圖層級和ROS社區(qū)層級。1.3.1文件系統(tǒng)層級文件系統(tǒng)層級解釋了ROS文件在硬盤上的組織方式,如圖1.5所示。圖1.5ROS文件系統(tǒng)層級從圖1.5中可以看到,ROS中的文件系統(tǒng)主要可以分類為元包、功能包、功能包清單、消息、服務(wù)、代碼和其他文件。以下是對每個組件的簡單描述:·元包:元包將特定應(yīng)用程序的包列表分組。例如,在ROS中,有一個名為navigation(導(dǎo)航)的元包,用于移動機器人導(dǎo)航。它可以保存相關(guān)功能包的信息,并在自己的安裝過程中幫助安裝這些相關(guān)功能包。·功能包:ROS中的軟件主要被組織為ROS功能包??梢哉fROS功能包是ROS的原子構(gòu)建單元。功能包可以由ROS節(jié)點/進(jìn)程、數(shù)據(jù)集和配置文件組成,所有這些內(nèi)容都被組織在一個模塊中?!すδ馨鍐危好總€功能包中都有一個名為package.xml的清單文件。此文件包含功能包的名稱、版本、作者、許可證和依賴項等信息。元包的package.xml文件由相關(guān)功能包的名稱組成。·消息:ROS通過發(fā)送ROS消息進(jìn)行通信。消息數(shù)據(jù)的類型可以在擴展名為.msg的文件中定義。這些文件稱為消息文件。在這里,我們將遵循一個約定,即將消息文件放在our_package/msg/message_files.msg下?!し?wù):計算圖層級概念之一是服務(wù)。與ROS消息類似,我們約定將服務(wù)定義放在our_package/srv/service_files.srv下。1.3.2計算圖層級ROS計算圖是一個基于點對點的網(wǎng)絡(luò),它將所有信息一起處理。ROS圖的概念包括節(jié)點、話題、消息、節(jié)點管理器、參數(shù)服務(wù)器、服務(wù)和數(shù)據(jù)包,具體如圖1.6所示。圖1.6ROS計算圖層級圖1.6展示了ROS計算圖中的各種概念。以下是對每個概念的簡單描述:·節(jié)點:ROS節(jié)點是使用ROSAPI相互通信的處理過程(即功能模塊)。機器人可能有許多節(jié)點來執(zhí)行計算。例如,自主移動機器人可以具有用于硬件接口、讀取激光掃描以及定位和地圖構(gòu)建的節(jié)點。我們可以使用roscpp和rospy等ROS客戶端庫創(chuàng)建ROS節(jié)點,我們將在1.4節(jié)中討論這些?!す?jié)點管理器:ROS節(jié)點管理器(后簡稱master)作為中間節(jié)點工作,幫助在不同的ROS節(jié)點之間建立連接。master擁有在ROS環(huán)境中運行的所有節(jié)點的所有細(xì)節(jié)。它可以在節(jié)點之間交換各類信息,以便在節(jié)點之間建立連接。交換相應(yīng)信息后,兩個ROS節(jié)點之間即可開始通信?!?shù)服務(wù)器:參數(shù)服務(wù)器在ROS中具有重要作用。節(jié)點可以在參數(shù)服務(wù)器中存儲變量并設(shè)置其隱私權(quán)限。如果參數(shù)具有全局作用域,則其他所有節(jié)點都可以訪問它。ROS參數(shù)服務(wù)器與master一起運行?!はⅲ篟OS節(jié)點可以通過多種方式相互通信。在各種通信方式中,節(jié)點均以ROS消息的形式發(fā)送和接收數(shù)據(jù)。ROS消息是ROS節(jié)點用來交換數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)?!ぴ掝}:在兩個ROS節(jié)點之間通信和交換ROS消息的方法之一稱為ROS話題。話題是使用ROS消息交換數(shù)據(jù)的命名總線。每個話題都有一個特定的名稱,一個節(jié)點將數(shù)據(jù)發(fā)布到一個話題,另一個節(jié)點可以通過訂閱該話題來讀取數(shù)據(jù)?!し?wù):服務(wù)是另一種通信方法,其功能類似于話題。話題使用發(fā)布或訂閱交互,而服務(wù)使用請求或回復(fù)方法。一個節(jié)點將充當(dāng)服務(wù)提供者,在其中運行服務(wù)例程,而客戶端節(jié)點從服務(wù)器請求服務(wù)。服務(wù)器將執(zhí)行服務(wù)例程并將結(jié)果發(fā)送給客戶端??蛻舳斯?jié)點將會等待服務(wù)器響應(yīng)并提供結(jié)果?!?shù)據(jù)包:數(shù)據(jù)包是ROS提供的一個有效工具,用于記錄和回放ROS話題。當(dāng)開展機器人相關(guān)研究時,可能有些情況下我們需要在沒有實際硬件的情況下工作。使用rosbag,我們可以記錄傳感器數(shù)據(jù),并將數(shù)據(jù)包文件復(fù)制到其他計算機上,通過回放來檢查數(shù)據(jù)以及應(yīng)用程序的執(zhí)行結(jié)果。1.3.3ROS社區(qū)層級自誕生至今,ROS社區(qū)正以更為迅猛的速度發(fā)展。讀者可以找到2000多個由社區(qū)積極支持、修改和使用的功能包。社區(qū)層級包括用于共享軟件和知識的ROS資源,如圖1.7所示。以下是圖1.7的每個部分的簡要說明:圖1.7ROS社區(qū)層級·發(fā)行版:ROS發(fā)行版是ROS功能包的版本化集合,類似于Linux發(fā)行版?!べY源倉庫:與ROS相關(guān)的功能包和文件依賴于版本控制系統(tǒng)(VersionControlSystem,VCS),如Git、SVN和Mercurial,世界各地的開發(fā)人員可以通過這個系統(tǒng)為功能包做出貢獻(xiàn)?!OSWiki:ROS社區(qū)Wiki是ROS的知識中心,任何人都可以在其中創(chuàng)建其功能包的文檔。讀者可以在ROSWiki上找到關(guān)于ROS的標(biāo)準(zhǔn)文檔和教程?!む]件列表:訂閱ROS郵件列表可以讓用戶獲得關(guān)于ROS功能包的最新更新,同時用戶還可以通過郵件列表詢問關(guān)于ROS的問題,網(wǎng)址為\h/Mailing%20Lists?action=show?!OSAnswers:ROSAnswers網(wǎng)站是ROS的stackoverflow。用戶可以詢問有關(guān)ROS和相關(guān)領(lǐng)域的問題,網(wǎng)址為\h/questions/?!げ┛停篟OS博客定期更新ROS社區(qū)相關(guān)活動的照片和視頻,網(wǎng)址為\h/news。下一節(jié)將介紹如何在ROS中進(jìn)行通信。1.3.4ROS中的通信下面介紹ROS中兩個節(jié)點如何使用ROS話題相互通信。圖1.8展示了節(jié)點間通過話題進(jìn)行通信的過程。如圖1.8所示,有兩個節(jié)點分別名為talker和listener。talker節(jié)點將名為HelloWorld的字符串消息發(fā)布到名為/talker的話題中,而listener節(jié)點訂閱此話題。整個過程包含了三個階段,在圖中分別標(biāo)記為(1)、(2)和(3),讓我們看看每個階段發(fā)生了什么:(1):在運行ROS中的任何節(jié)點之前,我們首先啟動master。啟動后,它將等待其他節(jié)點。當(dāng)talker節(jié)點(發(fā)布者)開始運行時,它將連接到master,并與master交換其所要發(fā)布話題的詳細(xì)信息,包括話題名稱、消息類型和發(fā)布節(jié)點URI。master的URI是一個全局值,所有節(jié)點都可以連接到它。master通過列表維護(hù)與其連接的發(fā)布者。每當(dāng)發(fā)布者的詳細(xì)信息發(fā)生更改時,列表將自動更新。(2):當(dāng)我們啟動listener節(jié)點(訂閱者)時,它將連接到master并交換節(jié)點的詳細(xì)信息,例如要訂閱的話題、其消息類型和節(jié)點URI。與發(fā)布者類似,master也維護(hù)一個訂閱者列表。圖1.8ROS節(jié)點通過話題進(jìn)行通信的過程(3):每當(dāng)出現(xiàn)針對同一話題的訂閱者和發(fā)布者時,master將進(jìn)行訂閱者和發(fā)布者URI的交換,幫助兩個節(jié)點建立連接和交換數(shù)據(jù)。訂閱者和發(fā)布者建立連接后,就不需要master的角色了。數(shù)據(jù)并不流經(jīng)master,而是直接在相互連接的節(jié)點間交換消息。有關(guān)節(jié)點、名稱空間和用法的更多信息,請訪問\h/Nodes?,F(xiàn)在我們已經(jīng)了解了ROS通信的基本原理,接下來介紹幾個ROS客戶端庫。1.4ROS客戶端庫ROS客戶端庫用于編寫ROS節(jié)點。所有的ROS概念都在客戶端庫中實現(xiàn)。所以,我們可以直接使用ROS客戶端庫(來編寫自己的節(jié)點,也就是應(yīng)用程序),而不必從頭開始實現(xiàn)任何東西。我們可以使用客戶端庫實現(xiàn)具有發(fā)布者和訂閱者功能的ROS節(jié)點,或者編寫服務(wù)回調(diào)函數(shù)等。ROS客戶端庫主要是C++和Python語言庫,另外還有Lisp語言庫。以下是比較受用戶歡迎的ROS客戶端庫:·roscpp:這是構(gòu)建ROS節(jié)點最推薦且應(yīng)用最廣泛的ROS客戶端庫之一。該客戶端庫實現(xiàn)了大多數(shù)的ROS概念,可以用于編寫高性能應(yīng)用程序?!ospy:這是ROS客戶端庫的純Python實現(xiàn)。這個庫的優(yōu)勢在于它易于原型化,這意味著開發(fā)應(yīng)用程序的時間沒有那么長。雖然不建議用于高性能應(yīng)用程序開發(fā),但它非常適用于非關(guān)鍵任務(wù)?!oslisp:這是Lisp語言實現(xiàn)的客戶端庫,通常用于構(gòu)建機器人規(guī)劃庫。讀者可以在\h/Client%20Libraries中找到所有ROS客戶端庫的詳細(xì)信息。下一節(jié)我們將對各種具有不同功能的ROS工具進(jìn)行概述。1.5ROS工具ROS提供了各種GUI和命令行工具來檢查和調(diào)試消息。當(dāng)讀者在一個涉及大量軟件包集成的復(fù)雜項目中進(jìn)行開發(fā)工作時,這些工具將非常有用——能夠幫助開發(fā)人員確定話題和消息是否以正確的格式發(fā)布,以及是否能夠滿足用戶的需要。下面我們介紹一些常用的ROS工具。1.5.1ROS的可視化工具RVizRViz(\h/rviz)是ROS提供的三維可視化工具之一,可以將ROS話題和參數(shù)中的數(shù)值以二維或三維的形式可視化。RViz主要用于各類數(shù)據(jù)的可視化,如機器人模型、機器人三維變換數(shù)據(jù)(TF)、點云、激光和圖像數(shù)據(jù),以及其他各種不同的傳感器數(shù)據(jù),一個例子如圖1.9所示。圖1.9RViz下點云數(shù)據(jù)可視化圖示圖1.9顯示了一個安裝在自動駕駛汽車上的Velodyne傳感器的三維點云掃描數(shù)據(jù)。1.5.2rqt_plotrqt_plot程序(\h/rqt_plot)是一個用于繪制ROS話題形式的標(biāo)量值的工具。我們可以在話題框中提供話題名稱,并將相應(yīng)話題的變量數(shù)據(jù)繪制出來,如圖1.10所示。圖1.10rqt_plot圖示圖1.9是來自turtle_sim節(jié)點的位姿(pose)圖(包含了x軸和y軸的坐標(biāo)值)。1.5.3rqt_graphrqt_graph(\h/rqt_graph),是一個ROSGUI工具,能夠以可視化的形式展示ROS節(jié)點之間的相互連接關(guān)系,如圖1.11所示。圖1.11rqt_graph圖示\h/Tools提供了ROS工具的完整列表。至此,我們對ROS工具有了簡單的了解,下面我們將介紹不同的ROS模擬器。1.6ROS模擬器與ROS緊密集成的開源機器人模擬器之一是Gazebo(\h)。Gazebo是一個動態(tài)的機器人模擬器,提供了對各種各樣的機器人模型和傳感器的廣泛支持??梢酝ㄟ^添加插件的形式對Gazebo的功能進(jìn)行擴展。ROS可以通過話題、參數(shù)和服務(wù)訪問傳感器值。當(dāng)模擬程序需要與ROS完全兼容時,推薦使用Gazebo。通常情況下,大多數(shù)機器人模擬器都是專有的,而且價格昂貴;如果讀者無法負(fù)擔(dān)專用機器人模擬器軟件的費用,則可以直接使用Gazebo,而不需要考慮任何問題。典型的Gazebo模擬器如圖1.12所示。圖1.12Gazebo模擬器圖1.12是一個來自O(shè)SRF的PR2機器人模型。感興趣的讀者可以在\h/pr2/pr2\ucommon的description文件夾中找到該模型。讀者可以在\h/gazebo中找到Gazebo的ROS接口。簡要了解了ROS的模擬器之后,下面我們將介紹在Ubuntu上安裝ROSMelodic的過程。1.7在Ubuntu18.04LTS上安裝ROSMelodic正如我們已經(jīng)討論過的,有多種ROS發(fā)行版可供下載和安裝,因此根據(jù)我們的需要選擇正確的發(fā)行版可能會令人困惑。以下是選擇發(fā)行版時的常見問題和答案:·問:我應(yīng)該選擇哪個發(fā)行版以獲得最大支持?答:如果你希望獲得最大的支持,請選擇一個LTS版本。最好選擇次新的LTS發(fā)行版。·問:如果我想要體驗ROS的最新特性,那么應(yīng)該選擇哪一個版本?答:請選擇最新版本,但可能無法在發(fā)布后立即獲得最新的完整功能包,一般可能要幾個月后才能得。這是因為將完整的官方功能包從上一個發(fā)行版遷移到新的發(fā)行版需要時間。本書將主要基于兩個LTS發(fā)行版:ROSKinetic,一個穩(wěn)定的發(fā)行版;ROSMelodic,目前最新的發(fā)行版。本書后面的章節(jié)將使用ROSMelodic。開始安裝訪問ROS安裝網(wǎng)站(\h/ROS/Installation),其中列出了最新的ROS發(fā)行版,如圖1.13所示。圖1.13ROS網(wǎng)站顯示的最新發(fā)行版單擊ROSKinetic或ROSMelodic對應(yīng)的圖片,將會跳轉(zhuǎn)至對應(yīng)發(fā)行版的完整安裝說明頁面。下面我們將對最新ROS發(fā)行版的安裝步驟進(jìn)行說明。1.配置Ubuntu倉庫我們將在Ubuntu18.04上從ROS功能包倉庫安裝ROSMelodic。倉庫需要具有預(yù)先構(gòu)建的.deb格式的ROS二進(jìn)制文件。為了能夠使用ROS倉庫中的功能包,我們必須首先配置Ubuntu的倉庫選項。讀者可以從\h/community/Repositories/Ubuntu查詢不同類型的Ubuntu倉庫的詳細(xì)信息。可以按以下步驟進(jìn)行倉庫的配置:1)在Ubuntu的搜索欄中搜索Software&Updates,如圖1.14所示。圖1.14Ubuntu的Software&Updates界面2)單擊Software&Updates并啟用所有的Ubuntu倉庫(即勾選所有倉庫前的方框),如圖1.15所示。圖1.15Ubuntu的Software&Updates中心至此我們已經(jīng)完成了倉庫的設(shè)置,下面繼續(xù)進(jìn)行下一步。2.設(shè)置source.list下一步是允許獲取來自ROS倉庫服務(wù)器的ROS功能包packages.ROS.org的訪問權(quán)。為此,我們必須將ROS倉庫服務(wù)器的詳細(xì)信息輸入source.list中,該列表位于/etc/apt/。執(zhí)行以下命令來完成上述過程:完成以后,我們就可以設(shè)置密鑰了。3.設(shè)置密鑰在向Ubuntu中添加新的倉庫時,需要添加相應(yīng)的密鑰,以確保其可信性,并能夠驗證功能包的來源。因此,在開始安裝ROS之前,應(yīng)將以下密鑰添加到Ubuntu:完成上述步驟后,就可以從授權(quán)的服務(wù)器上下載ROS并安裝了。4.安裝ROSMelodic現(xiàn)在,我們準(zhǔn)備在Ubuntu上安裝ROS功能包。安裝步驟如下:1)更新Ubuntu上的功能包列表,即執(zhí)行以下命令來更新列表:執(zhí)行上述命令后,系統(tǒng)將從source.list中的服務(wù)器獲取所有功能包。2)獲取功能包列表后,使用以下命令安裝整個ROS功能包套件:上述命令將自動安裝ROS中的絕大多數(shù)重要功能包。為了順利完成安裝,至少要在Ubuntu根分區(qū)中預(yù)留15GB的空間。5.初始化rosdep在ROS中,rosdep工具能夠幫助用戶在編譯功能包時方便地安裝依賴項,同時,該工具對于ROS中的某些核心組件而言也是必需的。執(zhí)行以下命令以初始化rosdep:初次執(zhí)行上述命令時,將會在/etc/ros/rosdep/sources.list.d/目錄下創(chuàng)建一個名為20-default.list的文件,文件內(nèi)容為對應(yīng)ros-distros的鏈接列表。6.設(shè)置ROS環(huán)境完成前面的步驟之后,我們就已經(jīng)完成了ROS的安裝過程,下面我們需要對ROS環(huán)境進(jìn)行設(shè)置。安裝ROS主要涉及各種腳本和可執(zhí)行文件,安裝目錄為/opt/ros/<ros_version>。為了訪問這些命令和腳本,我們需要向Ubuntu終端添加ROS環(huán)境變量。相關(guān)操作很簡單,只需要通過source命令將相關(guān)設(shè)置文件進(jìn)行配置即可:但是,為了在多個終端中獲得ROS環(huán)境,我們應(yīng)該將命令添加到位于主文件夾中的.bashrc腳本中。這樣每次打開新終端時,都將讀取.bashrc腳本,從而加載ROS環(huán)境變量,具體操作為執(zhí)行以下命令:我們可以在同一個Ubuntu操作系統(tǒng)中安裝多個ROS版本。如果讀者安裝了多個版本的ROS,則可以通過改變上述命令中的發(fā)行版名稱來切換使用不同版本的ROS。7.安裝rosinstall在安裝過程的最后,我們將安裝名為rosinstall的ROS命令,用來為特定的ROS功能包安裝源代碼樹。該工具基于Python,讀者可以使用以下命令安裝它:至此,我們已經(jīng)完成了ROS的安裝。只需運行以下命令檢查安裝是否成功:·打開一個終端窗口,運行roscore命令:·打開新的終端窗口,運行turtlesim節(jié)點:如果上述安裝過程無誤,則執(zhí)行上述命令將出現(xiàn)圖1.16所示的界面。圖1.16turtlesim節(jié)點的GUI及顯示位姿信息的終端窗口讀者可以嘗試重啟幾次turtlesim節(jié)點,將會看到外形不同的烏龜形象。如果讀者能夠看到turtlesim節(jié)點的運行,則表明已經(jīng)在Ubuntu中成功安裝了ROS。下面我們將介紹在虛擬環(huán)境VirtualBox中設(shè)置ROS的過程。1.8在VirtualBox上設(shè)置ROS如前所述,ROS目前僅支持Ubuntu操作系統(tǒng)。那么,Windows系統(tǒng)以及macOS系統(tǒng)用戶怎樣體驗ROS呢?對于其他兩種操作系統(tǒng)用戶,可以通過虛擬機軟件VirtualBox(\h/)體驗ROS。通過VirtualBox,我們可以在計算機中安裝一個不影響原操作系統(tǒng)的虛擬操作系統(tǒng)。該虛擬操作系統(tǒng)能夠以特定的配置與源操作系統(tǒng)平行運行,特定配置包括處理器、內(nèi)存以及硬盤空間等。讀者可以從\h/wiki/Downloads下載對應(yīng)操作系統(tǒng)版本的VirtualBox安裝包。在VirtualBox中安裝Ubuntu系統(tǒng)的完整過程可以參考\h/watch?v=QbmRXJJKsvs中的入門視頻。圖1.17為VirtualBox的一個運行界面。讀者可以在左側(cè)看到已安裝的虛擬操作系統(tǒng)列表,虛擬系統(tǒng)的性能參數(shù)則顯示于右側(cè)界面中。頂部的工具欄包含了新建虛擬機、啟動已有虛擬機等按鈕。圖中還顯示了推薦的虛擬機配置。上述虛擬機的主要配置參數(shù)如下:·CPU數(shù):1?!AM:4GB?!わ@示|視頻存儲器:128M?!ぜ铀傩阅埽?D?!ご鎯臻g:20~30GB?!ぞW(wǎng)絡(luò)適配器:NAT(NetworkAddressTranslation,網(wǎng)絡(luò)地址轉(zhuǎn)換)。為了實現(xiàn)硬件加速,建議讀者從VirtualBoxGuestaddons光盤安裝驅(qū)動程序。引導(dǎo)到Ubuntu桌面后,導(dǎo)航到Devices|InsertGuestAdditionCDImage。上述操作將在Ubuntu中裝載CD鏡像,并要求用戶運行腳本來安裝驅(qū)動程序。如果允許安裝,它會自動安裝所有的驅(qū)動程序。重新啟動后,讀者將以完全加速的性能運行Ubuntu客戶機。在VirtualBox上安裝ROS的過程與實際的Ubuntu系統(tǒng)安裝過程沒有區(qū)別。如果虛擬網(wǎng)絡(luò)適配器處于NAT模式,則主機操作系統(tǒng)的Internet連接將與虛擬操作系統(tǒng)共享,因此虛擬操作系統(tǒng)可以像實際操作系統(tǒng)一樣工作。至此,我們完成了在VirtualBox上設(shè)置ROS的過程。下面我們將介紹Docker。圖1.17VirtualBox運行界面及推薦的虛擬機配置1.9Docker簡介Docker是一款免費軟件,與將其引入開源社區(qū)的公司同名。讀者可能聽說過Python中的虛擬環(huán)境,可以在其中為項目創(chuàng)建獨立的環(huán)境并安裝專用的依賴項,這些依賴項不會對其他環(huán)境中的其他項目造成任何影響。Docker與Python的虛擬環(huán)境類似,我們可以通過Docker為項目創(chuàng)建稱為容器的獨立環(huán)境。容器的工作方式類似于虛擬機,但與虛擬機有所不同。虛擬機在硬件層上需要一個單獨的操作系統(tǒng),但容器不在硬件層上獨立工作,而是僅共享主機的資源。這有助于消耗更少的內(nèi)存,而且它通常比虛擬機更快。圖1.18展示了兩者之間的區(qū)別。圖1.18虛擬機與Docker的區(qū)別了解了虛擬機與Docker之間的區(qū)別之后,下面我們來學(xué)習(xí)一下怎樣使用Docker。1.9.1為什么選擇Docker在ROS中,一個項目可能包含多個元包,每一個元包都包含對應(yīng)的子包,每一個包的正常工作都需要對應(yīng)的依賴項。對于開發(fā)人員來說,在ROS中設(shè)置功能包是非常麻煩的,因為不同的功能包使用的依賴項既可能相同也可能不同,相同的依賴項又可能是不同的版本,這些情況是十分常見的,而又有可能導(dǎo)致編譯問題。一個典型的例子是,當(dāng)我們想要在ROSIndigo中使用OpenCV3時,不同版本的視覺算法或gazebo_ros_controller功能包將會導(dǎo)致著名的嚴(yán)重錯誤(\h/ros-simulation/gazebo_ros_pkgs/issues/612)。當(dāng)開發(fā)人員試圖進(jìn)行修復(fù)時,可能會因在修復(fù)過程中更改了功能包或依賴項的版本而導(dǎo)致項目無法工作。解決上述問題的方法有許多種,一種較為有效的方法是在ROS中使用Docker容器。與操作系統(tǒng)中的任何進(jìn)程不同,容器速度很快,可以在幾秒內(nèi)啟動或停止。操作系統(tǒng)或軟件包上的任何升級或更新都不會影響內(nèi)部的容器或外部的其他容器。1.9.2安裝Docker可以通過兩種方法安裝Docker:通過Ubuntu倉庫;使用Docker官方倉庫?!と绻x者只是想要快捷安裝Docker,則可以選擇從Ubuntu倉庫安裝,因為只需執(zhí)行一行命令,并且能夠節(jié)省一些時間;·如果讀者想要較為深入地了解Docker,而不是僅僅通過本書的概述來了解,則推薦通過Docker的官方倉庫安裝,因為其版本更加穩(wěn)定,有相應(yīng)bug的修復(fù),還有一些新的特性。在進(jìn)行安裝之前,請執(zhí)行以下命令來對apt包索引進(jìn)行更新:$sudoapt-getupdate1.從Ubuntu倉庫安裝Docker從Ubuntu倉庫安裝Docker只需執(zhí)行以下命令:在通過上述方法安裝Docker之后,如果讀者想要移除Docker,或者想要體驗從Docker官方倉庫進(jìn)行安裝的過程,則可以通過下面的方法將已經(jīng)安裝的Docker移除。2.移除Docker如果讀者想要用最新的穩(wěn)定版Docker替換已經(jīng)安裝的舊版本,則可以使用以下命令移除已安裝的Docker,移除之后,即可從Docker官方倉庫安裝最新的Docker。移除的命令如下:上述命令是移除Docker的通用命令,將移除Docker、docker-engine、docker.io(這些是舊版本的名稱),如果有運行時容器的話,也會一同移除。3.從Docker倉庫安裝從Docker倉庫安裝的步驟如下:1)執(zhí)行以下命令:2)添加源自Docker的官方GPG密鑰:3)執(zhí)行以下命令來配置Docker官方倉庫:官方Docker提供了三個更新通道,分別是穩(wěn)定通道、夜間通道以及測試通道。測試通道提供用于可用性測試的預(yù)發(fā)行版,夜間通道是正在開發(fā)中的版本或beta版本,穩(wěn)定通道是已修復(fù)bug的最終確定版本。Docker團(tuán)隊的最佳建議是穩(wěn)定通道;但是,感興趣的讀者可以通過將stable替換為nightly或test來測試其他兩個通道。4)再次更新apt包索引:5)使用以下命令安裝Docker包:6)使用上述兩種方法中的任意一種完成Docker的安裝后,均可以使用以下命令查看Docker的版本:當(dāng)前Ubuntu倉庫中的最新版本為17.12,Docker官方倉庫的最新版本則是18.09(穩(wěn)定版)。默認(rèn)情況下,Docker只能作為根用戶運行。為便于運行,讀者可以使用以下命令將自己的用戶名添加到Docker組:為了使得設(shè)置生效,需要重啟系統(tǒng),否則可能會遇到“permissiondenied”(權(quán)限拒絕)錯誤,如圖1.19所示。圖1.19權(quán)限拒絕錯誤上述錯誤的一個快速修復(fù)方法是在任何Docker命令之前使用sudo。4.使用Docker容器由Docker鏡像構(gòu)建,這些鏡像可以從DockerHub(\h/)中提取。我們可以使用以下命令從ros倉庫中提取ROS容器:如果命令運行無誤,將得到如圖1.20所示的輸出。圖1.20成功提取Docker讀者可以指定特定的ROS版本來工作。對于任何應(yīng)用程序,最好的建議是從melodic-core開始,因為在這里可以繼續(xù)工作并更新與項目目標(biāo)相關(guān)的容器,而不必安裝其他不必要的組件。讀者可以使用以下命令查看Docker鏡像:默認(rèn)情況下,所有的容器均保存在/var/lib/docker目錄下。使用前面的命令,可以標(biāo)識倉庫名稱和標(biāo)記。在本書的例子中,對于ros倉庫名稱,相應(yīng)的標(biāo)記是melodic-ros-core。因此,可以使用以下命令運行ros容器:$dockerimages命令提供的其他信息是容器ID,在本書的例子中是7c5d1e1e5096。當(dāng)讀者想移除容器時,將會用到該ID信息。進(jìn)入Docker后,可以使用以下命令檢查可用的ROS功能包:運行和退出Docker時,將會創(chuàng)建另一個容器,因此對于初學(xué)者來說,經(jīng)常會在不知不覺中創(chuàng)建一系列容器。讀者可以使用$dockerps-a或$dockerps-l查看所有活動/非活動的容器或最新的容器,并使用$dockerrm<docker_name>刪除容器。要繼續(xù)在同一容器中工作,可以使用以下命令:這里,silly_volhard是所創(chuàng)建容器的默認(rèn)名稱。現(xiàn)在,你打開了同一容器,則可以安裝ROS功能包并將相應(yīng)的更改提交給Docker。使用下面的命令安裝actionlib_tutorials功能包:現(xiàn)在,當(dāng)再次檢查ROS功能包列表時,將能夠查看到一些額外的功能包。由于你已經(jīng)修改了容器(安裝了上述功能包),所以在重新打開Docker鏡像時需要提交修改。使用以下命令退出容器并提交修改:現(xiàn)在我們已經(jīng)在Ubuntu和VirtualBox上安裝了ROS,下面讓我們學(xué)習(xí)如何設(shè)置ROS工作空間。1.10設(shè)置ROS工作空間在實際的計算機、虛擬機或Docker中安裝和配置了ROS之后,下一步是在ROS中創(chuàng)建工作空間。ROS下的工作空間是我們存放ROS功能包的地方。在最新的ROS發(fā)行版中,我們使用基于catkin的工作空間構(gòu)建和安裝ROS功能包。catkin系統(tǒng)(\h/catkin)是ROS的官方構(gòu)建系統(tǒng),能夠幫助用戶在工作空間中將源代碼編譯為可執(zhí)行目標(biāo)文件或鏈接庫。構(gòu)建ROS工作空間并不困難,只需要在終端中執(zhí)行以下步驟:1)創(chuàng)建一個空的工作空間文件夾和另一個名為src的文件夾來存儲ROS功能包。以下命令將為我們執(zhí)行此操作。此處的工作空間文件夾名為catkin_ws:2)切換至src文件夾,并執(zhí)行catkin_init_workspace命令,該命令將在當(dāng)前src文件夾下初始化catkin工作空間。至此,我們已經(jīng)可以在src文件夾下創(chuàng)建功能包了:3)初始化catkin工作空間后,就可以使用catkin_make命令構(gòu)建工作空間下的功能包了,工作空間為空時也可以構(gòu)建:4)執(zhí)行上述命令,將會在ROS工作空間內(nèi)創(chuàng)建兩個新的文件夾,分別是build和devel,如圖1.21所示。圖1.21catkin工作空間中的文件夾5)構(gòu)建工作空間之后,為了獲取對工作空間內(nèi)功能包的訪問權(quán)限,需要將工作空間的環(huán)境變量添加至.bashrc文件中,具體命令如下:6)完成上述步驟后,可以使用以下命令確認(rèn)配置過程是否正確:上述命令將會輸出ROS的完整路徑,如果一切正常的話,輸出結(jié)果應(yīng)該如圖1.22所示。圖1.22ROS功能包路徑上述命令將會顯示兩個ROS_PACKAGE_PATH路徑,前一個是我們在步驟5中執(zhí)行相應(yīng)命令的結(jié)果,后一個是ROS的實際安裝路徑。至此,我們完成了ROS工作空間的創(chuàng)建與設(shè)置,下面我們將介紹ROS在工業(yè)界以及學(xué)術(shù)界都有哪些機遇。1.11ROS在工業(yè)界和學(xué)術(shù)界的機遇現(xiàn)在我們已經(jīng)安裝了ROS并設(shè)置了ROS工作空間,可以探討一下使用ROS的優(yōu)勢。為什么學(xué)習(xí)ROS對機器人研究人員如此重要?因為ROS正在成為一個通用的框架,用于各種機器人的應(yīng)用程序開發(fā)。目前,學(xué)術(shù)界和工業(yè)界的機器人主要使用ROS進(jìn)行應(yīng)用程序開發(fā)。以下是一些著名的應(yīng)用ROS的機器人公司:·FetchRobotics:\h/。·ClearpathRobotics:\h/。·PALRobotics:\h/en/home/。·YujinRobot:\h/。·DJI:\h/?!OBOTIS:\h/html/en.php。ROS的知識將幫助你輕松獲得機器人應(yīng)用工程的工作。如果你仔細(xì)研究任何與機器人相關(guān)的技能集,那么一定會在其中找到ROS的相關(guān)應(yīng)用。大學(xué)和企業(yè)都有獨立的課程及培訓(xùn)機構(gòu),專門教授ROS機器人開發(fā)知識。了解ROS將有助于你在著名的機器人研究機構(gòu)(如卡內(nèi)基–梅隆大學(xué)的機器人研究所(\h/)和賓夕法尼亞大學(xué)的GRAP實驗室(\h/))獲得實習(xí)和攻讀碩士、博士學(xué)位以及博士后的機會。本書后續(xù)的章節(jié)將幫助讀者學(xué)習(xí)在ROS中構(gòu)建實用項目的基礎(chǔ)和核心技能。1.12本章小結(jié)本章是本書的概述,主要幫助讀者了解使用ROS進(jìn)行機器人應(yīng)用開發(fā)的相關(guān)概念。本章的主要目標(biāo)是幫助讀者掌握ROS的安裝方法并理解ROS的基本概念。本章可以作為ROS應(yīng)用程序開發(fā)的入門指南,并幫助讀者理解本書后續(xù)章節(jié)的內(nèi)容,這些章節(jié)主要演示基于ROS的應(yīng)用程序開發(fā)。在本章的最后,我們看到了與ROS相關(guān)的工作和研究機遇,并且看到許多大學(xué)和企業(yè)正在為不同的機器人應(yīng)用開發(fā)項目尋找掌握ROS開發(fā)技術(shù)的人才。在下一章中,我們將對ROS-2及其特點進(jìn)行介紹。第2章ROS-2及其特性簡介ROS,更具體地說,ROS-1,目前推動機器人技術(shù)在開源社區(qū)發(fā)展到了一個里程碑式的水平。盡管在軟硬件連接同步方面存在缺陷與不足,但是ROS-1提供了一種簡單的通信策略,該策略使得用戶能夠輕松地將任何復(fù)雜的傳感器連接到微型計算機或微控制器中。在過去的十年里,ROS-1已經(jīng)發(fā)展壯大,擁有一個龐大的功能包列表,每個功能包都能解決一個或一些問題,并一定程度上消除了重新發(fā)明輪子的問題。這些功能包帶來了一種看待機器人技術(shù)的全新方式,并使得當(dāng)前可用的機器人系統(tǒng)具備了一定的智能。通過連接幾個小規(guī)模的功能包,用戶就可以創(chuàng)建一個全新的復(fù)雜自治系統(tǒng)。盡管ROS-1讓我們可以輕松地與復(fù)雜的硬件和軟件組件進(jìn)行通信,但使用ROS-1開發(fā)實際可用產(chǎn)品的過程涉及一些復(fù)雜的問題。例如,假設(shè)在制造業(yè)中需要一大群異構(gòu)機器人(例如,移動機器人、機械臂等)協(xié)同工作,由于ROS-1的體系結(jié)構(gòu)不支持多master的概念,因此很難在多異構(gòu)機器人之間建立通信。盡管有其他方法用于網(wǎng)絡(luò)中節(jié)點之間的通信(我們將在第6章探討),但它們之間沒有安全的通信方式。任何連接到master的用戶都可以很容易地訪問可用話題的列表,還可以使用或修改它們。鑒于此,人們通常使用ROS-1來驗證概念,或者構(gòu)建科學(xué)研究的快速解決方案。在使用ROS-1進(jìn)行原型設(shè)計驗證和創(chuàng)建最終產(chǎn)品之間出現(xiàn)了一條難以逾越的鴻溝,這主要是因為ROS-1不是實時的。通過無線連接(Wi-Fi)使用有線連接(以太網(wǎng))時,系統(tǒng)組件之間的網(wǎng)絡(luò)連接有所不同,這可能導(dǎo)致數(shù)據(jù)接收延遲,甚至丟失數(shù)據(jù),從而導(dǎo)致系統(tǒng)不穩(wěn)定??紤]到這一點,OSRF開始了改進(jìn)和建設(shè)下一代ROS——ROS-2的旅程。目前ROS-2正處于開發(fā)之中,主要目的是修復(fù)ROS-1在通信中存在的風(fēng)險和不足。在本章中,讀者將了解ROS-2的概念及其與ROS-1的區(qū)別以及特點。為了讀者能夠更好地理解和比較,本章的組織方式與前一章相似:·ROS-2概述。·ROS-2基礎(chǔ)?!OS-2客戶端庫。·ROS-2工具。·安裝ROS-2?!ぴO(shè)置ROS-2工作空間?!ぞ帉慠OS-2節(jié)點?!OS-1和ROS-2的通信。2.1技術(shù)要求學(xué)習(xí)本章內(nèi)容的相關(guān)要求如下:·在Ubuntu18.04(Bionic)中通過源碼形式安裝ROS-2?!r間線及測試平臺:■預(yù)計學(xué)習(xí)時間:平均約90分鐘?!鲰椖繕?gòu)建時間(包括編譯和運行):平均約60分鐘?!鲰椖繙y試平臺:惠普Pavilion筆記本電腦(Intel?CoreTMi7-4510UCPU@2.00GHz×4,8GB內(nèi)存,64位操作系統(tǒng),GNOME-3.28.2桌面環(huán)境)。本章代碼可以從以下網(wǎng)址下載:\h/PacktPublishing/ROS-Robotics-Projects-SecondEdition/tree/master/chapter_2_ws/src/ros2_talker。下面介紹ROS-2的相關(guān)概念。2.2ROS-2概述ROS-2設(shè)計目標(biāo)明確,旨在改進(jìn)可用于實時系統(tǒng)和產(chǎn)品階段解決方案的通信網(wǎng)絡(luò)框架。ROS-2的目標(biāo)是:·為不同組件提供安全可靠的通信。·實時通信能力?!ひ子诮⒍鄼C器人通信連接?!ぬ岣卟豢紤]通信媒介情況下的通信質(zhì)量?!ぶ苯釉谟布用妫ㄈ鐐鞲衅骱颓度胧桨澹┥咸峁㏑OS層?!な褂米钚碌能浖姹荆ㄖ饕侵缚蛻舳藥欤?。讀者是否還記得第1章中的“ROS等式”?ROS-2同樣有一條“ROS-2等式”,但與前者略有不同,如圖2.1所示。ROS-2遵循行業(yè)標(biāo)準(zhǔn),通過一個稱為DDS實現(xiàn)的概念來實現(xiàn)實時通信。DDS(DataDistributedService,數(shù)據(jù)分布式服務(wù))是對象管理組織(ObjectManagementGroup,OMG)公認(rèn)的行業(yè)標(biāo)準(zhǔn),它有許多供應(yīng)商實現(xiàn)的不同版本,如RTI的Connext(\h/products/)、ADLink的OpenSpliceRTPS(\h/ADLINk-IST/opensplice)以及eProsima的快速RTPS(\h/index.php/products-all/eprosima-fast-rtps)。圖2.1集成DDS實現(xiàn)的ROS等式(圖片來源:?;谥R共享授權(quán)協(xié)議CC-BY-3.0:\h/licenses/by/3.0/us/legalcode)這些標(biāo)準(zhǔn)被用于航空系統(tǒng)、醫(yī)院、金融服務(wù)和空間探索系統(tǒng)等對實時性要求極高的應(yīng)用之中。此實現(xiàn)旨在簡化管道策略(發(fā)布–訂閱基礎(chǔ)結(jié)構(gòu)),并使其在不同的硬件和軟件組件之間更加可靠,以此確保用戶可以更專注于功能和生態(tài)系統(tǒng)(而無須過多擔(dān)心通信問題帶來的不確定性)。2.2.1ROS-2發(fā)行版經(jīng)過幾年的alpha和beta版本的發(fā)布,ROS-2的第一個官方穩(wěn)定版本于2017年12月推出。該發(fā)行版名為ArdentApalone,這是一種典型的按字母順序命名的方式,OSRF通常遵循這種命名方式來命名其ROS發(fā)行版。第二次發(fā)布是在2018年6月,發(fā)行版名為BouncyBolson。這個版本增加了新的功能,修復(fù)了之前版本的錯誤,并支持Ubuntu18.04和Windows10(開發(fā)環(huán)境為VisualStudio2017)。第三個版本名為CrystalClemmys,于2018年12月發(fā)布。所有的ROS發(fā)行版都以代號形式命名。例如,當(dāng)前版本代號為crystal,而前兩個版本代號分別為bouncy和ardent。截至本書撰寫期間,最新的版本是DashingDiademata,于2019年5月31日發(fā)布,代號為dashing。ardent和bouncy已經(jīng)達(dá)到了EOL(EndOfLicense,許可證終止)的最后期限,因此不再受到支持。第三個穩(wěn)定版本crystal的許可證終止日期為2019年12月,僅余的唯一一個長期穩(wěn)定版本是dashing,許可證終止日期為2021年5月。2.2.2支持的操作系統(tǒng)ROS-2支持Linux、Windows、macOS和實時操作系統(tǒng)(RTOS)OS層,ROS-1只支持Linux和macOS層。雖然ROS社區(qū)有對Windows的支持版,但OSRF并沒有正式推出支持Windows的ROS-1。表2.1給出了ROS-2發(fā)行版及支持的操作系統(tǒng)。表2.1ROS-2版本及對應(yīng)的操作系統(tǒng)本書中討論的ROS-2版本為DashingDiademata,即第四個發(fā)行版。2.2.3支持的機器人及傳感器ROS-2正在得到研究機構(gòu)和工業(yè)界,特別是機器人制造業(yè)的廣泛應(yīng)用和支持。以下是ROS-2支持的機器人和傳感器的鏈接:·TurtleBot2:\h/ros2/turtlebot2_demo?!urtleBot3:\h/ROBOTIS-GIT/turtlebot3/tree/ros2?!ararobotarm:\h/AcutronicRobotics/MARA?!r.Robot的Jaguar4x4:\h/TRI-jaguar4x4/jaguar4x4?!ntelRealsensecamera:\h/intel/ros2_intel_realsense?!dlidar:\h/Adlink-ROS/ydlidar_ros2。目前,ROS-2頁面尚未給出支持的機器人和傳感器。上述機器人和傳感器包是研究人員根據(jù)使用ROS-2及其硬件的經(jīng)驗提供給社區(qū)的。2.2.4為什么選擇ROS-2考慮到機器人社區(qū)的需求,ROS-2的工作原理與ROS-1類似。ROS-2是獨立的發(fā)行版,不是ROS-1的一部分。但是,它又可以嵌入ROS-1軟件包中并與之協(xié)同工作。目前正在開發(fā)中的ROS-2,主要借助現(xiàn)代依賴庫和工具克服ROS-1存在的不足。ROS-1的特征棧是用C++編寫的,客戶端庫是用C++和Python編寫的(其中Python編寫的客戶端庫是用一種基于底層的方法構(gòu)建的,該方法基于C++庫編寫),而ROS-2中的組件是用C語言編寫的。ROS-2中有一個用C語言編寫的獨立層,用來連接到ROS-2客戶端庫,客戶端庫主要包括rclcpp、rclpy和rcljava等。ROS-2對各種網(wǎng)絡(luò)配置有了更好的支持,并能夠提供可靠的通信。ROS-2還消除了nodelet\h[1](\h/nodelet)的概念,支持多節(jié)點初始化。與ROS-1不同,ROS-2中有兩個非常有趣的特性:一是通過狀態(tài)機周期檢測節(jié)點的心跳;二是在添加或刪除節(jié)點和話題時發(fā)出通知。這些設(shè)計可以幫助提供系統(tǒng)的容錯性。此外,ROS-2很快將支持不同的平臺和架構(gòu)。至此我們已經(jīng)了解了ROS-2與ROS-1的主要區(qū)別,下面讓我們相對詳細(xì)地介紹ROS-2的基本原理。\h[1]nodelet是一個可以將多個節(jié)點捆綁在一起管理的功能包?!g者注2.3ROS-2基礎(chǔ)在ROS-1中,用戶代碼將連接到ROS客戶端庫(例如rospy或roscpp),它們將直接與網(wǎng)絡(luò)中的其他節(jié)點通信;而在ROS-2中,ROS客戶端庫就像一個抽象層,使用其他節(jié)點通過DDS實現(xiàn)連接到網(wǎng)絡(luò)中進(jìn)行通信的另一層。ROS-1與ROS-2的簡單對比如圖2.2所示。圖2.2ROS-1與ROS-2的簡單對比如圖2.2所示,在ROS-2中,操作系統(tǒng)層與底層硬件層的通信是通過DDS實現(xiàn)完成的。圖中的DDS組件由相應(yīng)供應(yīng)商實現(xiàn),供應(yīng)商不同則具體實現(xiàn)不同。抽象DDS層組件與ROS-2客戶端庫連接,并通過DDS實現(xiàn)幫助用戶連接代碼。通過這樣的分層抽象,用戶無須感知DDSAPI的存在就可以與操作系統(tǒng)連接。此外,ROS-1和ROS-2的區(qū)別還在于ROS-1使用了自定義傳輸協(xié)議以及自定義中心發(fā)現(xiàn)機制,因此需要使用master,而ROS-2則具有抽象的DDS層,通過該層可以實現(xiàn)序列化、傳輸和發(fā)現(xiàn)等功能。2.3.1什么是DDS如前所述,DDS是OMG定義的標(biāo)準(zhǔn)。它是一種發(fā)布–訂閱傳輸技術(shù),類似于ROS-1中使用的技術(shù)。與ROS-1不同,DDS實現(xiàn)了一種分布式發(fā)現(xiàn)系統(tǒng)技術(shù),可以幫助兩個或多個DDS程序在不使用master的情況下相互通信。發(fā)現(xiàn)系統(tǒng)不一定是動態(tài)的,實現(xiàn)DDS的供應(yīng)商提供了靜態(tài)發(fā)現(xiàn)的功能選項。2.3.2DDS的實現(xiàn)由于不同的DDS供應(yīng)商提供具有不同功能的DDS實現(xiàn),因此ROS-2支持多種DDS實現(xiàn)。例如,RTI的Connext是專門用于微控制器或需要安全認(rèn)證的應(yīng)用程序的DDS實現(xiàn)。所有的DDS實現(xiàn)都是通過一個稱為ROS中間件層(rmw)的特殊層實現(xiàn)的,如圖2.3所示。圖2.3ROS-2中間件層用戶代碼是最上面的塊,包含用戶邏輯或算法。在ROS-1中,用戶代碼通常位于ROS客戶端庫(如roscpp或rospy)的頂部,這些庫幫助用戶將其代碼與ROS中的其他組件(如節(jié)點、話題或服務(wù))連接起來。與ROS-1中的ROS客戶端庫不同,ROS-2中的ROS客戶端庫分為兩層:·一是對應(yīng)于特定編程語言客戶端庫(如rclcpp、rclpy或rcljava)的功能層,用于處理諸如rosspin之類的線程處理和諸如內(nèi)存管理之類的進(jìn)程內(nèi)通信。·二是名為rcl的公共層,用C語言實現(xiàn),用來處理名稱、服務(wù)、參數(shù)、時間和控制臺日志記錄。ROS中間件層rmw也是用C語言實現(xiàn)的,它與位于硬件層頂部的DDS實現(xiàn)相連接。該層負(fù)責(zé)服務(wù)調(diào)用、節(jié)點發(fā)現(xiàn)、圖形事件和具有服務(wù)質(zhì)量(QualityofServices,QoS)的發(fā)布/訂閱調(diào)用。ROS-2中的QoS是網(wǎng)絡(luò)中跨節(jié)點性能的度量。默認(rèn)情況下,ROS-2遵循eProsima的

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論