ROS學(xué)習(xí)筆記(十二)- 創(chuàng)建一個(gè)ROS msg 和 srv

1 介紹msg和srv

  • msg:描述ROS message的簡(jiǎn)單文本斋攀,用來(lái)生成不同語(yǔ)言的消息源代碼已卷。
  • srv:一個(gè)srv描述一個(gè)service。它有請(qǐng)求和回復(fù)兩部分組成淳蔼。
    msg文件存儲(chǔ)在msg目錄下侧蘸,srv文件存儲(chǔ)在srv目錄下。
    msg只是一種字段類型的簡(jiǎn)單文本和每行一個(gè)字段名鹉梨,可以用的字段是:
  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]
    在ROS里還有一種特殊的類型:Header讳癌,header包含一個(gè)時(shí)間戳和一個(gè)坐標(biāo)框架信息,通常只在ROS里用俯画。你會(huì)頻繁地在msg的第一行看到 Header header析桥。
    下面是一個(gè)msg例子,包含一個(gè)Header艰垂,一個(gè)字符串和兩條其他msg泡仗。
  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

srv跟msg差不多,不過(guò)它包含兩部分猜憎,一部分是請(qǐng)求娩怎,一部分是應(yīng)答,用"-----"分隔開:

int64 A
int64 B
---
int64 Sum

2 使用msg

2.1 建立一個(gè)msg

在之前的包里面建立一個(gè)新的msg.

$ roscd beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg

進(jìn)不去就輸入:
export ROS_PACKAGE_PATH=~/catkin_ws/src:$ROS_PACKAGE_PATH

source ~/catkin_ws/devel/setup.bash
現(xiàn)在msg就有一行了胰柑,我們可以寫的更復(fù)雜一些截亦,一個(gè)占一行:

string first_name
string last_name
uint8 age
uint32 score

還有一步,這一步確保其可以轉(zhuǎn)成C++柬讨,Python或者其他語(yǔ)言:
打開package.xml崩瓤,確保里面有以下兩行:

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

我們現(xiàn)在要編譯,所以我們需要message_generation,運(yùn)行的時(shí)候需要message_runtime踩官。
打開 CMakeLists.txt却桶,在find_package 里面加入*message_generation *:

# Do not just add this to your CMakeLists.txt, modify the existing text to add message_generation before the closing parenthesis
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

其實(shí)即使你沒有配置,有時(shí)候也能正常編譯蔗牡,這是因?yàn)閏atkin會(huì)自動(dòng)用以前的項(xiàng)目的配置颖系,不過(guò)如果隔離編譯就不行了。
確保運(yùn)行時(shí)出口的依賴關(guān)系:

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES beginner_tutorials
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

找到下列代碼:

# add_message_files(
#   FILES
#   Message1.msg
#   Message2.msg
# )

去掉注釋辩越,改成:

add_message_files(
   FILES
   Num.msg
 )

現(xiàn)在我們需要確保CMake知道我們添加了.msg文件嘁扼。
找到下面的代碼:

# generate_messages(
#   DEPENDENCIES
#   std_msgs
# )

去掉“#”號(hào)。
后面要做的內(nèi)容下個(gè)教程再說(shuō)黔攒。

3 使用rosmsg:

使用rosmsg show確保ROS能夠看見它趁啸。
用法:
$ rosmsg show [message type]
例如:
$ rosmsg show beginner_tutorials/Num
我們將會(huì)看到:
int64 num
在前面的例子里强缘,消息由兩部分構(gòu)成:

  • beginner_tutorials -- 消息定義的地方
  • Num--消息的名稱
    如果你忘了包里有什么msg:
    $ rosmsg show Num
    你可以看到:
[beginner_tutorials/Num]:
int64 num

4 使用srv

4.1 創(chuàng)建一個(gè)srv

使用剛剛創(chuàng)建的package創(chuàng)建一個(gè)srv

$ roscd beginner_tutorials
$ mkdir srv

我們將會(huì)從另一個(gè)package里面拷一個(gè)而不是完全的手工創(chuàng)建,使用roscp指令。
用法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
現(xiàn)在我們從小海龜那里拷一個(gè):
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
接下來(lái)一步莲绰,我們要確保把srv文件轉(zhuǎn)化成C++源代碼或者其他程序源碼欺旧。
打開CMakeLists.txt姑丑,去除以下程序的井號(hào):

# add_service_files(
#   FILES
#   Service1.srv
#   Service2.srv
# )

然后替換成自己的srv文件:

add_service_files(
  FILES
  AddTwoInts.srv
)

