1. 程式人生 > >ROS官網初級教程學習總結(10-16)

ROS官網初級教程學習總結(10-16)

建立ROS訊息和ROS服務

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

  • 訊息(msg): msg檔案就是一個描述ROS中所使用訊息型別的簡單文字。它們會被用來生成不同語言的原始碼。msg檔案存放在package的msg目錄下。
  • 服務(srv): 一個srv檔案描述一項服務。它包含兩個部分:請求和響應。srv檔案則存放在srv目錄下。
    示例:
    下面是一個msg檔案的樣例,它使用了Header,string,和其他另外兩個訊息型別。
  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

srv檔案分為請求和響應兩部分,由’—’分隔。

int64 A
int64 B
---
int64 Sum

其中 A 和 B 是請求, 而Sum 是響應。

使用 msg

建立一個 msg

建立完.msg檔案後,為了確保msg檔案被轉換成為C++、Python和其他語言的原始碼,package.xml要包含一下兩條語句:

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

然後在 CMakeLists.txt檔案中,利用find_packag函式,增加對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)

同樣,你需要確保你設定了執行依賴:

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

並且,找到如下程式碼塊:

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

去掉註釋符號#,用你的.msg檔案替代Message*.msg。
最後,我們要確保CMake知道在什麼時候重新配置我們的project。 確保添加了如下程式碼:
generate_messages()

使用 rosmsg

通過rosmsg show命令,檢查ROS是否能夠識訊息。
$ rosmsg show [message type]

使用 srv

建立一個srv

從其他的package中複製一個服務:
$ roscp [package_name] [file_to_copy_path] [copy_path]
同msg檔案類似,你也需要在package.xml和CMakeLists.txt檔案中做一些修改。

使用 rossrv

同樣可以通過rosmsg show命令,檢查ROS是否能夠識該服務。
$ rossrv show <service type>

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。所有在msg路徑下的.msg檔案都將轉換為ROS所支援語言的原始碼。生成的C++標頭檔案將會放置在~/catkin_ws/devel/include/beginner_tutorials/。 Python指令碼語言會在 ~/catkin_ws/devel/lib/python2.7/dist-packages/beginner_tutorials/msg 目錄下建立。

獲得幫助

$ rosmsg -h
同樣也可以獲得子命令的幫助:
$ rosmsg show -h

編寫簡單的訊息釋出器和訂閱器 (C++)

編寫釋出器節點

mkdir -p ~/catkin_ws/src/beginner_tutorials/src 這個資料夾將會用來放置 beginner_tutorials package 的所有原始碼。

編寫訂閱器節點

編譯節點

修改CMakeLists.txt檔案,新增:

include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

這會生成兩個可執行檔案, talker 和 listener, 預設儲存在~/catkin_ws/devel/lib/ 中.

然後要為可執行檔案新增對生成的訊息檔案的依賴:
add_dependencies(talker beginner_tutorials_generate_messages_cpp)
這樣就可以確保自定義訊息的標頭檔案在被使用之前已經被生成。

執行catkin_make

寫一個簡單的訊息釋出器和訂閱器 (Python)

Writing the Publisher Node

The Code

create a ‘scripts’ folder to store our Python scripts:mkdir scripts && cd scripts
編寫.py並改變其為可執行檔案:$ chmod +x talker.py

The Code Explained

Writing the Subscriber Node

類似

Building your nodes

Go to your catkin workspace and run catkin_make:

測試訊息釋出器和訂閱器

啟動釋出器

執行roscore
如果使用catkin,確保你在呼叫catkin_make後,在執行你自己的程式前,已經source了catkin工作空間下的setup.sh檔案
啟動a publisher called “talker”:

$ rosrun beginner_tutorials talker      (C++)
$ rosrun beginner_tutorials talker.py   (Python) 

啟動訂閱器

執行一個名為”listener”的訂閱器節點:

$ rosrun beginner_tutorials listener     (C++)
$ rosrun beginner_tutorials listener.py  (Python) 

編寫簡單的伺服器和客戶端 (C++)

編寫Service節點

編寫Client節點

編譯節點

CMakeLists.txt新增如下程式碼:

add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)

