乾貨在最後或者另一篇博客https://mp.csdn.net/postedit/102992022
小白開始學習,來自官網或者他人博客歡迎指正。
0.安裝ROS和配置ROS環境
安裝ROS通過官網,如果新手可以考慮安裝完整的,免得以後需要繼續安裝。
sudo apt-get install ros-kinetic-desktop-full
如果從apt這樣的包管理器安裝ROS,那麼這些包將不能被寫訪問,也不應該被用戶編輯。當從源代碼使用ROS包或創建新的ROS包時,您應該始終在您有權訪問的目錄中工作,比如您的主文件夾。
管理環境:
在ROS的安裝過程中,將看到提示從幾個setup.*sh文件中選擇一個作爲源,甚至將此“源”添加到shell啓動腳本中。這是必需的,因爲ROS依賴於使用shell環境組合空間的概念。這使得針對不同版本的ROS或針對不同的包集進行開發變得更加容易。
如果在查找或使用ROS包時遇到問題,確保環境設置正確。檢查的一個好方法是確保設置了諸如ROS_ROOT和ROS_PACKAGE_PATH之類的環境變量:
$ printenv | grep ROS
輸出:
ROS_ROOT=/opt/ros/kinetic/share/ros
ROS_PACKAGE_PATH=/home/chen/mycatkin/src:/home/chen/px4_ws/src:/home/chen/catkin_ws/src/mavlink:/home/chen/catkin_ws/src/mavros/libmavconn:/home/chen/catkin_ws/src/mavros/mavros_msgs:/home/chen/catkin_ws/src/mavros/mavros:/home/chen/catkin_ws/src/mavros/mavros_extras:/home/chen/catkin_ws/src/mavros/test_mavros:/opt/ros/kinetic/share
ROS_MASTER_URI=http://localhost:11311
ROS_VERSION=1
ROSLISP_PACKAGE_DIRECTORIES=/home/chen/mycatkin/devel/share/common-lisp:/home/chen/px4_ws/devel/share/common-lisp:/home/chen/catkin_ws/devel/share/common-lisp
ROS_DISTRO=kinetic
ROS_ETC_DIR=/opt/ros/kinetic/etc/ros
如果沒有顯示,需要source~一下.bash,但只能在該shell窗口訪問ROS命令。
$ source /opt/ros/kinetic/setup.bash
或者將該行加入系統.bashrc,可以不必在每個shell窗口中使用source~
1.ROS系統命令學習(來自:http://blog.sina.com.cn/s/blog_661159d50100och4.html)
參考ROS官網:http://www.ros.org/wiki/ROS/Tutorials/NavigatingTheFilesystem
2.創建新的工作空間(kinetic)
$ source /opt/ros/kinetic/setup.bash //配置環境。假設已經安裝catkin,並且是在kinetic中通過apt-get的形式安裝的catkin
創建工作空間:
$ mkdir -p ~/mycatkin/src //這裏將新創建的工作空間命名爲mycatkin $ cd ~/catkin_ws/ $ catkin_make //編譯工作空間,自動生成build和devel目錄,並在src目錄中生成一個CMakelists.txt。在devel中有許多setup.*bash文件,source這些文件可以將此工作空間覆蓋在環境之上。
$ source devel/setup.bash //在新創建的工作空間目錄下執行該操作,確保安裝腳本正確地覆蓋該工作空間,確保ROS_PACKAGE_PATH環境變量包含您所在的目錄。
$ echo $ROS_PACKAGE_PATH /home/youruser/catkin_ws/src:/opt/ros/kinetic/share
echo $ROS_PACKAGE_PATH /home/chen/mycatkin/src:/opt/ros/kinetic/share
接下來將繼續如何使用工作空間。
3.創建簡單的ROS package
<package>
<description brief="beginner_tutorials"> beginner_tutorials </description>
<author>root</author>
<license>BSD</license>
<review status="unreviewed" notes=""/>
<url>http://ros.org/wiki/beginner_tutorials</url>
<depend package="std_msgs"/>
<depend package="rospy"/>
<depend package="roscpp"/>
</package>
The solution is before to do the command:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
We need to be located in : ~/catkin_ws/src
For some reason I was in ~/catkin_ws and thought it was the right place to create the Package.
前面我們用roscreate-pkg建立package,這裏我們根據系統關聯來編譯這些packages.
以下內容翻譯自官網:https://wiki.ros.org/ROS/Tutorials/BuildingPackages
catkin_make是一個命令行工具,它爲標準的catkin工作流增加了一些便利。您可以想象catkin_make將對cmake的調用與標準cmake工作流中的make結合起來:
# In a catkin workspace $ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
對於不熟悉標準CMake工作流程的人,可以將其分解如下:
注意:如果您運行以下命令,它將不工作,因爲這只是一個例子,如何CMake一般工作。
# In a CMake project $ mkdir build $ cd build $ cmake .. $ make $ make install # (optionally)
此過程針對每個CMake項目運行。相反,catkin項目可以在工作區中一起構建。在工作空間中構建0到多個catkin包遵循以下工作流程:
# In a catkin workspace $ catkin_make $ catkin_make install # (optionally)
以上命令將構建在src文件夾中找到的所有catkin項目。如果你的源代碼在不同的地方,如my_src,然後你會調用catkin_make這樣:
注意:如果您運行以下命令,它將無法工作,因爲目錄my_src不存在。
# In a catkin workspace $ catkin_make --source my_src $ catkin_make install --source my_src # (optionally)
For more advanced uses of catkin_make see the documentation: catkin/commands/catkin_make
建立自己的package
如果您正在使用此頁面構建自己的代碼,請參閱後面的教程(c++)/(Python),因爲您可能需要修改CMakeLists.txt。
你應該已經有了一個catkin工作空間和一個名爲beginner_tutorials的新catkin包,它來自於前面的教程,創建了一個包。如果你還沒有進入catkin的工作空間,請進入src文件夾:
#$ cd ~/catkin_ws/ $ cd ~/mycatkin/ //這是我自己創建的工作空間名字 $ ls src
顯示:
beginner_tutorials CMakeLists.txt
您應該看到有一個名爲beginner_tutorials的文件夾,它是您在前面的教程中使用catkin_create_pkg創建的。我們現在可以使用catkin_make來構建這個包:
$ catkin_make //在工作空間目錄下,會自動對src目錄下編譯
編譯結果不報錯即成功:
chen@chen:~/mycatkin$ catkin_make
Base path: /home/chen/mycatkin
Source space: /home/chen/mycatkin/src
Build space: /home/chen/mycatkin/build
Devel space: /home/chen/mycatkin/devel
Install space: /home/chen/mycatkin/install
####
#### Running command: "cmake /home/chen/mycatkin/src -DCATKIN_DEVEL_PREFIX=/home/chen/mycatkin/devel -DCMAKE_INSTALL_PREFIX=/home/chen/mycatkin/install -G Unix Makefiles" in "/home/chen/mycatkin/build"
####
-- Using CATKIN_DEVEL_PREFIX: /home/chen/mycatkin/devel
-- Using CMAKE_PREFIX_PATH: /home/chen/mycatkin/devel;/home/chen/px4_ws/devel;/home/chen/catkin_ws/devel;/opt/ros/kinetic
-- This workspace overlays: /home/chen/mycatkin/devel;/home/chen/px4_ws/devel;/home/chen/catkin_ws/devel;/opt/ros/kinetic
-- Using PYTHON_EXECUTABLE: /usr/bin/python
-- Using Debian Python package layout
-- Using empy: /usr/bin/empy
-- Using CATKIN_ENABLE_TESTING: ON
-- Call enable_testing()
-- Using CATKIN_TEST_RESULTS_DIR: /home/chen/mycatkin/build/test_results
-- Found gmock sources under '/usr/src/gmock': gmock will be built
-- Found gtest sources under '/usr/src/gmock': gtests will be built
-- Using Python nosetests: /usr/bin/nosetests-2.7
-- catkin 0.7.18
-- BUILD_SHARED_LIBS is on
-- BUILD_SHARED_LIBS is on
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- ~~ traversing 1 packages in topological order:
-- ~~ - beginner_tutorials
-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-- +++ processing catkin package: 'beginner_tutorials'
-- ==> add_subdirectory(beginner_tutorials)
-- Configuring done
-- Generating done
-- Build files have been written to: /home/chen/mycatkin/build
####
#### Running command: "make -j4 -l4" in "/home/chen/mycatkin/build"
####
注意,catkin_make首先顯示它爲每個“空間”使用的路徑。這些空間在REP128和關於catkin工作空間的wiki: catkin/workspaces文檔中進行了描述。需要注意的重要一點是,由於這些默認值,在catkin工作區中創建了幾個文件夾。看看ls:
chen@chen:~/mycatkin$ ls
build devel src
build文件夾是構建空間的默認位置,是調用cmake和make來配置和構建包的地方。devel文件夾是devel空間的默認位置,在安裝包之前,devel空間是您的可執行文件和庫所在的位置。
現在您已經構建了ROS包,讓我們進一步討論ROS節點。
5.創建ROS msg 和 srv
參考網址:http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv
msg文件包括以上幾種類型:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
上面的示例.msg文件只包含一行。當然,您可以通過添加多個元素來創建更復雜的文件,每行一個元素,如下所示:
string first_name string last_name uint8 age uint32 score
不過,還有一步。我們需要確保msg文件被轉換成c++、Python和其他語言的源代碼:
打開package.xml,並確保這兩行是在它裏面和未註釋:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
注意,在構建時,我們需要“message_generation”,而在運行時,我們只需要“message_runtime”。
在您喜歡的文本編輯器中打開CMakeLists.txt(前一篇教程中的rosed是一個不錯的選擇)。
將message_generation依賴項添加到find_package調用中,該調用已經存在於您的CMakeLists.txt中,以便您可以生成消息。您可以通過簡單地將message_generation添加到組件列表中來實現這一點,如下所示:
# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis 不要只是將其添加到您的CMakeLists.txt中,修改現有的文本,在右括號之前添加message_generation find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
您可能會注意到,有時即使沒有使用所有依賴項調用find_package,項目構建也很好。這是因爲catkin將您的所有項目組合到一個項目中,所以如果前面的項目調用find_package,則您的項目將配置相同的值。但是忘記調用意味着您的項目在單獨構建時很容易中斷。-->啥子意思?
還要確保導出消息運行時依賴項。
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
找到以下代碼塊:
# add_message_files( # FILES # Message1.msg # Message2.msg # )
通過刪除#符號取消註釋,然後用your .msg替換Message*.msg文件,這樣它看起來像這樣:
add_message_files( FILES Num.msg )
通過手動添加your.msg文件,我們可以確保CMake知道在您添加其他.msg文件之後何時需要重新配置項目。
現在我們必須確保調用了generate_messages()函數。
對於ROS Hydro及以後的版本,您需要取消註釋這些行:
# generate_messages( # DEPENDENCIES # std_msgs # )
像這樣:
generate_messages( DEPENDENCIES std_msgs )
現在可以從msg定義生成源文件了。如果您現在想這樣做,請跳過下面的小節,轉到msg和srv的常用步驟。
使用rosmsg
這就是創建.msg所需要做的全部工作。讓我們確保ROS可以使用rosmsg show命令查看它。
$ rosmsg show [message type]
例如:
$ rosmsg show beginner_tutorials/Num
輸出:
int64 num
在前面的例子中,消息類型由兩部分組成:
beginner_tutorials——定義消息的包
Num——msg Num的名稱。
如果您不記得.msg在哪個包中,您可以省略包名。試一試:
$ rosmsg show Num
輸出:
[beginner_tutorials/Num]:
int64 num
使用 srv
讓我們使用我們剛剛創建的包來創建一個srv:
$ roscd beginner_tutorials $ mkdir srv
我們將從另一個包中複製一個現有的srv定義,而不是手工創建一個新的srv定義。
爲此,roscp是一個有用的命令行工具,用於將文件從一個包複製到另一個包。
$ roscp [package_name] [file_to_copy_path] [copy_path]
現在我們可以從rospy_tutorials包複製一個服務:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
不過,還有一步。我們需要確保srv文件被轉換成c++、Python和其他語言的源代碼。
除非你已經這樣做了,否則打開package.xml,並確保這兩行是在它和未註釋:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
和前面一樣,注意在構建時,我們需要“message_generation”,而在運行時,我們只需要“message_runtime”。
除非您已經在前面的步驟中爲消息做了這樣的操作,否則添加message_generation依賴項來在CMakeLists.txt中生成消息:
# Do not just add this line to your CMakeLists.txt, modify the existing line find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
(儘管名爲message_generation,但它同時適用於msg和srv。)
對於服務和消息,您需要對package.xml進行相同的更改,因此請查看上面的附加依賴項。(修正一下,這裏是在CMakelists.txt中更改的)
刪除#來取消以下行的註釋:
# add_service_files( # FILES # Service1.srv # Service2.srv # )
現在可以從服務定義生成源文件了。如果您現在想這樣做,請跳過下面的小節,轉到msg和srv的常用步驟。
使用 rossrv
這就是創建srv所需要做的全部工作。讓我們確保ROS可以使用rossrv show命令查看它。
$ rossrv show <service type>
例如:
$ rossrv show beginner_tutorials/AddTwoInts
輸出:
int64 a
int64 b
---
int64 sum
與rosmsg類似,您可以找到這樣的服務文件,而不需要指定包的名稱:
$ rossrv show AddTwoInts [beginner_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum [rospy_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum
這裏顯示了兩個服務。第一個是您剛剛在beginner_tutorials包中創建的,第二個是rospy_tutorials包中預先存在的。
msg和srv的常用步驟
除非您在前面的步驟中已經這樣做了,否則更改CMakeLists.txt。:
# generate_messages( # DEPENDENCIES # # std_msgs # Or other packages containing msgs # )
取消註釋並添加您所依賴的包含消息使用的.msg文件的任何包(在本例中爲std_msgs),使它看起來像這樣:
generate_messages( DEPENDENCIES std_msgs )
現在我們已經做了一些新的消息,我們需要再次使我們的包:
# In your catkin workspace $ roscd beginner_tutorials $ cd ../.. $ catkin_make install $ cd -
msg目錄中的任何.msg文件都將生成用於所有受支持語言的代碼。c++消息頭文件將在~/catkin_ws/devel/include/beginner_tutorials/中生成。Python腳本將在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg中創建。lisp文件出現在~/catkin_ws/devel/share/ commonlisp /ros/beginner_tutorials/msg/中。
類似地,srv目錄中的任何.srv文件都將以支持的語言生成代碼。對於c++,這將在與消息頭文件相同的目錄中生成頭文件。對於Python和Lisp,在“msg”文件夾旁邊會有一個“srv”文件夾。
消息格式的完整規範可從消息描述語言頁面獲得。
如果要構建使用新消息的c++節點,還需要聲明節點和消息之間的依賴關係,如catkin msg/srv構建文檔中所述。
尋求幫助
我們已經看到了不少ROS工具。跟蹤每個命令需要的參數可能比較困難。幸運的是,大多數ROS工具都提供了它們自己的幫助。
$ rosmsg -h
可以看到一個列表不同的rosmsg子命令
Commands: rosmsg show Show message description rosmsg list List all messages rosmsg md5 Display message md5sum rosmsg package List messages in a package rosmsg packages List packages that contain messages
也可以從子命令中獲得幫助:
$ rosmsg show -h
這顯示了rosmsg show需要的參數:
Usage: rosmsg show [options] <message type> Options: -h, --help show this help message and exit -r, --raw show raw message text, including comments
回顧
1. 一些常用命令組合:
rospack = ros+pack(age): 提供與ros包相關的信息
roscd = ros+cd: 將目錄更改爲ros包或堆棧
rosls = ros+ls: 列出ros包中的文件
roscp = ros+cp: 從ros包中複製文件
rosmsg = ros+msg: 提供與ros消息定義相關的信息
rossrv = ros+srv:提供與ros服務定義相關的信息
catkin_make:生成(編譯)一個ROS包
rosmake = ros+make:編譯ros包(如果不使用catkin工作區)
2.這篇主要講如何創建新的工作空間/mycatkin,在工作空間建立自己的ROS包/beginner_tutorials,然後在包/beginner_tutorials裏定義消息msg和服務srv。
(1)創建工作空間:
$ source /opt/ros/kinetic/setup.bash //配置環境。假設已經安裝catkin,並且是在kinetic中通過apt-get的形式安裝的catkin
$ mkdir -p ~/mycatkin/src //這裏將新創建的工作空間命名爲mycatkin $ cd ~/catkin_ws/ $ catkin_make //編譯工作空間,這裏可能涉及到源碼放在不同目錄下,如my_src,如何編譯,可以往上翻 //編譯工作空間,自動生成build和devel目錄,並在src目錄中生成一個CMakelists.txt。在devel中有許多setup.*bash文件,source這些文件可以將此工作空間覆蓋在環境之上。
(2)將工作空間加入ROS環境中
$ source devel/setup.bash
//在新創建的工作空間目錄下執行該操作,確保安裝腳本正確地覆蓋該工作空間,確保ROS_PACKAGE_PATH環境變量包含 您所在的目錄。(或者直接在.bashrc中寫入配置路徑,不用每次開一個新終端都需要手動輸入)
(3)建立自己的ROS包
再囉嗦一下:ROS的軟件以Package的方式組織起來。package包含節點(Node)、ROS依賴庫、數據套、配置文件、第三方軟件、或者任何其他邏輯構成。package的目標是提供一種易於使用的結構以便於軟件的重複使用。總得來說,ROS的package遵從Goldilocks原則:短小精幹。所有的ROS packages包括很多類似的文件:manifests, CMakeLists.txt, mainpage.dox, 和Makefiles.
a. 使用工具,例如roscreate-pkg(也可以使用其他工具,以後在慢慢研究)
$ roscreate-pkg [package_name]
The solution is before to do the command:
$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
We need to be located in : ~/catkin_ws/src
For some reason I was in ~/catkin_ws and thought it was the right place to create the Package.
前面用roscreate-pkg建立package,這裏我們根據系統關聯來編譯這些packages.
catkin_make是一個命令行工具,它爲標準的catkin工作流增加了一些便利。您可以想象catkin_make將對cmake的調用與標準cmake工作流中的make結合起來:
# In a catkin workspace $ catkin_make [make_targets] [-DCMAKE_VARIABLES=...]
以上命令將構建在src文件夾中找到的所有catkin項目。如果你的源代碼在不同的地方,如my_src,然後你會調用catkin_make這樣:
注意:如果您運行以下命令,它將無法工作,因爲目錄my_src不存在。
# In a catkin workspace $ catkin_make --source my_src $ catkin_make install --source my_src # (optionally)
e. 查看建立的package
如果您正在使用此頁面構建自己的代碼,請參閱後面的教程(c++)/(Python),因爲您可能需要修改CMakeLists.txt。
你應該已經有了一個catkin工作空間和一個名爲beginner_tutorials的新catkin包,它來自於前面的教程,創建了一個包。如果你還沒有進入catkin的工作空間,請進入src文件夾:
#$ cd ~/catkin_ws/ $ cd ~/mycatkin/ //這是我自己創建的工作空間名字 $ ls src
顯示:
beginner_tutorials CMakeLists.txt
(4). 在自己的ROS包中創建ROS msg 和 srv
參考網址:http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv
msg文件包括以上幾種類型:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
上面的示例.msg文件只包含一行。當然,您可以通過添加多個元素來創建更復雜的文件,每行一個元素,如下所示:
string first_name string last_name uint8 age uint32 score
不過,還有一步。我們需要確保msg文件被轉換成c++、Python和其他語言的源代碼:(這裏也可以在創建完服務srv後再添加也可以)
打開package.xml,並確保這兩行是在它裏面和未註釋:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
注意,在構建時,我們需要“message_generation”,而在運行時,我們只需要“message_runtime”。
將message_generation依賴項添加到find_package調用中,該調用已經存在於您的CMakeLists.txt中,以便您可以生成消息。您可以通過簡單地將message_generation添加到組件列表中來實現這一點,如下所示:
# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis 不要只是將其添加到您的CMakeLists.txt中,修改現有的文本,在右括號之前添加message_generation find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
您可能會注意到,有時即使沒有使用所有依賴項調用find_package,項目構建也很好。這是因爲catkin將您的所有項目組合到一個項目中,所以如果前面的項目調用find_package,則您的項目將配置相同的值。但是忘記調用意味着您的項目在單獨構建時很容易中斷。-->啥子意思?
還要確保導出消息運行時依賴項。(沒找到,尷尬)
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
找到以下代碼塊:(/beginner_tutorials/CMakelists.txt)
# add_message_files( # FILES # Message1.msg # Message2.msg # )
通過刪除#符號取消註釋,然後用your .msg替換Message*.msg文件,這樣它看起來像這樣:
add_message_files( FILES Num.msg )
通過手動添加your.msg文件,我們可以確保CMake知道在您添加其他.msg文件之後何時需要重新配置項目。
現在我們必須確保調用了generate_messages()函數。
對於ROS Hydro及以後的版本,您需要取消註釋這些行:
# generate_messages( # DEPENDENCIES # std_msgs # )
像這樣:
generate_messages( DEPENDENCIES std_msgs )
現在可以從msg定義生成源文件了。
使用rosmsg
這就是創建.msg所需要做的全部工作。讓我們確保ROS可以使用rosmsg show命令查看它。
$ rosmsg show [message type]
例如:
$ rosmsg show beginner_tutorials/Num
輸出:
int64 num
在前面的例子中,消息類型由兩部分組成:
beginner_tutorials——定義消息的包
Num——msg Num的名稱。
如果您不記得.msg在哪個包中,您可以省略包名。試一試:
$ rosmsg show Num
輸出:
[beginner_tutorials/Num]:
int64 num
使用 srv
讓我們使用我們剛剛創建的包來創建一個srv:
$ roscd beginner_tutorials $ mkdir srv
我們將從另一個包中複製一個現有的srv定義,而不是手工創建一個新的srv定義。
爲此,roscp是一個有用的命令行工具,用於將文件從一個包複製到另一個包。
$ roscp [package_name] [file_to_copy_path] [copy_path]
現在我們可以從rospy_tutorials包複製一個服務:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
不過,還有一步。我們需要確保srv文件被轉換成c++、Python和其他語言的源代碼。(之前添加過不用重複添加)
除非你已經這樣做了,否則打開package.xml,並確保這兩行是在它和未註釋:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
和前面一樣,注意在構建時,我們需要“message_generation”,而在運行時,我們只需要“message_runtime”。
除非您已經在前面的步驟中爲消息做了這樣的操作,否則添加message_generation依賴項來在CMakeLists.txt中生成消息:(前面操作過就不用再重複)
# Do not just add this line to your CMakeLists.txt, modify the existing line find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation )
(儘管名爲message_generation,但它同時適用於msg和srv。)
對於服務和消息,您需要對package.xml進行相同的更改,因此請查看上面的附加依賴項。(修正一下,這裏是在CMakelists.txt中更改的)
刪除#來取消以下行的註釋:
# add_service_files( # FILES # Service1.srv # Service2.srv # )
現在可以從服務定義生成源文件了。如果您現在想這樣做,請跳過下面的小節,轉到msg和srv的常用步驟。
使用(查看) rossrv
以上完成創建srv所需要做的全部工作。讓我們確保ROS可以使用rossrv show命令查看它。
$ rossrv show <service type>
例如:
$ rossrv show beginner_tutorials/AddTwoInts
輸出:
int64 a
int64 b
---
int64 sum
與rosmsg類似,您可以找到這樣的服務文件,而不需要指定包的名稱:
$ rossrv show AddTwoInts [beginner_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum [rospy_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum
這裏顯示了兩個服務。第一個是您剛剛在beginner_tutorials包中創建的,第二個是rospy_tutorials包中預先存在的。
msg和srv的常用步驟
除非您在前面的步驟中已經這樣做了,否則更改CMakeLists.txt。:
# generate_messages( # DEPENDENCIES # # std_msgs # Or other packages containing msgs # )
取消註釋並添加您所依賴的包含消息使用的.msg文件的任何包(在本例中爲std_msgs),使它看起來像這樣:
generate_messages( DEPENDENCIES std_msgs )
現在我們已經做了一些新的消息,我們需要再次使我們的包:
# In your catkin workspace $ roscd beginner_tutorials $ cd ../.. $ catkin_make install $ cd -
msg目錄中的任何.msg文件都將生成用於所有受支持語言的代碼。c++消息頭文件將在~/catkin_ws/devel/include/beginner_tutorials/中生成。Python腳本將在~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg中創建。lisp文件出現在~/catkin_ws/devel/share/ commonlisp /ros/beginner_tutorials/msg/中。
類似地,srv目錄中的任何.srv文件都將以支持的語言生成代碼。對於c++,這將在與消息頭文件相同的目錄中生成頭文件。對於Python和Lisp,在“msg”文件夾旁邊會有一個“srv”文件夾。
消息格式的完整規範可從消息描述語言頁面獲得。
如果要構建使用新消息的c++節點,還需要聲明節點和消息之間的依賴關係,如catkin msg/srv構建文檔中所述。
尋求幫助
我們已經看到了不少ROS工具。跟蹤每個命令需要的參數可能比較困難。幸運的是,大多數ROS工具都提供了它們自己的幫助。
$ rosmsg -h
可以看到一個列表不同的rosmsg子命令
Commands: rosmsg show Show message description rosmsg list List all messages rosmsg md5 Display message md5sum rosmsg package List messages in a package rosmsg packages List packages that contain messages
也可以從子命令中獲得幫助:
$ rosmsg show -h
這顯示了rosmsg show需要的參數:
Usage: rosmsg show [options] <message type> Options: -h, --help show this help message and exit -r, --raw show raw message text, including comments