1. 程式人生 > >ROS Learning-012 beginner_Tutorials (程式設計) 建立自定義的ROS訊息和ROS服務

ROS Learning-012 beginner_Tutorials (程式設計) 建立自定義的ROS訊息和ROS服務

ROS Indigo beginner_Tutorials-11 建立自定義的ROS訊息和ROS服務

我使用的虛擬機器軟體:VMware Workstation 11
使用的Ubuntu系統:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo

一. 建立自定義的ROS訊息 :(msg

下面我們來介紹具體步驟:

1:現在beginner_tutorials軟體包中建立一個 msg 資料夾,用來存放我們下面要建立的訊息檔案:

$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64  num"
> msg/Num.msg

我們來看看上面的命令執行完後得到了什麼:

$ ls msg/
Num.msg

開啟這個 Num.msg 檔案,看看:開啟這個 Num.msg 檔案,看看:

$ gedit gedit msg/Num.msg 

這裡寫圖片描述

這樣就簡單的建立了一個訊息檔案。

我們具體介紹一下訊息( msg ) : msg 檔案就是一個描述 ROS 中所有 訊息型別 的簡單文字。它們可以用來生成不同語言的原始碼。

所以下一步:我們要確保 msg 檔案被轉換成為 C++Python 或者 其他語言的原始碼:

2:所以,我們要 確保 package.xml 包含一下兩條語句。如果沒有的話,就新增上這2句話 (完整的 package.xml
檔案)

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

開啟 package.xml 檔案 :

aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ ls
CMakeLists.txt  include  launch  msg  package.xml  scripts  src
aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials
$ gedit package.xml

將上的兩程式碼新增到這個 package.xml 檔案裡,如下圖所示:

這裡寫圖片描述

解釋:
message_generation ” 是構建時需要的。
message_runtime ” 是執行的時候需要的。

3:編寫 beginner_tutorials 程式包中的CMakeLists.txt 中的 find_packag() 函式,增加對 message_generation 的依賴,這樣就可以生成訊息了。

開啟 CMakeLists.txt 檔案:

aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ ls
CMakeLists.txt  include  launch  msg  package.xml  scripts  src
aobosir@ubuntu:~/catkin_ws/src/beginner_tutorials$ gedit CMakeLists.txt 

這裡寫圖片描述

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)

4:繼續編寫 beginner_tutorials 程式包中的CMakeLists.txt 中的 catkin_package() 函式, 新增執行依賴:message_runtime , roscpp , rospy , std_msgs

這裡寫圖片描述

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

5: 繼續編寫 beginner_tutorials 程式包中的CMakeLists.txt 中的 add_message_files()函式:新增新建立的訊息檔案: Num.msg

這裡寫圖片描述

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

6:繼續編寫 beginner_tutorials 程式包中的 CMakeLists.txt 。通過上一步手動新增完 .msg 檔案後,我們要確保 CMake 知道在什麼時候重新配置我們的 project 。 確保添加了如下程式碼: 新增包含 msgs 的軟體包依賴

這裡寫圖片描述

 generate_messages(
   DEPENDENCIES
   std_msgs
 )

現在,CMakeLists.txt 檔案就編寫完了。以上 1~6 就是建立訊息的所有步驟。

接下來,編譯,就可以生成自己的訊息原始碼了。

二. 編譯工作空間:

$ cd ~/catkin_ws
$ catkin_make

如何檢測建立成果呢:通過 rosmsg show 命令,檢查 ROS 是否能夠識別訊息:

$ rosmsg show beginner_tutorials/Num
int64 num

看樣子已經成功建立了一個簡單的訊息。

所有在 msg 路徑下的 .msg 檔案都將轉換為 ROS 所支援語言的原始碼。那麼,編譯生成的 .msg 訊息檔案生成的 C++Python 的檔案存放在哪個路徑裡呢:

生成的 C++ 標頭檔案將會放置在 : ~/catkin_ws/devel/include/beginner_tutorials/

aobosir@ubuntu:~/catkin_ws/devel/include/beginner_tutorials$ ls
Num.h

Python 指令碼語言會在 : ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg 目錄下建立。

aobosir@ubuntu:~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg$ ls
__init__.py  _Num.py

lisp 檔案會出現在 : ~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg/ 路徑下.

aobosir@ubuntu:~/catkin_ws/devel/share/common-lisp/ros/beginner_tutorials/msg$ ls
beginner_tutorials-msg.asd  Num.lisp  _package.lisp  _package_Num.lisp