然後執行catkin_make命令將生成兩個可執行程式”add_two_ints_server”和”add_two_ints_client”,這兩個可執行程式預設被放在~/catkin_ws/devel/lib/share/。你可以直接呼叫可執行程式,或者使用rosrun命令去呼叫它們。

編寫簡單的Service和Client (Python)

Writing a Service Node

The Code

Don’t forget to make the node executable:
chmod +x scripts/add_two_ints_server.py

The Code Explained

Writing the Client Node

The Code

The Code Explained

Building your nodes

run catkin_make

Try it out!

In a new terminal, run

$ cd ~/catkin_ws
$ . devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_server.py

In a new terminal, run

$ cd ~/catkin_ws
$ . devel/setup.bash
$ rosrun beginner_tutorials add_two_ints_client.py 4 5

## 測試簡單的Service和Client
### 執行Service

$ rosrun beginner_tutorials add_two_ints_server     (C++)
$ rosrun beginner_tutorials add_two_ints_server.py  (Python)

### 執行Client

$ rosrun beginner_tutorials add_two_ints_client 1 3     (C++)
$ rosrun beginner_tutorials add_two_ints_client.py 1 3  (Python)

相關推薦

ROS初級教程學習總結10-16

建立ROS訊息和ROS服務 訊息(msg)和服務(srv)介紹 訊息(msg): msg檔案就是一個描述ROS中所使用訊息型別的簡單文字。它們會被用來生成不同語言的原始碼。msg檔案存放在package的msg目錄下。 服務(srv): 一個s

ROS初級教程學習總結17-20

錄製與回放資料 錄製資料(通過建立一個bag檔案) 如何記錄ROS系統執行時的話題資料,記錄的話題資料將會累積儲存到bag檔案中。 錄製所有釋出的話題 rostopic list -v:檢檢視當前系統中釋出的所有話題。 開始錄製: mkdir

ROS初級教程學習總結1-4

安裝並配置ROS環境 安裝ROS 安裝時記得換個好點的軟體源,要不然會因為網路連線問題一直失敗。 管理環境 export | grep ROS 主要是檢視環境變數是否設定。 ROSLISP_PACKAGE_DIRECTORIES=””

Ros基礎教程總結

建立package功能包$roscore(任何程式都要先執行的一步)$mkdir -p ~/catkin_ws/src(建立一個名叫catkin_ws的工作空間)$cd ~/catkin_ws/src(轉到catkin_ws/src目錄下)$catkin_init_works

第八章需求分析跟第九章項目經理學習總結------第七

總結 重新 需求 需求分析 需求量 團隊項目 div 改進 缺點 本周我看了第八章需求分析跟第九章項目經理,以下是我的學習總結。 一 .如何了解用戶的軟件需求 1.獲取和引導需求。軟件團隊需要找到軟件的利益相關者,了解和挖掘他們對軟件的需求,引導他們表達出軟件的需求。軟件團

Linux學習總結十四 文件的打包和壓縮

tar gzip bzip2 xz zip 文件的壓縮和打包,在windos下我們很熟悉.rar和.zip文件,這是兩種壓縮文件,他們支持單個文件和多個文件的壓縮。windos下我們不提及打包的概念,雖然多個文件的壓縮肯定存在打包過程。打包和壓縮的區別,從字面意思就可以看出,打包是將多個文

Linux學習總結十五文件查找 which whereis locate find

find which whereis locate which命令 用於查找並顯示給定命令的絕對路徑,環境變量PATH中保存了查找命令時需要遍歷的目錄。which指令會在環境變量$PATH設置的目錄裏查找符合條件的文件。也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到

Linux學習總結十六系統用戶及用戶組管理

useradd groupadd usermod passwd mkpasswd 先來認識兩個文件/etc/passwd/etc/shadow我們打印出首尾三行,來了解下:每行由:分割為7段,每段含義為:第一段:用戶名,比如root 用戶,普通用戶test,lv,test1第二段:早期存放

Linux學習總結十七-shell 基礎知識

shell基礎 變量 特殊符號 該篇內容很雜,但還是不難理解,就不逐個貼圖舉例。 一 先介紹幾種常用字符: 1 * 匹配任意個任意字符2 ?匹配一個任意字符3 # 註釋符號,符號後的語句不被執行4 \脫意字符,後面跟帶含義字符時,照原字符輸出5 []匹配包含在[]之中的任意一個字符:例如[bc]

