1. 程式人生 > >ROS 自定義訊息釋出器和訂閱器測試 +程式碼詳解(入門級)

ROS 自定義訊息釋出器和訂閱器測試 +程式碼詳解(入門級)

既對ros tutorial 上的例子有了一定的瞭解之後,今天對釋出器和訂閱器程式碼(http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29)進行了研究,同時稍作改動進行了驗證

釋出器-------------------------------------------------------------------------------------------------------------
<pre name="code" class="cpp">#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Int16.h"//因為後面我要用到整形的msg,此處要加上Int的標頭檔案,不加後面會報錯
#include <sstream>
int main (int argc,char **argv)
{
   ros::init(argc,argv,"input");//初始化ROS, 是確切說明節點名字的地方, 節點的名字必須唯一, 
                                //它允許ROS通過命令列重新命名
   ros::NodeHandlen;//建立了該節點的一個控制代碼 

   ros::Publisherinput_pub = n.advertise<std_msgs::String>("chatter1",1000);
   ros::Publisherinput_pub = n.advertise<std_msgs::String>("chatter2",1000);
        /*尖括號裡為釋出的資料型別(除錯的時候第一個就忘了改), 即訊息Message ,我再這裡想要在一個節點(node)上釋出兩個話題(topic)
        圓括號中”chatter1”&”chatter2”為釋出的話題的名稱, 即Topic也可以寫成ros::Publisher chatter_pub; chatter_pub= n.advertise<...>...       (引自ROS 程式碼解析)*/
   ros::Rate  loop_rate(10);   
       /*一個ros::Rate物件允許user制定迴圈的頻率它將會記錄從上次呼叫Rate::sleep()到現在為止的時間, 並且休眠正確的時
       intcount = 0; 我的程式碼裡沒有用到計數,值得注意的是原始碼的count 變數一定程度上反應了程式碼的執行過程(通過觀察輸出結果可以明白)*/
   int a b,c;
   while (ros::ok())//預設情況下,roscpp將會安裝一個SIGINT監聽,
                   //它使當Ctrl-C按下時,ros::ok()將會返回 0
{  
     std_msgs::Int16msg1;
     std_msgs::Stringmsg2; //此處定義msg1 和msg2,注意型別不一致
     msg2.data="hello!I am Baymax!";
     std::cin>>a>>b;  //獲取鍵盤的輸入值,經過我的驗證,如果不輸入資料,程式會在這裡等待
     c=a+b;
     msg1.data=c;
//    ROS_INFO("%s", msg.data.c_str());  此處可以百度c_str的含義做更深入瞭解
     ROS_INFO("%s", msg2.data.c_str()); //輸出 msg2的資訊
     input_pub.publish(msg1);
     input_pub.publish(msg2); //釋出資訊
     ros::spinOnce();  // 可以查詢spinOnce做進一步瞭解,此處為呼叫一次回撥函式,關於回撥函式可以從訂閱節點處做直觀瞭解
     loop_rate.sleep(); //休眠一下, 使程式滿足前面所設定的 10Hz的要求
  }
  return 0;
}
訂閱器--------------------------------------------------------------------------
#include "ros/ros.h"
#include "std_msgs/String.h"
#include "std_msgs/Int16.h"//因為後面我要用到整形的msg,此處要加上Int的標頭檔案,不加後面會報錯
void chatterCb1(const std_msgs::Int16::ConstPtr& msg1) // 此處我設定了兩個回撥函式
{   ROS_INFO("I heard you said answer is : [%s]", msg1->data);  } 
void chatterCb2(const std_msgs::String::ConstPtr& msg2)
{   ROS_INFO("I heard: [%s]", msg->data.c_str());  } 
int main(int argc, char **argv)
{
   ros::init(argc, argv, "output");// 初始化節點(node)
   ros::NodeHandle n;
   ros::Subscriber sub1 = n.subscribe("chatter1", 1000, chatterCb1);
   ros::Subscriber sub2 = n.subscribe("chatter2", 1000, chatterCb2); //訂閱節點,觸發回撥
   ros::spin();
   return 0;
}

