ROS 機器人程序設計, 2/e (Learning ROS for Robotics Programming, 2/e)

恩里克·費爾南德斯 (Enrique Fernandez), 路易斯·桑切斯·克雷斯波 (Luis Sanchez Crespo), 阿尼爾·馬哈塔尼 (Anil Mahtani), 亞倫·馬丁內斯 (Aaron Martinez)

買這商品的人也買了...

商品描述

無論是業餘愛好者還是專業的機器人開發人員,在開始進行機器人系統及程序設計時,首先要面對的問題都是基本的如何驅動機器人的輪子的設計。ROS通過軟件代碼復用集成了眾多已經開發完成的功能組件。本書專門幫助讀者從對ROS一無所知到能夠通過ROS系統完成小型機器人系統的開發和編程工作。本書提供了各種實際的示例代碼供讀者學習和理解ROS的軟件框架。你可以在模擬環境中自行構建機器人相應的功能程序。本書第2版在第1版的基礎上增加了與ROSHydro一起工作,如何創建、可視化和處理不同傳感器的點雲信息,如何控制和利用多關節機械臂,並提供簡單易懂的實用教程編寫自己的機器人。

作者簡介

About the Authors作者簡介Enrique Fernández在拉斯帕爾馬斯大學獲得計算機工程博士學位,目前是Clearpath Robotics公司高級機器人工程師。2009年他完成了關於SLAM的碩士學位論文。2013年他的博士論文解決了自主水下滑翔器(AUG)的路徑規劃問題。那段時間,他還研究了計算機視覺、人工智能以及其他機器人學課題,例如赫羅納大學的CIRS/ViCOROB研究實驗室AUV的慣性導航系統和視覺SLAM。他在2012年參加了歐洲學生自主水下航行器設計挑戰賽(Student Autonomous Underwater Challenge-Europe,SAUC-E)並獲獎,在2013年作為合作者參與了SAUC-E。
獲得博士學位後,Enrique作為高級機器人工程師在2013年6月加入PAL Robotics公司的自主導航部門。在那裡,他開發了用於REEM、REEM-C和移動機器人以及相關項目的軟件,如使用ROS框架的Stockbot。他的研究方向包括運動規劃(路徑規劃和移動機器人控制)、機器人定位和SLAM。在2015年,他作為高級自主系統開發人員加盟Clearpath Robotics公司的自主系統部門從事SLAM相關工作。
在學術方面,Enrique發表了多篇會議論文,其中兩篇於2011年發表在《International Conference of Robotics and Automation》(ICRA)上。他是Packt Publishing出版的第1版《ROS機器人程序設計》和其他一些書部分章節的作者。他的碩士學位論文是關於室內機器人的FastSLAM算法,此機器人裝備了SICK激光掃描儀以及Pioneer差動平台的輪式里程計。他的博士學位論文是關於AUG的路徑規划算法和工具。他還擁有電子和嵌入式系統(如PC104和Arduino)的開發經驗。他的研究背景包括SLAM、計算機視覺、路徑規劃、優化、機器人學和人工智能。
我要感謝這本書的合著者,感謝他們為完成這本書所付出的努力以及提供了無數示例的代碼。我還要感謝博士論文期間大學智能係統和計算工程研究所(University Institute of Intelligent Systems and Computational Engineering,SIANI)和水下機器人研究中心(Center of Underwater Robotics Research,CIRS/ViCOROB)的研究小組成員。我也要感謝在PAL機器人公司的同事,在那裡我學到很多關於ROS、機器人運動以及仿人雙足機器人的知識,不僅有軟件,還有電子和硬件設計。後,我要感謝我的家人和朋友的幫助與支持。
Luis Sánchez Crespo在拉斯帕爾馬斯大學獲得了電子與電信工程的雙碩士學位。他曾在技術開發和創新研究所(IDETIC)、加那利群島海洋平台(PLOCAN)和應用微電子研究所(IUMA)與不同的研究小組合作,進行超分辨率算法成像研究。
他的專業興趣包括應用於機器人系統的計算機視覺、信號處理和電子設計。因此,他加入了AVORA團隊,這批年輕的工程師和學生從零開始從事自主水下航行器(AUV)的開發工作。在這個項目中,Luis開始開發聲學和計算機視覺系統,用於提取不同傳感器的信息,例如水聽器、聲吶和攝像頭。
依託海洋技術的強大背景,Luis與人合作創辦了一家新的初創公司Subsea Mechatronics,致力於為水下環境開發遙控操作和自主航行器。
下面是海洋技術工程師和企業家(LPA Fabrika:Gran Canaria Maker Space的聯合創始人和製造商)Dario Sosa Cabrera對Luis的評價:
“他很熱情,是一個多學科的工程師。他對工作負責。他可以自我管理,並承擔一個團隊領導者的責任,如在SAUC-E競賽中領導了AVORA團隊。他在電子和電信領域的背景讓其具備從信號處理和軟件到電子設計和製造的廣泛專業知識。” 
Luis作為技術審校者參與了Packt Publishing出版的第1版《ROS機器人程序設計》的相關工作。
首先,我要感謝Aaron、Anil以及Enrique邀請我參與編寫這本書。和他們一起工作非常快樂。同時,我也要感謝水下機電團隊關於重型水下機器人的豐富經驗,這些年我們一起成長。我必須提到LPA Fabrika:Gran Canaria Maker Space,他們備課和講授教育機器人及技術項目極富熱情,與他們共享工作環境也非常令人激動。
後,我要感謝我的家人和女朋友對我參與的每個項目的大力支持和鼓勵。
Anil Mahtani是一名從事水下機器人工作5年的計算機科學家。他在該領域工作是在完成碩士論文期間為低成本ROV開發軟件架構。在此期間,他也成為AVORA的團隊領導者和主要開發人員,這個團隊的高校學生設計和開發了一個自主水下航行器並參加了2012年的SAUC-E。同年,他完成了論文並獲得了拉斯帕爾馬斯大學的計算機科學碩士學位。此後不久,他成為SeeByte公司的軟件工程師,這家公司是水下系統智能軟件解決方案的全球領導者。
在SeeByte公司工作期間,Anil參與了軍方、石油和天然氣公司的一些半自主和自主水下系統的核心開發。在這些項目中,他積極參與自主系統開發、分佈式軟件體系結構設計和底層軟件開發,同時也為前視聲吶圖像提供計算機視覺解決方案。他還獲得了項目經理職位,管理一個開發和維護內核C++庫的工程師團隊。
他的專業興趣主要包括軟件工程、算法、分佈式系統、網絡和操作系統。Anil在機器人方向主要負責提供高效和健壯的軟件解決方案,不僅解決當前存在的問題,還預見未來的問題或可能的改進。鑑於他的經驗,他在計算機視覺、機器學習和控制問題上也有獨特的見解。Anil對DIY和電子學有興趣,並且開發了一些Arduino庫回饋社區。
首先,我要感謝我的家人和朋友的支持,他們總是在我需要的時候幫助我。我也要感謝我的同事和朋友David Rubio Vidal、Emilio Miguelá?ez Martín和John Brydon給我大的支持,他們以專業的方式教我很多知識。我還要感謝我在SeeByte和AVORA團隊的同事,這些年從他們那裡學習並經歷很多。後,我要特別感謝Jorge Cabrera Gámez,他的指導和建議成就了我自己從未想像到的職業生涯。
Aaron Martinez是數字化製造領域的電腦工程師、企業家和專家。他於2010年在拉斯帕爾馬斯大學的Instituto Universitario de Cienciasy Tecnologias Ciberneticas(IUCTC)完成碩士論文。他在遠程監控領域使用沉浸式設備和機器人平台準備碩士論文。得到學位後,他參加了在奧地利林茨開普勒大學研究所的機器人學實習計劃。在實習期間,他作為團隊的一員使用ROS和導航包集進行移動平台開發。之後,他參與了有關機器人的項目,其中一個是拉斯帕爾馬斯大學的AVORA項目。在這個項目中,他參與自主水下航行器製作,並參與意大利的SAUC-E。2012年,他負責維護這個項目;2013年,他幫助從ROS向機器人平台移植導航包集和其他算法。
近,Aaron與人共同創立了一家名為SubSeaMechatronics SL的公司。這家公司從事與水下機器人和遙控系統相關的項目,還設計和製造水下傳感器。公司的主要目標是開髮用於研發原型和重型機械手的定制解決方案。
Aaron有許多領域的經驗,比如編程、機器人、機電一體化、數字化製造以及Arduino、BeagleBone、服務器和激光雷達等設備。如今,他在SubSeaMechatronics SL公司從事水下和空中環境的機器人平台設計。
我要感謝我的女朋友,她在我寫這本書時給我支持以及給我繼續成長的動力。我還要感謝Donato Monopoli(加那利群島技術研究所(ITC)生物醫學工程部門的主管),以及ITC所有的工作人員,感謝他們使我懂得數字製造、機械以及組織工程,我在此度過了生命中美好的時光。
感謝我大學的同事,特別是Alexis Quesada,他給了我在準備碩士論文時創建我第壹個機器人的機會。和他們一起工作,使我學習到很多關於機器人的知識。
後,我要感謝家人和朋友的幫助與支持。