Linux 學習總結十九正則三劍客之grep

grepgrep 過濾器,egrep可以理解為grep的升級版1 格式:grep [-cinvABC] ‘word‘ filename-c:統計符合要求的行數例如 : grep -c ‘root‘ /etc/passwdgrep -c ‘‘ /etc/passwd 統計文件總行數-i:忽略大小寫-n:行號輸出

Linux學習總結二十正則三劍客之sed

sedsed 流式編輯器,針對文檔的行來操作的 一 查找打印 1.打印某行格式: sed -n ‘n‘p filename 單引號內的n代表數字,表示第幾行例如:打印第二行sed -n ‘2‘p /etc/passwd也可以指定區間,比如打印前三行sed -n‘1,3‘p /etc/passwd打印所有的行s

Linux 學習總結二十三系統管理技巧2

nload free ps netstat tcpdump 1 監控io性能 nload -x %util 項 數字過大,說明io性能差,有可能是磁盤老化,或者磁盤本身故障。iotop 命令 也是動態顯示,類似於top ,可以查看磁盤的讀寫速度查看內存使用情況 2 free -h 查看內存

Linux 學習總結三十lamp之mysql安裝

lamp mysql 一 lamp架構介紹 lamp 是linux apache mysql php 的縮寫,就是整個一套服務端環境,對於php開發的網站,我們訪問到的頁面或者數據很可能就是這套環境提供的。對於普通網民來說,我們沒有註意我們訪問到的網站內容,其實是分兩大類的,一類是圖片為代表的靜態數據

Linux學習總結三十三lamp之httpd關聯php

lamp php vhosts 一.httpd 關聯php httpd主配置文件/usr/local/apache2.4/conf/httpd.confvim /usr/local/apache2.4/conf/httpd.conf//修改以下4個地方1打開虛擬主機搜索ServerName,去掉前

Java學習總結十四——java反射機制,利用反射動態創建對象

Java反射 動態創建對象 一.Java反射機制1.什麽是反射:反射就是把Java類中的各種成份影射成一個個的Java對象。例:一個類有:成員變量,方法,構造方法等,包等等信息,利用反射技術可以對一個類進行剖析,把各個組成部分影射成一個個對象。2.Java反射常用類:(1)Class類—可獲取類和類的

Java學習總結十五——MySQL數據庫—增,刪,改與部分查詢語句

MySQL數據庫 增 刪 改 查 一.MySQL簡介及在DOS下操作MySQL1.MySQL是一種中型關系型數據庫管理系統(DBMS,Database Management System)。註意:關系型數據庫是按照表的方式存儲數據的2.DOS環境下操作MySQL(1)進入MySQL環境:(

Linux學習總結四十lnmp之nginx安裝 用戶認證 域名重定向

lnmp nginx 默認虛擬主機 用戶認證 域名重定向 1 nginx 介紹 Nginx官網 nginx.org,最新版1.13,最新穩定版1.12 Nginx應用場景:web服務、反向代理、負載均衡Nginx著名分支,淘寶基於Nginx開發的Tengine,使用上和Nginx一致,服務

Qt學習總結C魚之信號與槽01

Qt 學習 總結 C魚 自動關聯 第一種自然是手動關聯了,只要調用connect函數就能實現自動關聯。這裏重點講第二種,自動關聯:為了實現槽函數自動進行關聯,對於Qt窗口部件已經提供的信號,可按照以下規範命名:void on_&lt;窗口部件名稱&gt;_&lt;信號名

Linux學習總結四十三nginx 負載均衡 https 配置

ngnix 負載均衡 ip_hash https 1 nginx 負載均衡 當被代理的服務端為多臺服務器時,就存在一個分發的問題,那麽就涉及到一個負載均衡的概念。如何讓客戶端請求按照預定的設想均衡的分發到各個服務器上,就要使用各種均衡算法。下面介紹的ip哈希算法可以實現如下目的。當對後端的多臺

Qt學習總結C魚之路徑參數引用

Qt學習總結(C魚)之路徑參數引用1.引用相對路徑: 例如: QCursor cursor(QPixmap("1.png")); 問題:會發現引用失敗,這是因為相對路徑都是從當前工作目錄開始找起文件的。可以通過以下函數獲取當前工作目錄: bool QDir::setCurrent ( co