現(xiàn)在蛤签,就做好了從我們服務(wù)定義生成源文件的準(zhǔn)備。具體的做法在后面的教程里有栅哀。

4.2 使用rossrv

使用rossrv show確保ROS能夠看到它震肮。
用法:
$ rossrv show <service type>
例如:
$ rossrv show beginner_tutorials/AddTwoInts
你會(huì)看到:

int64 a
int64 b
---
int64 sum

其實(shí)可以不寫包名,它會(huì)自動(dòng)顯示所以此名稱的srv.

5 msg和srv的共同步驟

這一節(jié)和上一節(jié)都省略了一些前面做過(guò)的內(nèi)容留拾,如果需要查看可以參考官網(wǎng)戳晌。官網(wǎng)本節(jié)鏈接
首先,改變CMakelists.txt的內(nèi)容:

# generate_messages(
#   DEPENDENCIES
# #  std_msgs  # Or other packages containing msgs
# )

解除注釋痴柔,添加包含著你依賴的.msg文件的包:

generate_messages(
  DEPENDENCIES
  std_msgs
)

現(xiàn)在我們的包里已經(jīng)有了一些新消息沦偎,我們需要重新make我們的包:

# In your catkin workspace
$ roscd beginner_tutorials
$ cd ../..
$ catkin_make install
$ cd -

.msg生成的不同語(yǔ)言的源碼存放位置如下,懶得翻譯了:
Any .msg file in the msg directory will generate code for use in all supported languages. The C++ message header file will be generated in *~/catkin_ws/devel/include/beginner_tutorials/. *The Python script will be created in ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg. The lisp file appears in ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/.
與此相似的是咳蔚,.srv文件的源碼豪嚎,C++就在和message相同的文件夾,別的在在msg文件夾旁邊的srv文件夾谈火。
message的完整設(shè)計(jì)說(shuō)明 Message Description Language .

如果你變異的C++node要用你的新消息, 你需要聲明一個(gè)新的依賴 catkin msg/srv build documentation.

6 獲取幫助

我們很難記住每個(gè)命令的使用要求侈询,我們可以使用幫助功能來(lái)獲知,即在命令后面加上-h即可糯耍。

7 復(fù)習(xí)

我們現(xiàn)在列舉一些我們用過(guò)的命令:

  • rospack=ros+pack:提供有關(guān)ROS package的信息扔字。
  • roscd=ros+cd:changes directory 改變路徑到一個(gè)ROS package或stack
  • rosls=ros+ls:lists 列舉ROS package中的文件
  • roscp=ros+cp:copies 從一個(gè)ROS package復(fù)制文件到另一個(gè)
  • rosmsg=ros+msg:提供關(guān)于ROS message定義的信息
  • rossrv=ros+srv:提供關(guān)于ROS service定義的信息
  • catskin_make:makes(compiles)一個(gè)ROS package
  • rosmake=ros+make:在沒有使用一個(gè)catkin工作空間的情況下makes(compiles)一個(gè)ROS package
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市温技,隨后出現(xiàn)的幾起案子革为,更是在濱河造成了極大的恐慌,老刑警劉巖舵鳞,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件震檩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡系任,警方通過(guò)查閱死者的電腦和手機(jī)恳蹲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)俩滥,“玉大人嘉蕾,你說(shuō)我怎么就攤上這事∷桑” “怎么了错忱?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵儡率,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我以清,道長(zhǎng)儿普,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任掷倔,我火速辦了婚禮眉孩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勒葱。我一直安慰自己浪汪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布凛虽。 她就那樣靜靜地躺著死遭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凯旋。 梳的紋絲不亂的頭發(fā)上呀潭,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音至非,去河邊找鬼钠署。 笑死,一個(gè)胖子當(dāng)著我的面吹牛睡蟋,可吹牛的內(nèi)容都是我干的歼狼。 我是一名探鬼主播交播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了徙鱼?” 一聲冷哼從身側(cè)響起缀遍,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤全度,失蹤者是張志新(化名)和其女友劉穎幔妨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體傍菇,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猾瘸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了丢习。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牵触。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖咐低,靈堂內(nèi)的尸體忽然破棺而出揽思,到底是詐尸還是另有隱情,我是刑警寧澤见擦,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布钉汗,位于F島的核電站羹令,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏损痰。R本人自食惡果不足惜福侈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望卢未。 院中可真熱鬧肪凛,春花似錦、人聲如沸尝丐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)爹袁。三九已至,卻和暖如春矮固,著一層夾襖步出監(jiān)牢的瞬間失息,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工档址, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留盹兢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓守伸,卻偏偏與公主長(zhǎng)得像绎秒,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子尼摹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容