目錄大綱

推薦序一
推薦序二
譯者序
前言
作者簡介
審校者簡介

第1章ROS Hydro系統入門1 
1.1PC安裝教程3 
1.2使用軟件庫安裝ROS Hydro3 
1.2.1配置Ubuntu軟件庫4 
1.2.2添加軟件庫到sources.list文件中4 
1.2.3設置密鑰5 
1.2.4安裝ROS5 
1.2.5初始化rosdep6 
1.2.6配置環境6 
1.2.7安裝rosinstall7 
1.3如何安裝VirtualBox和Ubuntu8 
1.3.1下載VirtualBox8 
1.3.2創建虛擬機8 
1.4在BeagleBone Black上安裝ROS Hydro11 
1.4.1準備工作12 
1.4.2配置主機和source.list文件13 
1.4.3設置密鑰14 
1.4.4安裝ROS功能包14 
1.4.5初始化rosdep15 
1.4. 6在BeagleBone Black中配置環境15 
1.4.7在BeagleBone Black中安裝rosinstall15 
1.5本章小結15

第2章ROS系統架構及概念16 
2.1理解ROS文件系統級16 
2.1.1工作空間17 
2.1.2功能包18 
2.1.3綜合功能包19 
2.1.4消息20 
2.1.5服務21 
2.2理解ROS計算圖級22 
2.2.1節點與nodelet23 
2.2.2主題24 
2.2.3服務25 
2.2.4消息26 
2.2.5消息記錄包26 
2.2.6節點管理器26 
2.2.7參數服務器27 
2.3理解ROS開源社區級27 
2.4ROS系統試用練習28 
2.4.1ROS文件系統導覽28 
2.4.2創建工作空間29 
2.4.3創建ROS功能包和綜合功能包30 
2.4.4編譯ROS功能包30 
2.4.5使用ROS節點31 
2.4. 6如何使用主題與節點交互33 
2.4.7如何使用服務36 
2.4.8使用參數服務器38 
2.4.9創建節點38 
2.4.10編譯節點41 
2.4.11創建msg和srv文件42 
2.4.12使用新建的srv和msg文件44 
2.4.13啟動文件48 
2.4.14動態參數50
2.5本章小結54 