1.ros::spinOnce() 和ros::spin()的區別

ROS 監視器和你訂閱的topic連結,訊息到達時,他會把訊息加入到佇列中,但不會立即處理訊息。在讀到ros::spin()之後ros才開始執行回撥函式。而spinOnce 是指呼叫一次回撥函式,spin則不停的呼叫回撥函式,直到node被關閉的時候才會停止。

2.定義特定的時間間隔來處理回撥函式

問題提出:如果你的資訊的到達速度是100HZ,你每5HZ呼叫一次spinonce()函式,如果你的訂閱器緩衝區大小為1,那麼你丟掉了95/100的資訊。因此協調好訂閱釋出的頻率是非常重要的。使用定時器是一種很好的辦法,在這裡介紹一種經常使用的Ros::rate工具。
ros::Rate r(100);
while (ros::ok())
{
  libusb_handle_events_timeout(...); // Handle USB events
  ros::spinOnce();                   // Handle ROS events
  r.sleep();
}
這裡保證了while()大迴圈的頻率是100HZ,這是通過ros::Rate 和 r.sleep函式配對實現的
在其他的工程中,可能main函式被包括在了其他GUI介面的程式裡面,如果仍然希望做到上面的設定頻率,只需要按照他的格式,找到一個地方寫ros::spinOnce()函式就可以了。
void timerCb(int value) { ros::spinOnce(); }
glutTimerFunc(10, timerCb, 0);
glutMainLoop(); // Never returns

