ROS的新手教程--學習筆記1

乾貨在最後或者另一篇博客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

 
對於ROS系統,很多代碼關聯於很多的packages和stacks之間,如果用簡單的liunx命令行,比如ls,cd 等,會導致路徑冗長等問題,所以ROS提供了自己的命令行。根據官網,我整理出ROS系統下常用的命令:
 
1,find命令   ----查找相應的package或者stack
用法:
$ rospack find [package name]
$ rosstack find [stack_name]
例子:
$ rospack find roscpp
得到結果:
YOUR_INSTALL_PATH/ros/core/roscpp
 
2,roscd命令 ----改變路徑到相應的package或者stack
用法:
$ roscd [Locationname[/subdir]]
 
(1) 定位到相應的package, stack文件
例子:
$ roscd roscpp
得到結果:
YOUR_INSTALL_PATH/ros/core/roscpp
 
(2) 定位到相應的package,stack文件的字文件
例子:
$ roscd roscpp/include
得到結果:
YOUR_INSTALL_PATH/ros/core/roscpp/include
 
(3) 沒有參數時的roscd
例子:
$ roscd
得到結果:
YOUR_INSTALL_PATH/ros         ----類似於UNIX的pwd
 
(4) roscd日誌  ----得到ROS存儲日誌的文件
$ roscd log
 
3,rosls命令 -----羅列相應的package,stack文件夾的文件
用法:
$ rosls [locationname[/subdir]]
例子:
$ rosls roscpp_tutorials
得到結果:
add_two_ints_client listener_unreliable add_two_ints_server listener_with_tracked_object add_two_ints_server_class listener_with_userdata anonymous_listener Makefile babbler manifest.xml CMakeLists.txt node_handle_namespaces custom_callback_processing notify_connect listener srv listener_async_spin talker listener_multiple time_api listener_single_message timers listener_threaded_spin
 
4,善於用" Tab "鍵
“Tab”鍵,在Windows系統下,功能只是個製表符,但是在Liunx下,這個鍵功能很強大,比如(指在ROS 下)得到整個package名字
例子:
$ roscd roscpp_<<< now push the TAB key >>> --roscpp_tutorials是個很長的名字,可以採用TAB
得到結果:
$ roscd roscpp tutorials/
 
5,ROS 下一些命名規則:
rospack = ros + pack(age)
rosstack = ros + stack
roscd = ros + cd
rosls = ros + ls
 
 

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

ROS的軟件以Package的方式組織起來。package包含節點(Node)、ROS依賴庫、數據套、配置文件、第三方軟件、或者任何其他邏輯構成。package的目標是提供一種易於使用的結構以便於軟件的重複使用。總得來說,ROS的package遵從Goldilocks原則:短小精幹。所有的ROS packages包括很多類似的文件:manifests, CMakeLists.txt, mainpage.dox, 和Makefiles.
         package很容易手工製作,也可使用其他工具,例如roscreate-pkg。ROS的package可以是ROS_ROOT或者ROS_PACKAGE_PATH裏面的一個目錄/文件夾,包含一個manifest.xml文件。package可以是ROSstacks的組成部分。首先我們用roscreate來創建package:
        $ roscreate-pkg [package_name]
這裏我直接引用官網提供的這個例子:---創建beginner_tutorials package,他依賴std_msgs, roscpp, rospy
(1) 利用 rorcreate-pkg 創建 package
$ roscreate-pkg beginner_tutorials std_msgs roscpp rospy
得到結果:
Created package directory /opt/ros/cturtle/ros/beginner_tutorials
Created include directory /opt/ros/cturtle/ros/beginner_tutorials/include/beginner_tutorials
Created cpp source directory /opt/ros/cturtle/ros/beginner_tutorials/src
Created package file /opt/ros/cturtle/ros/beginner_tutorials/Makefile
Created package file /opt/ros/cturtle/ros/beginner_tutorials/manifest.xml
Created package file /opt/ros/cturtle/ros/beginner_tutorials/CMakeLists.txt
Created package file /opt/ros/cturtle/ros/beginner_tutorials/mainpage.dox
 
Please edit beginner_tutorials/manifest.xml and mainpage.dox to finish creating your package
 
最後一句話是說編輯package的清單,這裏我們需要仔細閱讀manifest.xml,所以這裏把生成的manifest.xml貼於下面:

<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>

 
(2) 將該路徑添加到ros系統中(即更新ros查找路徑)
$ export ROS_PACKAGE_PATH=YOUR_BEGINNER_TUTORIALS_PATH:$ROS_PACKAGE_PATH
對於我機子而已,是這樣添加:
$ export ROS_PACKAGE_PATH=./:$ROS_PACKAGE_PATH
然後我確認是否在ROS可以找到:
$ rospack find beginner_tutorials
結果如下:
/opt/ros/cturtle/ros/beginner_tutorials
 
注意注意!!!根據ROS官方的教程創建工作空間後,進入[src]目錄,在其中創建一個名爲“beginner_tutorials”的新程序包,並建立了它的依賴關係。
注意:這裏我的新建工作空間位於/home/chen/mycatkin/src
$ export ROS_PACKAGE_PATH=/home/chen/mycatkin/src:ROS_PACKAGE_PATH
$ rospack find beginner_tutorials
輸出:/home/chen/mycatkin/src/beginner_tutorials
 

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.

之前我把beginner_tutorials包安裝在了/mycatkin目錄下,一直找不到,後來才發現應該在src目錄下創建,上面是谷狗上的。
 