第3章可視化和調試工具55 
3.1調試ROS節點57 
3.1.1使用gdb調試器調試ROS節點57 
3.1.2ROS節點啟動時調用gdb調試器58 
3.1.3ROS節點啟動時調用valgrind分析節點59 
3.1.4設置ROS節點core文件轉儲59 
3.2日誌信息59 
3.2.1輸出日誌信息59 
3.2.2設置調試信息級別60 
3.2.3為特定節點配置調試信息級別61 
3.2.4信息命名62 
3.2.5按條件顯示信息與過濾信息62 
3.2.6顯示信息的方式——單次、可調、組合63 
3.2.7使用rqt_console和rqt_logger_level在運行時修改調試級別63 
3.3檢測系統狀態66 
3.3.1檢測節點、主題、服務和參數67 
3.3.2使用rqt_graph在線檢測節點狀態圖70 
3.4設置動態參數71 
3.5當出現異常狀況時使用roswtf72 
3.6可視化節點診斷74 
3.7繪製標量數據圖75 
3.8圖像可視化77 
3.93D可視化79 
3.9 .1使用rqt_rviz在3D世界中實現數據可視化79 
3.9.2主題與坐標系的關係82 
3.9.3可視化坐標變換82
3.10保存與回放數據83 
3.10.1什麼是消息記錄包文件84 
3.10.2使用rosbag在消息記錄包中記錄數據84 
3.10.3回放消息記錄包文件85 
3.10.4檢查消息記錄包文件的主題和消息86 
3.11應用rqt與rqt_gui插件88 
3.12本章小結88 

