1. 程式人生 > >ROS學習第四彈 (ROS編輯器及配置/ROS msg/srv 訊息和服務)

ROS學習第四彈 (ROS編輯器及配置/ROS msg/srv 訊息和服務)

一.ROS專用編輯器rosed的使用

1.1 rosed使用

rosed是rosbash的一部分,這個工具可以通過包名直接編輯包中的一個檔案而不需要列印整個包的路徑,使用格式:

rosed [package_name] [filename]

例:rosed roscpp Logger.msg

如果出現:

說明,vim沒有安裝,裝一下:sudo apt-get install vim 即可使用,用這個工具需要有Vim基礎

2.2 用tab鍵編輯一個包下的所有檔案

rosed [package_name] <tab><tab>

連按兩下TAB鍵可以列出所有的備選項

2.3 Editor

rosed 的預設編輯器是vim,我們可以自己設定自己喜歡的編輯器,設定為nano:

export EDITOR='nano -w'

設定為emacs:

export EDITOR='emacs -nw'

使用上面的設定只會在當前終端有效,永久更改:echo "export EDITOR='emacs -nw'" >> ~/.bashrc

可以用:echo $EDITOR來檢視當前編輯器版本

三.建立一個ROS msg和srv

3.1 msg和srv介紹

msg:msg檔案是簡單的文字檔案,描述了ROS message的變數(fields/資料)。msg的作用是讓不同語言寫的程式碼生成messages

srv:srv檔案描述麗一個service的資料,由兩個部分組成,請求部分和響應部分。

msg檔案儲存在包的msg目錄下,srv檔案儲存在包的srv目錄下。

msgs是簡單的文字檔案,每一行是一個變數型別和變數名,這些變數名可以是:

int8,int16,int32,int64

float32,float64

string

time,duration

othre msg files

variable-length array[] and fixed-length array[C]

在ROS中還有一種特殊的資料型別:Header.它包含的是一個時間戳和一個迪卡爾座標資訊,通常在一個msg的檔案的頭一行都有一個Header資料。

以下是一個msg檔案的例子:(最後兩行是msgs變數)

Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist

srv檔案和msg檔案類似,只是srv檔案 有兩個部分:request和reponse,兩個部分用'---'分割,一個例子:

int64 A
int64 B
---

int64 sum

上例中,A和B是rquest,sum是reponse

3.2 msg

3.2.1 建立一個msg

在先前建立的包中定義一個新的msg:

cd ~/catkin_ws/src/beginner_tutorials

mkdir msg

echo "int64 num" > msg/Num.msg

這樣就往msg包中寫入了一個int64的變數,當然,也可以建立更多更復雜的 元素:

string first_name

string last_name

uint8 age

uint 32 score

然後需要確認msg檔案已經被翻譯成C++/Python或其他語言程式碼

需要做一些工作:

a.開啟package.xml,新增如下兩行:

<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>

b.開啟CMakeLists.txt。將message_generation依賴加入find_package中,這樣執行你生成messages.find_package已經在CMakeLists.txt中,

那麼只需要在find_package中加上message_generation即可:

有時不呼叫find_package中的所有依賴也能成功編譯你的公程,但是這是因為catkin把所有的projects編譯成一個find_package,而之前的包呼叫了

find_package,如果以前的包沒呼叫,那麼就可能導致編譯失敗。

c.同樣是在CMakeList.txt中,將message_runtime依賴加入catkin_package中:

d.找到以下程式碼塊,將註釋符去掉:

並將其中的message改為所之前寫的Message:

e.確認generate_message()已經被呼叫,找到程式碼塊:

去掉註釋:

此時也可以直接跳過第3.3,3.4進行第五節的聯絡。

3.3 使用rosmsg

使用rosmsg 的前提是已經建立了一個msg,使用格式:

