ROS教程(十):建立ROS訊息和ROS服務
建立ROS訊息和ROS服務
Description: 本教程詳細介紹如何建立並編譯ROS訊息和服務,以及rosmsg, rossrv和roscp命令列工具的使用。Tutorial Level: BEGINNER
Next Tutorial: 寫一個簡單的訊息釋出器和訂閱器 (python)(c++)
訊息(msg)和服務(srv)介紹
msg檔案存放在package的msg目錄下,srv檔案則存放在srv目錄下。
msg檔案實際上就是每行宣告一個數據型別和變數名。可以使用的資料型別如下:
- int8, int16, int32, int64 (plus uint*)
- float32, float64
- string
- time, duration
- other msg files
- variable-length array[] and fixed-length array[C]
在ROS中有一個特殊的資料型別:Header,它含有時間戳和座標系資訊。在msg檔案的第一行經常可以看到Header header的宣告.
下面是一個msg檔案的樣例,它使用了Header,string,和其他另外兩個訊息型別。
Header header string child_frame_id geometry_msgs/PoseWithCovariance pose geometry_msgs/TwistWithCovariance twist
srv檔案分為請求和響應兩部分,由'---'分隔。下面是srv的一個樣例:
int64 A int64 B --- int64 Sum
其中 A 和 B 是請求, 而Sum 是響應。
使用 msg
建立一個 msg
下面,我們將在之前建立的package裡定義新的訊息。
$ cd ~/catkin_ws/src/beginner_tutorials $ mkdir msg $ echo "int64 num" > msg/Num.msg
上面是最簡單的例子——在.msg檔案中只有一行資料。當然,你可以仿造上面的形式多增加幾行以得到更為複雜的訊息:
string first_name string last_name uint8 age uint32 score
接下來,還有關鍵的一步:我們要確保msg檔案被轉換成為C++,Python和其他語言的原始碼:
檢視package.xml, 確保它包含一下兩條語句:
<build_depend>message_generation</build_depend> <run_depend>message_runtime</run_depend>
如果沒有,新增進去。 注意,在構建的時候,我們只需要"message_generation"。然而,在執行的時候,我們只需要"message_runtime"。
在你最喜愛的編輯器中開啟CMakeLists.txt檔案(可以參考前邊的教程rosed).
在 CMakeLists.txt檔案中,利用find_packag函式,增加對message_generation的依賴,這樣就可以生成訊息了。 你可以直接在COMPONENTS的列表裡增加message_generation,就像這樣:
# 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)
有時候你會發現,即使你沒有呼叫find_package,你也可以編譯通過。這是因為catkin把你所有的package都整合在一起,因此,如果其他的package呼叫了find_package,你的package的依賴就會是同樣的配置。但是,在你單獨編譯時,忘記呼叫find_package會很容易出錯。
同樣,你需要確保你設定了執行依賴:
catkin_package( ... CATKIN_DEPENDS message_runtime ... ...)
找到如下程式碼塊:
# add_message_files( # FILES # Message1.msg # Message2.msg # )
去掉註釋符號#,用你的.msg檔案替代Message*.msg,就像下邊這樣:
add_message_files( FILES Num.msg )
手動新增.msg檔案後,我們要確保CMake知道在什麼時候重新配置我們的project。 確保添加了如下程式碼:
generate_messages()
現在,你可以生成自己的訊息原始碼了。如果你想立即實現,那麼就跳過以下部分,到Common step for msg and srv.
使用 rosmsg
以上就是你建立訊息的所有步驟。下面通過rosmsg show命令,檢查ROS是否能夠識訊息。
使用方法:
$ rosmsg show [message type]
樣例:
$ rosmsg show beginner_tutorials/Num
你將會看到:
-
int64 num
在上邊的樣例中,訊息型別包含兩部分:
-
beginner_tutorials -- 訊息所在的package
-
Num -- 訊息名Num.
如果你忘記了訊息所在的package,你也可以省略掉package名。輸入:
$ rosmsg show Num
你將會看到:
-
[beginner_tutorials/Num]: int64 num
使用 srv
建立一個srv
在剛剛那個package中建立一個服務:
$ roscd beginner_tutorials $ mkdir srv
這次我們不再手動建立服務,而是從其他的package中複製一個服務。 roscp是一個很實用的命令列工具,它實現了將檔案從一個package複製到另外一個package的功能。
使用方法:
$ roscp [package_name] [file_to_copy_path] [copy_path]
現在我們可以從rospy_tutorials package中複製一個服務檔案了:
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
還有很關鍵的一步:我們要確保srv檔案被轉換成C++,Python和其他語言的原始碼。
現在認為,你已經如前邊所介紹的,在CMakeLists.txt檔案中增加了對message_generation的依賴。:
# 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都起作用)
同樣,跟msg檔案類似,你也需要在package.xmlCMakeLists.txt檔案中做一些修改(原文此處有錯,按此處修改)。檢視上邊的說明,增加額外的依賴項。
刪掉#,去除對下邊語句的註釋:
# add_service_files( # FILES # Service1.srv # Service2.srv # )
用你自己的srv檔名替換掉那些Service*.srv檔案:
add_service_files( FILES AddTwoInts.srv )
現在,你可以生成自己的服務原始碼了。如果你想立即實現,那麼就跳過以下部分,到Common step for msg and srv.
使用 rossrv
以上就是建立一個服務所需的所有步驟。下面通過rosmsg show命令,檢查ROS是否能夠識該服務。
使用方法:
$ rossrv show <service type>
例子:
$ rossrv show beginner_tutorials/AddTwoInts
你將會看到:
-
int64 a int64 b --- int64 sum
跟rosmsg類似, 你也可以不指定具體的package名來查詢服務檔案:
$ rossrv show AddTwoInts [beginner_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum [rospy_tutorials/AddTwoInts]: int64 a int64 b --- int64 sum
msg和srv都需要的步驟
接下來,在CMakeLists.txt中找到如下部分:
# generate_messages( # DEPENDENCIES # # std_msgs # Or other packages containing msgs # )
去掉註釋並附加上所有你訊息檔案所依賴的那些含有.msg檔案的package(這個例子是依賴std_msgs,不要新增roscpp,rospy),結果如下:
generate_messages( DEPENDENCIES std_msgs )
由於增加了新的訊息,所以我們需要重新編譯我們的package:
# In your catkin workspace $ cd ../.. $ catkin_make $ cd -
所有在msg路徑下的.msg檔案都將轉換為ROS所支援語言的原始碼。生成的C++標頭檔案將會放置在~/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/ 路徑下.
注:上文配置容易出錯,需要注意配置的順序,若不想刪註釋#,必須在註釋附近貼上程式碼!千萬不要在文尾貼上3個程式碼!!!
獲得幫助
我們已經接觸到不少的ROS工具了。有時候很難記住他們所需要的引數。還好大多數ROS工具都提供了幫助。
輸入:
$ rosmsg -h
-
你可以看到一系列的rosmsg子命令.
Commands: rosmsg show Show message description rosmsg users Find files that use message 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
回顧
總結一下到目前為止我們接觸過的一些命令:
- rospack = ros+pack(age) : provides information related to ROS packages
- rosstack = ros+stack : provides information related to ROS stacks
-
roscd = ros+cd : changes directory to a ROS package or stack
-
rosls = ros+ls : lists files in a ROS package
-
roscp = ros+cp : copies files from/to a ROS package
- rosmsg = ros+msg : provides information related to ROS message definitions
- rossrv = ros+srv : provides information related to ROS service definitions
- rosmake = ros+make : makes (compiles) a ROS package
下一個教程
相關推薦
ROS教程(十):建立ROS訊息和ROS服務
建立ROS訊息和ROS服務 Description: 本教程詳細介紹如何建立並編譯ROS訊息和服務,以及rosmsg, rossrv和roscp命令列工具的使用。Tutorial Level: BEGINNERNext Tutorial: 寫一個簡單的訊息釋出器和訂
Linux小小白入門教程(六):建立和刪除資料夾
以下操作在Linux終端進行。Linux因為許可權非常嚴格,所以暫時所有的命令操作全部是在/home資料夾下的/yangjw資料夾下進行。/yangjw資料夾就是登入使用者名稱所在的資料夾,出了此資料
webpack4系列教程(二):建立專案,打包第一個JS檔案
傳送門: webpack4系列教程(一):初識webpack 1. 建立專案 1.1 初始化一個專案 首先安裝nodejs,開啟 nodeJs官網 直接下載安裝即可,安裝完畢後開啟命令列工具,進入你的專案資料夾,執行 npm init 進
NPOI 2.0 教程(一):建立新EXCEL檔案
轉載請註明出處 http://blog.csdn.net/fujie724 NPOI很早就出名了,但是一直以為第三方的不可能有微軟的效率高,所以一直都用COM來處理EXCEL。 直到某天處理一個大量資料的EXCEL,發現NPOI生成的資料幾乎是1秒內就完成了,比傳統方法快了
jmeter教程(十):流程控制初識
在程式設計中,流程分為三種:順序流程、分支流程、迴圈流程。順序流程,即自頂而下,逐句執行的流程。分支流程,即兩個或多個分支,每次只走一個分支的流程。迴圈流程,即一段程式碼,重複地執行。我們前面所講的,全都是順序流程,現在講一下分支流程和迴圈流程。流程這塊,本是放到後面,等電子商城後臺系統寫好一些邏輯
PHP類例項教程(十):類的重寫(override)
如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋(override),也稱為方法的重寫。 當對父類的方法進行重寫時,子類中的方法必須和父類中對應的方法具有相同的方法名稱,在PHP5中不限制輸入引數型別、引數數量和返回值型別。(這點和JAVA不同)
Project 2013專案管理教程(3):建立任務間的依賴性
多個任務依賴於同一個任務,比較好處理,只要把它們的predecessors都設定為這個任務的ID即可。但是,反過來,一個任務依賴於多個任務怎麼設定?其實也很簡單,就是我們上面提到的第三種方法:單擊一下,鍵盤輸入多個ID數字,中間用逗號隔開即可。比如,任務7依賴於9和2的完成,那麼在任務7後面輸入“2,9”即
SDL入門教程(十):2、直接通過Unicode讓SDL顯示中文
作者:龍飛2.1:SDL本身可以顯示中文嗎? SDL的擴充套件庫SDL_ttf本身具備顯示中文的功能嗎?網上很多觀點,說不能顯示的,甚至做了分析解釋了原因。但是,事實是,SDL本身就可以顯示中文。如果我們看看SDL_ttf.c的原始碼,我們可以看到,最終用於構建
Zookeeper詳解(十):Python連接和操作Zookeeper
and finall 最大 acl odi 連接斷開 大於 utf lose Python對Zookeeper的基本操作#!/usr/bin/env python # -*- coding: utf-8 -*- import sys from kazoo.client i
Windows網路程式設計(四):建立UDP連線和收發訊息
UDP訊息的傳送和接收需要UDP連線,所以,上面的TCP連線已經不適用了,具體的區別主要有: 建立Socket時引數不同建立服務端時不需要listen和accept操作建立客戶端時不需要connect操作伺服器需要bind操作,客戶端不需要。 傳送和接收UDP訊息要用到sendt
Windows網路程式設計(三):建立TCP連線和收發訊息
先看服務端: // ConsoleApplication3.cpp : 定義控制檯應用程式的入口點。 // #include "stdafx.h" #define _WINSOCK_DEPRECATED_NO_WARNINGS //這個宣告要在stdafx.h的後面,但要
【鏈塊技術53期】超級賬本Fabric教程(二): Docker的部署和安裝(下)
原文連結:超級賬本Fabric教程 Docker的部署和安裝(下) 本節分享超級賬本執行環境docker容器的搭建。 四、Docker compose 4.1 能夠在主機上創建出相互隔離的網路,通過命令列管理多個容器。 在mac和windows中都集成了compos
【鏈塊技術52期】超級賬本Fabric教程(二):Docker的部署和安裝(上)
原文連結:超級賬本Fabric教程(二):Docker的部署和安裝(上) 本節分享超級賬本執行環境docker容器的搭建。 一、目錄 HyperLedger超級賬本執行環境-Docker容器介紹 二、推薦linux系統
Kubernetes部署(十):儲存之glusterfs和heketi部署
概觀 本指南支援在Kubernetes叢集中整合,部署和管理GlusterFS容器化儲存節點。這使Kubernetes管理員能夠為其使用者提供可靠的共享儲存。 包括設定指南、其中包含一個示例伺服器pod,它使用動態配置的GlusterFS捲進行儲存。對於那些希望測試或瞭解有關此主題的更多資訊的人,請按照主
Python3學習(十):redis的連線和使用
1.reids的連線Redis使用connection pool來管理對一個redis server 的所有連線,避免每次建立,釋放連線的開銷,預設,每個Redis例項都會維護一個自己的連線池。可以直接建立一個連線池,然後作為引數Redis,這樣就可以實現多個Redis例項共
storm教程(二):Storm Topology元件和Storm資料來源和輸出選擇
Storm Topology元件 前面的章節已經提到過,Storm叢集中的任務稱之為Topology。 對比Hadoop中的MapReduce job,mapper用於從資料來源中獲取資料,經過簡單處理,以一定的格式傳遞給reducer,reducer負責後
API 系列教程(三):使用 API Resource 來建立自定義 JSON 格式的 API
上一篇教程中我們通過 jwt-auth 實現了 Laravel 的 API 認證。 使用者請求登入介面 http://apidemo.test/api/auth/login 登入成功後,獲取到 JSON 響應,響應頭會帶有 token 資訊。 Authorizatio
我的ROS入門(五):總算搞通ROS的服務節點訂閱釋出訊息話題了
總算搞通ROS的服務節點訂閱釋出訊息主題了。可以實現那幾個東西。記錄一下吧。 首先要一個工作空間。 在當前系統使用者的home目錄下的.bashrc檔案中新增source /opt/ros/jade/setup.bash,才能執行ros相關的命令。 開始建立一個catkin
機器人作業系統ROS教程(三) ROS新手教程
前面我們介紹了ROS的特點和結構,接下來就要開始準備動手感受一下ROS的強大了。ROS官網的wiki上針對 新手的教程很詳細,最好把所有的新手教程都搞清楚,這是後面開發最基礎的東西。儘管如此,ROS對於新手 來說還是很難上手,這裡,我就來總結一下我當時學習的歷程,也為其他新
ROS學習(六):CMakeLists.txt 檔案
CMakeLists.txt 檔案 為 CMake build 檔案。是 CMake 編譯系統中軟體包的輸入。描述如何編譯程式碼、安裝到哪裡。 CMakeLists.txt 格式: 1、Required CMake Version (cmake_min