1. 程式人生 > >ROS教程(十):建立ROS訊息和ROS服務

ROS教程(十):建立ROS訊息和ROS服務

建立ROS訊息和ROS服務

Description: 本教程詳細介紹如何建立並編譯ROS訊息和服務,以及rosmsg, rossrv和roscp命令列工具的使用。

Tutorial Level: BEGINNER

Next Tutorial: 寫一個簡單的訊息釋出器和訂閱器 (python)(c++)

訊息(msg)和服務(srv)介紹

  • 訊息(msg): msg檔案就是一個描述ROS中所使用訊息型別的簡單文字。它們會被用來生成不同語言的原始碼。

  • 服務(srv): 一個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 對msgsrv都起作用)

同樣,跟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訊息和服務,接下來就就將學習如何編寫簡單的釋出器和訂閱器(python) (c++).

相關推薦

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部署儲存之glusterfsheketi部署

概觀 本指南支援在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