寫在前面
我在CSDN上寫了一套關(guān)于ros基礎(chǔ)的圖文教程,歡迎關(guān)注!!!
ROS的工程結(jié)構(gòu)(文件系統(tǒng))

1. catkin編譯的工作流程如下:
- 首先在工作空間catkin_ws/src/下遞歸的查找其中每一個(gè)ROS的package。
- package中會有package.xml和CMakeLists.txt文件,Catkin(CMake)編譯系統(tǒng)依據(jù)CMakeLists.txt文件,從而生成makefiles(放在catkin_ws/build/)。
- 然后make剛剛生成的makefiles等文件,編譯鏈接生成可執(zhí)行文件(放在catkin_ws/devel)。
詳細(xì)解釋相關(guān)包內(nèi)容:
- src/: ROS的catkin軟件包(源代碼包)
- build/: catkin(CMake)的緩存信息和中間文件
- devel/: 生成的目標(biāo)文件(包括頭文件,動態(tài)鏈接庫,靜態(tài)鏈接庫,可執(zhí)行文件等)、環(huán)境變量
2. 使用catkin_make進(jìn)行編譯
要用catkin編譯一個(gè)工程或軟件包,只需要用catkin_make指令。一般當(dāng)我們寫完代碼,執(zhí)行一次catkin_make進(jìn)行編譯,調(diào)用系統(tǒng)自動完成編譯和鏈接過程,構(gòu)建生成目標(biāo)文件。編譯的一般性流程如下
$ cd ~/catkin_ws #回到工作空間,catkin_make必須在工作空間下執(zhí)行
$ catkin_make #開始編譯
$ source ~/catkin_ws/devel/setup.bash #刷新壞境
注意: catkin編譯之前需要回到工作空間目錄,catkin_make在其他路徑下編譯不會成功。編譯完成后,如果有新的目標(biāo)文件產(chǎn)生(原來沒有),那么一般緊跟著要source刷新環(huán)境,使得系統(tǒng)能夠找到剛才編譯生成的ROS可執(zhí)行文件。這個(gè)細(xì)節(jié)比較容易遺漏,致使后面出現(xiàn)可執(zhí)行文件無法打開等錯(cuò)誤。
3. package詳解
1) 組織形式
- CMakeLists.txt: 定義package的包名、依賴、源文件、目標(biāo)文件等編譯規(guī)則,是package不可少的成分
- package.xml: 描述package的包名、版本號、作者、依賴等信息,是package不可少的成分
- src/: 存放ROS的源代碼,包括C++的源碼和(.cpp)以及Python的module(.py)
- include/: 存放C++源碼對應(yīng)的頭文件
- scripts/: 存放可執(zhí)行腳本,例如shell腳本(.sh)、Python腳本(.py)
- msg/: 存放自定義格式的消息(.msg)
- srv/: 存放自定義格式的服務(wù)(.srv)
- models/: 存放機(jī)器人或仿真場景的3D模型(.sda, .stl, .dae等)
- urdf/: 存放機(jī)器人的模型描述(.urdf或.xacro)
- launch/: 存放launch文件(.launch或.xml)
通常ROS文件組織都是按照以上的形式,這是約定俗成的命名習(xí)慣,建議遵守。以上路徑中,只有CMakeLists.txt和package.xml是必須的,其余路徑根據(jù)軟件包是否需要來決定。
2) package創(chuàng)建
創(chuàng)建一個(gè)package需要在catkin_ws/src下,用到catkin_create_pkg命令,用法是:
catkin_create_pkg package depends
其中package是包名,depends是依賴的包名,可以依賴多個(gè)軟件包。
Master 節(jié)點(diǎn)管理器
master就像一個(gè)大管家,每個(gè)小弟node想要和其他node交朋友,必須先跟大管家master注冊,注冊之后,兩個(gè)node小弟就可以互相通信了

在開始執(zhí)行ros程序前,第一步是啟動master,命令式roscore, 同時(shí)該命令順帶啟動了其余兩個(gè)東西:

Node節(jié)點(diǎn)
ROS中的節(jié)點(diǎn),通常是按照功能劃分,一個(gè)node實(shí)現(xiàn)某個(gè)指定功能。node就是Ros中進(jìn)程的概念。是包里可執(zhí)行文件(包括c++編譯文件 && .py && .sh文件)運(yùn)行的實(shí)例。
與node相關(guān)的指令如下:
// 啟動node的方法很簡單:
$ rosrun [pkg_name] [node_name]
// 列出當(dāng)前運(yùn)行的node信息
$ rosnode list
// 顯示某個(gè)node的詳細(xì)信息
$ rosnode info [node_name]
// 停止某個(gè)node運(yùn)行
$ rosnode kill [node_name]
Roslaunch
啟動master和多個(gè)node的方法, 正如前文提及到的ros工程目錄中的launch文件夾,沒錯(cuò),下面要啟動運(yùn)行l(wèi)aunch文件的時(shí)候,就是在對應(yīng)pkg文件夾下launch文件夾下的對應(yīng)launch文件。
// 啟動命令如下:
$ roslaunch [pkg_name] [file_name.launch]
-
launch文件寫法
launch文件寫法和pkg文件夾下的package.xml文件寫法類似,都遵循xml文件標(biāo)簽格式,具體如下:
launch文件編寫
ROS下的四種通訊方式
topic通訊
topic是node之間通訊最常見的一種方式,是一種異步通訊方式,兩個(gè)node之間通過publish和subscribe的機(jī)制,進(jìn)行信息交流。
- massage:topic內(nèi)容的數(shù)據(jù)類型,或者稱為topic的格式標(biāo)準(zhǔn),定義在 *.msg文件下
可以認(rèn)為Massage是類的概念,具體通訊過程中的massage屬于對象或者實(shí)例。
該文件存放在pkg/msg文件夾下

很像是在寫函數(shù)中的結(jié)構(gòu)體
- topic和msg相關(guān)指令
// 列出所有的topic
$ rostopic list
// 顯示某個(gè)topic屬性信息
$ rostopic show [/topic_name]
// 顯示某個(gè)topic內(nèi)容
$ rostopic echo [/topic_name]
// 像某個(gè)topic發(fā)布內(nèi)容
$ rostopic pub [topic_name] ...(要發(fā)布的內(nèi)容)
---
// 列出所有的msg
$ rosmsg list
// 顯示某個(gè)msg內(nèi)容
$ rosmsg show [/msg_name]
Service通訊
Ros的同步通信的方式,兩個(gè)node之間通過request/reply方式通信
service沒人調(diào)用的時(shí)候他就不執(zhí)行。

這里需要注意:同步意味著阻塞,就是client端在發(fā)送request之后,會一直等待server回傳reply.


上圖中service應(yīng)答的格式,就一定是個(gè)msg文件了。
具體舉例子如下圖所示:

在編寫完msg和srv文件后要記得一點(diǎn):修改這個(gè)包的xml文件和cmake文件

相關(guān)命令如下:

參數(shù)服務(wù)器 Parameter Service
參數(shù)服務(wù)器本身就是個(gè)字典,我們可以通過以下三種方式對之進(jìn)行讀寫:
-
命令行模式
通過命令行操作參數(shù)服務(wù)器 -
launch文件
launch文件通過標(biāo)簽表示 在.py 和 .cpp文件直接編寫
Action通訊