三. 建立自定義的 ROS 服務 :( srv

1:現在 beginner_tutorials 軟體包中建立一個 srv 資料夾,用來存放我們下面要建立的服務檔案:

$ roscd beginner_tutorials
$ mkdir srv

這次,不自己寫服務檔案了, 我們直接複製已有的檔案:( roscp 是一個很實用的命令列工具,它實現了將檔案從一個 package (程式包)複製到另外一個 package (程式包)的功能。) ( package : 程式包或者叫軟體包 )

$ roscp  rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv

我們開啟這個 AddTwoInts.srv 檔案看看裡面有什麼:

gedit srv/AddTwoInts.srv

這裡寫圖片描述

簡單吧,就這玩意。下面就是編寫 package.xml 檔案 和 CMakeLists.txt 檔案了。跟建立訊息的步驟類似:(目的:確保 srv 檔案被轉換成為 C++Python 和其他語言的原始碼)

2:檢視 beginner_tutorials 程式包中的 package.xml , 確保它包含一下兩條語句: (上面建立的 msg 訊息的時候就可以添加了,所以這次就不需要添加了)

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

3:編寫 beginner_tutorials 程式包中的 CMakeList.txt 檔案中的 find_packag() 函式,增加對 message_generation 的依賴:(上面建立 msg 訊息的時候已經添加了,所以現在就不需要添加了。可以跳過這個步驟)

這裡寫圖片描述

(你發現了吧, message_generationmsgsrv 都起作用)

4:繼續編寫 beginner_tutorials 程式包中的 CMakeLists.txt 中的 add_service_files() 函式:新增新建立的服務檔案 :

這裡寫圖片描述

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

5:繼續編寫 beginner_turtorials 程式包中的 CMakeLists.txt 檔案中的 generate_messages() 函式:新增包含 msgs 的軟體包依賴: (在建立 msg 訊息的時候,就已經添加了,所以現在可以跳過這個步驟)

這裡寫圖片描述

(你發現了吧, generate_messages() 函式 對msgsrv 都起作用)

OK 完成 1~5 的步驟你的服務檔案就已經建立完成了。

四. 編譯工作空間:

那麼到這裡,一切步驟全部搞定,現在我們回到主工作空間路徑來編譯一下:

$ cd ~/catkin_ws
$ catkin_make

OK, 編譯完成。

總結:
我們現在已經學會了如何建立ROS訊息和服務,它們是ROS節點間相互通訊的除ROS話題外的另一種方式。

下一節,我就來使用剛剛建立的ROS訊息和ROS服務,編寫ROS服務版的 Hello World 程式。(使用ROS服務進行通訊的Hello World程式)

相關推薦

ROS Learning-012 beginner_Tutorials 程式設計 建立定義ROS訊息ROS服務

ROS Indigo beginner_Tutorials-11 建立自定義的ROS訊息和ROS服務 我使用的虛擬機器軟體:VMware Workstation 11 使用的Ubuntu系統:Ubuntu 14.04.4 LTS ROS 版本:ROS In

遊戲製作之路32建立定義的介面樣式管理

前面學習了使用GUIStyle來自定義按鈕,就可以顯示各種各樣的按鈕了,但是採用這種方式有時候不方便管理整個程式,或者不同遊戲之間的按鈕。比如你定義了一套公司的遊戲風格的介面,想在不同的遊戲之間進行使用,這時一個一個地拷貝程式碼,再去設定屬性,是否感覺很傻,對了,還有一個更聰明的辦法,就是把所有

遊戲製作之路31建立定義的按鈕

在前面學習了怎麼樣建立按鈕,也學習了顯示純文字,不過這些都是使用預設的模式來顯示的,但是遊戲開發人員常常使用自定義的按鈕比較多,因為它顯示多樣化,同樣可以進行換圖美化,也可以符合使用者的個性定義化。因此,這次來學習使用GUIStyle元件來定義按鈕的樣式。 比如建立如下圖的按鈕: 這個

MapReduce定義檔案讀取輸出元件

作用 自定義檔案讀取 讀取檔案時,預設是使用讀取器 LineRecoredReader<行首偏移量,每行內容>,每讀取一次,把key和value傳給 開發者開發的Mapper元件。現在自定義檔案讀取器,可以自定義讀取檔案的方法,這樣就可以調整傳遞給Mapper元件的

SkinUI入門教程 SkinUI定義控制元件常用元件

10.1 自定義控制元件 View元件只是一個矩形的空白區域,沒有任何內容。對於SkinUI的其他UI元件來說,它們都繼承了View元件,然後在View元件提供的空白區域上繪製外觀。 基於SkinUI UI元件的實現原理,當SkinUI系統提供的UI元件不足以滿足專案需求時,開發者完全可以通過繼承View元

【MVC】.Net實踐建立mvc框架的專案實體模型

一、 建立MVC框架的專案 (1)像新增平常專案一樣新增一個web應用程式,檔案—>新建—>專案 (3)接著選擇MVC (4)這樣就建好一個MVC框架的專案了 二、連線資料庫 建立

SparkSQL建立RDD:UDAFUserDefinedAggregatedFunction使用者定義聚合函式【Java版純程式碼】

要實現8個方法,8個方法中,最為重要的有3個: initialize:初始化,在給,map端每一個分割槽的每一個key進行初始化,給0 update:在map端聚合 merge: 在reduce端聚合 Java版程式碼: package com.bjsxt; im

Java併發程式設計執行緒定義、狀態屬性

一 、執行緒和程序 1. 什麼是執行緒和程序的區別: 執行緒是指程式在執行過程中,能夠執行程式程式碼的一個執行單元。在java語言中,執行緒有四種狀態:執行 、就緒、掛起和結束。 程序是指一段正在執行的程式。而執行緒有時也被成為輕量級的程序,他是程式執

【轉】Spring MVC系列定義數據綁定---HandlerMethodArgumentResolver

開閉 src pat 獲取參數 mvc .net 定義 開閉原則 淺析 介紹 前面幾節我們介紹了Spring MVC的幾種常見的數據綁定的方法,可以靈活地獲取用戶請求中的參數,例如@PathVariable,@ModelAttribute,@RequestPar

JVM——定義類加載器

tails alloc cat .class 網上 一個 str int 運行 背景:為什麽要自定義,如何自定義,實現過程 轉載:http://blog.csdn.net/SEU_Calvin/article/details/52315125 0. 為什麽需要自定義類加

Android項目實戰定義倒計時的TextView

初始 als time class nts 時間 自定義 計時 err 原文:Android項目實戰(十):自定義倒計時的TextView項目總結 --------------------------------------------------------------

每天學點SpringCloud定義Eureka集群負載均衡策略

log util domain 避免 can val 如果 dba filters 相信看了 每天學點SpringCloud(一):簡單服務提供者消費者調用,每天學點SpringCloud(二):服務註冊與發現Eureka這兩篇的同學都了解到了我的套路,沒錯,本篇博客同樣是

Android開發教程 - 使用Data Binding使用定義Interface

extend 方便 獲取 ble main implement lec click 簡單 為什麽要使用自定義Interface 我們平常在Android的開發中,比如如果要設置一個View的點擊事件,通常通過view.setOnClickListener()來實現的,這

[Golang] 從零開始寫Socket Server2定義通訊協議

        在上一章我們做出來一個最基礎的demo後,已經可以初步實現Server和Client之間的資訊交流了~ 這一章我會介紹一下怎麼在Server和Client之間實現一個簡單的通訊協議,從而增強整個資訊交流過程的穩定性。  

大資料入門11mr定義分組切片劃分

  public class AreaPartitioner<KEY, VALUE> extends Partitioner<KEY, VALUE>{ private static HashMap<String,Integer> areaMa

Java8 - 定製歸一化收集器reducing得到定義結果集

reducing簡介 reducing 是一個收集器(操作),從字面意義上可以理解為“減少操作”:輸入多個元素,在一定的操作後,元素減少。 reducing 有多個過載方法,其中一個方法如下: public static <T> Collector<T

iOS開發簡記2定義tabbar

tabbar是放在APP底部的控制元件。常見的APP都使用tabbar來進行功能分類的管理,比如微信、QQ等等。 小程需要一個特殊一點的tabbar,要求突顯中間的那個按鈕,讓中間按鈕特別顯眼,從而引導使用者去點選。 所以,讓中間按鈕大於兩邊的按鈕,是一個基本的要求。 使用常規的UITabBar跟UIT

Android學習—— Android定義控制元件

Android自定義控制元件 安卓在使用中大多數使用已有的一些控制元件,用法比較簡單,還有一部分是比較複雜的、使用者自己想的控制元件,這些就需要進行自定義控制元件,今天就來簡單說一下自定義控制元件。 1、繪製過程 建立一個類,繼承View類 onMeasure()方法,測量計算檢視的大小

C# 定義使用者控制元件

C# 自定義使用者控制元件   轉:https://blog.csdn.net/xiongxuanwen/article/details/2605109 本例是製作一個簡單的自定義控制元件,然後用一個簡單的測試程式,對於初學者來說,本例子比較簡單,只能起到拋石引玉的效

springboot框架開發微信公眾號定義選單的使用

關於自定義選單,微信為我們提供了幾個介面分別是建立、查詢和刪除。我們平時使用最多的就是建立選單了,往往我們執行了建立選單的程式碼後,選單並不會當即在我們關注過的公眾號上顯示出來,我們可以通過重新關注的方法,來檢視我們建立或更改後的選單。下面就來跟筆者來學一學這些介面的使用方法吧 一、由於這幾個介