(3) 我們可以查看package相關第一層依賴項
$ rospack depends1 beginner_tutorials  ----package第一層依賴項查詢
結果如下:
std_msgs
rospy
roscpp
 
$ rospack depends1 rospy ----package依賴項rospy的第一層依賴項查詢
結果如下:
roslib
roslang
 
$ rospack depends beginner_tutorials  ---package所有依賴項查詢
genmsg_cpp
rospack
roslib
rosconsole
std_msgs
roslang
rospy
xmlrpcpp
roscpp
 
 
4.建立和編譯package
參考網址:http://www.ros.org/wiki/ROS/Tutorials/BuildingPackages

 前面我們用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節點。


(1)系統關聯
        ROS package有時運行時需要連接外部庫或者可執行程序。這些庫或者程序的連接經常被關聯到系統關聯中。在一些情況下,這些系統關聯不會被默認的安裝,ROS提供了一個簡單的工具--rosdep,用來下載和安裝系統關聯的。
      ROS rospack必須在相應的package manifest申明,參考小海龜的例子,
$ roscd turtlesim
$ cat manifest.xml
 
 

 

5.創建ROS msg 和 srv

參考網址:http://www.ros.org/wiki/ROS/Tutorials/CreatingMsgAndSrv

 
1,msg和srv介紹:
       msg:msg文件是描述ROS 消息的描述文件,是用來爲消息生成不同語言下源代碼。msg文件存儲在該package路徑下的msg文件路徑。

msg文件包括以上幾種類型:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
       srv:srv文件是用來描述服務的,由請求和響反應兩部分組成。srv文件存儲在srv文件路徑。
srv文件就像msg文件,另外還包括請求和響應兩部分,由“----”分開,例如:
int 64 A
int 64 B
---
int64 Sum
其中,A,B是請求者,Sum是響應者。
 
 
2. 創建一個msg
 
例子:
(1) 我們在已經創建好的beginner_tutorials package上創建msg
$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
然後,
$ gedit CMakeLists.txt --打開該package的CMakeList.txt,取消“# rosbuild_genmsg()”前的“#”號。

 


上面的示例.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]

這裏直接引用官網提供的這個例子:---創建beginner_tutorials package,他依賴std_msgs, roscpp, rospy
$ roscreate-pkg beginner_tutorials std_msgs roscpp rospy
得到結果:
Created package directory /opt/ros/cturtle/ros/beginner_tutorials
Created include directory /opt/ros/cturtle/ros/beginner_tutorials/include/beginner_tutorials
Created cpp source directory /opt/ros/cturtle/ros/beginner_tutorials/src
Created package file /opt/ros/cturtle/ros/beginner_tutorials/Makefile
Created package file /opt/ros/cturtle/ros/beginner_tutorials/manifest.xml
Created package file /opt/ros/cturtle/ros/beginner_tutorials/CMakeLists.txt
Created package file /opt/ros/cturtle/ros/beginner_tutorials/mainpage.dox
 
Please edit beginner_tutorials/manifest.xml and mainpage.dox to finish creating your package
 
最後一句話是說編輯package的清單,這裏我們需要仔細閱讀manifest.xml。
 
b. 將該路徑添加到ros系統中(即更新ros查找路徑)
$ export ROS_PACKAGE_PATH=YOUR_BEGINNER_TUTORIALS_PATH:$ROS_PACKAGE_PATH
注意注意!!!根據ROS官方的教程創建工作空間後,進入[src]目錄,在其中創建一個名爲“beginner_tutorials”的新程序包,並建立了它的依賴關係。
 
注意:這裏我的新建工作空間位於/home/chen/mycatkin/src
$ export ROS_PACKAGE_PATH=/home/chen/mycatkin/src:ROS_PACKAGE_PATH
$ rospack find beginner_tutorials
輸出:/home/chen/mycatkin/src/beginner_tutorials
 

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.

之前我把beginner_tutorials包安裝在了/mycatkin目錄下,一直找不到,後來才發現應該在src目錄下創建,上面是谷狗上的。
 
c. 我們可以查看package相關第一層依賴項
$ rospack depends1 beginner_tutorials  ----package第一層依賴項查詢
結果如下:
std_msgs
rospy
roscpp
 
$ rospack depends1 rospy ----package依賴項rospy的第一層依賴項查詢
結果如下:
roslib
roslang
 
$ rospack depends beginner_tutorials  ---package所有依賴項查詢
genmsg_cpp
rospack
roslib
rosconsole
std_msgs
roslang
rospy
xmlrpcpp
roscpp
 
 
d. 建立和編譯package
參考網址:http://www.ros.org/wiki/ROS/Tutorials/BuildingPackages

 前面用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

       a. msg和srv介紹:
       msg:msg文件是描述ROS 消息的描述文件,是用來爲消息生成不同語言下源代碼。msg文件存儲在該package路徑下的msg文件路徑。

msg文件包括以上幾種類型:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
       srv:srv文件是用來描述服務的,由請求和響反應兩部分組成。srv文件存儲在srv文件路徑。
srv文件就像msg文件,另外還包括請求和響應兩部分,由“----”分開,例如:
int 64 A
int 64 B
---
int64 Sum
其中,A,B是請求者,Sum是響應者。
 
b.  創建一個msg
在已經創建好的beginner_tutorials package上創建msg
$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
然後,
$ gedit CMakeLists.txt --打開該package的CMakeList.txt,取消“# rosbuild_genmsg()”前的“#”號。(沒有找到,尷尬)

上面的示例.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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章