$ rosmsg show [message type]
例:
rosmsg show beginner_tutorials/Num
(我在這個地方遇到了跳出找不到的情況,然後roscd找不到路徑,原因是環境變量出錯,

解決辦法:export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH,沒遇到可以不用管)

如果你不確定這個msg的位置,可以使用:

rosmsg show Num
3.4 使用srv

3.4.1建立一個srv

roscd beginner_tutorials

mkdir srv

然後從另一個包裡拷貝一個已經存在的srv檔案,拷貝格式:roscp [package_name] [file_to_copy_path] [copy_path]

具體命令:

roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

此時,與建立msg的步驟相似,需要進行以下幾步:

a.在CMakeList.txt中的find_package中新增message_generation之前建立msg時已經新增過,此處可以不再重複;

而需要修改程式碼塊:

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )
去掉註釋並替換為:
add_service_files(
  FILES
  AddTwoInts.srv
)

b.在package.xml中需要新增:

 <build_depend>message_generation</build_depend>
  <exec_depend>message_runtime</exec_depend>
需要注意的是,這與之前msg新增的是不一樣的;

3.4.2 使用rossrv

格式:

rossrv show <service type>
例:
rossrv show beginner_tutorials/AddTwoInts
同樣的,如果不確定包名,可以使用:
rossrv show AddTwoInts
此時,可以看見:

 AddTwoInts
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum

3.5 msg和srv的通用使用步驟:

除非以前做過,否則必須先對CMakeList.txt做以下修改:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )
去掉註釋,並且增加包含使用的msg所依賴的包,例如:
generate_messages(
  DEPENDENCIES
  std_msgs
)
然後我們可以在我們的包裡新建msg和srv了:
# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -
(在此時遇到一個run_depend的錯誤,解決方法參考:http://blog.csdn.net/zzmj_f/article/details/78417223)

之後,catkin_make會將相應的位置,檔案在msg資料夾中編譯出所支援語言的程式碼,分別是python,C++,lisp:

C++ message的標頭檔案在:~/catkin_ws/devel/include/beginner_tutorials/.

Python 的指令碼檔案在:~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg.

lisp檔案在:~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/.

相似的,srv檔案也會產生響應的支援的程式碼在各自的目錄下,C++標頭檔案位置與msg檔案一樣,而python與lisp的檔案和msg資料夾同級

可以自己找一下這些檔案,開啟看一下。

關於更加詳細的msg的建立及語法,可檢視:http://wiki.ros.org/action/show/msg?action=show&redirect=ROS%2FMessage_Description_Language

如果是用新的message比編譯了一個C++節點節點,那麼你還需要在你的節點和message間申明依賴,具體參照:http://docs.ros.org/latest/api/catkin/html/howto/format2/building_msgs.html

3.6 獲取幫助

如果對於ROS命令還有不清楚的地方,可以使用 rosmsg -h的方法獲取幫助:

rosmsg is a command-line tool for displaying information about ROS Message types.

Commands:
    rosmsg show    Show message description
    rosmsg info    Alias for rosmsg show
    rosmsg list    List all messages
    rosmsg md5    Display message md5sum
    rosmsg package    List messages in a package
    rosmsg packages    List packages that contain messages

Type rosmsg <command> -h for more detailed usage
3.7 複習

回顧一下這一章都講了什麼:

rospack = ros + pack(age):提供和ROS包相關的資訊

roscd = ros + cd :將當前目錄定位到ROS包的位置

rosls = ros + ls :列出ROS包的子檔案

roscp = ros +cp : 從另一個ROS包中複製檔案

rosmsg = ros + msg : 提供和相關的ROS message的定義

rossrv = ros + srv :提和相關的ROS service之間的定義

catkin_make: 編譯一個ROS包,不過這個命令是在使用工作空間catkin時使用

對應在不使用catkin工作空間時,可以使用:rosmake = ros + make :編譯一個ROS包

下一步學習用python或C++寫釋出和訂閱(Publisher and Subscriber)