第4章在ROS下使用傳感器和執行器90 
4.1使用遊戲桿或遊戲手柄90 
4.1.1joy_node如何發送遊戲桿動作消息91 
4.1.2使用遊戲桿數據在turtlesim中移動海龜92 
4.2使用激光雷達——HokuyoURG—04lx95 
4.2.1了解激光雷達如何在ROS中發送數據96 
4.2.2訪問和修改激光雷達數據98 
4.3使用Kinect傳感器查看3D環境中的對象100 
4.3.1如何發送和查看Kinect數據101 
4.3.2創建使用Kinect的示例102 
4.4使用伺服電動機——Dynamixel104 
4.5使用Arduino添加更多的傳感器和執行器107 
4.6在Arduino上使用超聲波傳感器111 
4.7距離傳感器如何發送消息113 
4.7.1創建使用超聲波的示例113 
4.7.2Xsens如何在ROS中發送數據116 
4.7.3創建使用 Xsens的示例116
4.8使用10自由度低成本慣性測量模組IMU118 
4.8.1下載加速度傳感器庫119 
4.8.2Arduino Nano和10自由度傳感器編程120 
4.8.3創建ROS節點以使用10自由度傳感器數據121 
4.9GPS的使用123 
4.9.1GPS如何發送信息125 
4.9.2創建一個使用GPS的工程實例126 
4.10本章小結127 

第5章計算機視覺128 
5.1連接和運行攝像頭129 
5.1.1FireWire IEEE1394攝像頭129 
5.1.2USB攝像頭133 
5.2使用OpenCV製作USB攝像頭驅動程序134 
5.2.1通過cv_bridge使用OpenCV處理ROS圖像139 
5.2.2使用image transport發布圖像139 
5.2.3在ROS中使用OpenCV140 
5.2.4顯示攝像頭輸入的圖像140 
5.3標定攝像頭141 
5.4ROS圖像管道148 
5.5計算機視覺任務中有用的ROS功能包152 
5.6使用viso2實現視覺里程計153 
5.6.1攝像頭位姿標定154 
5.6.2運行viso2在線演示157 
5.6.3使用低成本雙目攝像頭運行viso2159 
5.7使用RGBD深度攝像頭實現視覺里程計160
5.7.1安裝fovis160 
5.7.2用KinectRGBD深度攝像頭運行fovis160 
5.8計算兩幅圖像的單應性161 
5.9本章小結162 

第6章點雲163 
6.1理解點雲庫163 
6.1.1不同的點雲類型
6.1. 2PCL中的算法
6.1.3ROS的PCL接口
6.2我的第一個PCL程序
6.2.1創建點雲
6.2.2加載和保存點雲到硬盤
6.2.3可視化點雲
6.2.4濾波和縮減採樣
6.2.5配準與匹配
6.2.6點雲分區
6.3分割
6.4本章小結

第7章3D建模與仿真
7.1在ROS中自定義機器人的3D模型
7.2創建第一個URDF文件
7.2.1解釋文件格式
7.2.2在rviz裡查看3D模型
7.2.3加載網格到機器人模型
7.2.4使機器人模型運動
7.2.5物理屬性和碰撞屬性
7.3xacro——一個更好的機器人建模方法
7.3.1使用常量
7.3.2使用數學方法
7.3.3使用宏
7.3.4使用代碼移動機器人
7.3.5使用SketchUp進行3D建模
7.4在ROS中仿真
7.4.1在Gazebo中使用URDF 3D模型
7.4.2在Gazebo中添加傳感器
7.4.3在Gazebo中加載和使用地圖
7.4.4在Gazebo中移動機器人
7.5本章小結

第8章導航功能包集入門
8.1ROS導航功能包集
8.2創建變換
8.2.1創建廣播機構
8.2.2創建偵聽器
8.2.3查看坐標變換樹
8.3發布傳感器信息
8.4發布里程數據信息
8.4. 1Gazebo如何獲取里程數據
8.4.2創建自定義里程數據
8.5創建基礎控制器
8.5.1使用Gazebo創建里程數據
8.5.2創建自己的基礎控制器
8.6使用ROS創建地圖
8.6.1使用map_server保存地圖
8.6.2使用map_server加載地圖
8.7本章小結

第9章導航功能包集進階
第10章使用Movelt!