(出處:http://answers.ros.org/question/11887/significance-of-rosspinonce/)

-------------------------------------------------------------------------------------------
(如有不妥之處,懇請批評指正)

相關推薦

ROS 定義訊息釋出訂閱測試 +程式碼入門

既對ros tutorial 上的例子有了一定的瞭解之後,今天對釋出器和訂閱器程式碼(http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSub

ROS學習筆記16編寫簡單的訊息釋出訂閱 (Python)

1 編寫釋出者節點 “節點”是連線到ROS網路的可執行檔案ROS術語。在這裡,我們將建立一個持續廣播訊息的釋出者(“talker”)節點。 將目錄更改為您在早期教程中建立的的beginner_tutorials包,並建立一個包: $ roscd beginner_tut

ROS-python實現簡單的訊息釋出訂閱

因為著急做出東西來糊弄人,所以ROS的wiki看得馬馬虎虎一目十行,今天有些時間,仔細讀了一下tutorials,對ROS有了一種恍然大明白的感覺,記錄一下,方便以後操作,懶得再翻手冊了: 1,首先要建一個工作空間,這個先不表了 2,其次要建立一個packa

用Python實現ROS節點(編寫簡單的訊息釋出訂閱)

編寫一個簡單的釋出器和訂閱器 1.建立工作空間 建立資料夾hello_rospy,再在該目錄下建立子目錄src,cd到該src目錄,執行如下命令建立工作包 catkin_create_pkg beginner_tutorials std_msgs rospy ros

ROS】rospy 釋出訂閱Publisher and Subscriber

rospy L1: Publisher and Subscriber 參考(http://wiki.ros.org/rospy_tutorials/Tutorials/WritingPublisherSubscriber) 1 準備開發環境 1.1 建立功能包beginner_tutor

學習10:訊息釋出訂閱(C++)

因為我不會python,所以只能用C++了  - -# 1 節點 ROS中把可執行檔案叫做【節點】。 去剛才的beginner_tutorial(眼花了,單詞打沒打錯?……)目錄下,新建src資料夾,裡面寫一個 talker.cpp 裡面程式碼如下 /* * Copyr

《wiki官網教程》3 編寫簡單的訊息釋出訂閱 (C++)

釋出器節點 初始化 ROS 系統 在 ROS 網路內廣播我們將要在 chatter 話題上釋出 std_msgs/String 型別的訊息 以每秒 10 次的頻率在 chatter 上釋出訊息 #include "ros/ros.h"//ros/ros.h 是

建立ros定義訊息

$cd catkin_ws/src/rfid/src $mkdir msg 在msg資料夾下建立 一個名為rfid_data.msg的檔案,輸入如下內容: float32 rfid_distance float32 rfid_phase 接下來,還有關鍵的一步:我們要確

OPC的資料訪問方法分別有同步訪問、非同步訪問訂閱式資料採集方式------OPC第一篇

OPC的資料訪問方法分別有同步訪問、非同步訪問和訂閱式資料採集方式三種。1 同步資料訪問方式OPC伺服器把按照OPC應用程式的要求得到的資料訪問結果作為方法的引數返回給OPC應用程式,OPC應用程式在結果被返回之前必須處於等待狀態。同步訪問特點為:讀取指定OPC標籤對應的過程資料時,應用程式一直要等到讀取完為

android 定義TextView中Html超連結點選事件

public class TextHtmlActivity extends Activity { private TextView text; private Activity mActivty; @Override protected vo

【linux】Valgrind工具集十四:Cachegrind快取分支預測分析器

一、概述 Cachegrind,它模擬CPU中的一級快取I1,Dl和二級快取,能夠精確地指出程式中cache的丟失和命中。如果需要,它還能夠為我們提供cache丟失次數,記憶體引用次數,以及每行程式碼,每個函式,每個模組,整個程式產生的指令數。這對優化程式有很大的幫助。 Cach

CGI、FastCGIPHP-FPM區別關係包含圖解

CGI、FastCGI和PHP-FPM區別和關係詳解(包含圖解) 轉載至:https://www.awaimai.com/371.html 在搭建 LAMP/LNMP 伺服器時,會經常遇到 PHP-FPM、FastCGI和CGI 這幾個概念。如果對它們一知半解,很難搭建出高效能的伺服器。

Python高階程式設計——裝飾Decorator上篇(絕對是我見過最詳細的的教程,沒有之一哦)

一、先從一種情況開始看起 1、裝飾器decorator的由來 裝飾器的定義很是抽象,我們來看一個小例子。 先定義一個簡單的函式: def myfunc:     print('我是函式myfunc') myfunc() #呼叫函式 然後呢,我想看看

jQuery選擇程式碼——tokenize方法

原創文章,轉載請註明出處,多謝! /* * tokenize方法是選擇器解析的核心函式,它將選擇器轉換成兩級陣列groups * 舉例: * 若選擇器為“div.class,span”,則解析後的結果為: * group[0][0] = {type

Java之區域性內部類匿名內部類的區別附原始碼

前言        前面提到過,可以在程式碼塊裡建立內部類,典型的方式是在一個方法體裡面建立。區域性內部類不能有訪問說明符,因為它不是外圍類的一部分;但是他可以訪問當前程式碼塊內的常量,以及此外圍類

折半查詢遞迴折半查詢二分法查詢,遞迴二分法查詢

演算法:當資料量很大適宜採用該方法。採用二分法查詢時,資料需是排好序的。(前提) 主要思想是:(設查詢的陣列區間為array[low, high]) (1)確定該區間的中間位置K (2)將查詢的值T與

nginx 的安裝gcc gcc-c++配置新手必看

首先玩linux的話, gcc gcc-c++,fast-cgi,wget,yum 這些包請確保已經安裝好了, #下載nginx openssl,pcre,zlib  wget http://nginx.org/download/nginx-1.12.0.tar.gz&nb

android開發 -- 檢視陰影 Material Design

Material Design包含了很多內容,大致把它分為四部分: 主題和佈局——ANDROID L——Material Design詳解(主題和佈局) 檢視和陰影——ANDROID L——Material Design詳解(檢視和陰影) UI控制元件——ANDROID

機器學習中的概率模型概率密度估計方法 及 VAE生成式模型之二

簡介     非監督機器學習(Unsupervised Machine Learning)中的資料分佈密度估計(Density Estimation)、樣本取樣(Sampling)與生成(Generation,或Synthesis,即合成)等幾類任務具有重要的應用價值,這從近