1. 程式人生 > >ROS 節點通訊

ROS 節點通訊

 "節點(Node)" 是ROS中指代連線到ROS網路的可執行檔案的術語。接下來,我們將會建立兩個節點,一個是釋出器節點("talker"),它將不斷的在ROS網路中廣播訊息;另一個是接收節點("listener"),從ROS網路中接收("talker")節點發送的資訊。

//釋出節點

#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv)
{
  ros::init(argc, argv, "talker");//建立釋出訊息的節點。名字為talker

  ros::NodeHandle n;//為這個程序的節點建立一個控制代碼。

  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
/*告訴master我們將要在chatter topic上釋出一個std_msgs/String的訊息。這樣master就會告訴所有

訂閱了chatter topic的節點,將要有資料釋出。第二個引數是釋出序列的大小。在這樣的情況下,如

果我們釋出的訊息太快,緩衝區中的訊息在大於1000個的時候就會開始丟棄先前釋出的訊息。*/

 ros::Rate loop_rate(10);
/*ros::Rate物件可以允許你指定自迴圈的頻率。它會追蹤記錄自上一次呼叫Rate::sleep()後時間的流

逝,並休眠直到一個頻率週期的時間。在這個例子中,我們讓它以10hz的頻率執行。*/
 int count = 0;

/*roscpp會預設安裝一個SIGINT控制代碼,它負責處理Ctrl-C鍵盤操作——使得ros::ok()返回FALSE。
ros::ok()返回false,如果下列條件之一發生:
SIGINT接收到(Ctrl-C)
被另一同名節點踢出ROS網路
ros::shutdown()被程式的另一部分呼叫
所有的ros::NodeHandles都已經被銷燬
一旦ros::ok()返回false, 所有的ROS呼叫都會失效。*/
 while (ros::ok())
     {
        /*我們使用一個由msg file檔案產生的‘訊息自適應’類在ROS網路中廣播訊息。現在我們使  

      用標準的String訊息,它只有一個數據成員"data"。當然你也可以釋出更復雜的訊息型別*/。
       std_msgs::String msg;
       std::stringstream ss;
      ss << "hello world " << count;
      msg.data = ss.str();
       ROS_INFO("%s", msg.data.c_str());
  
     chatter_pub.publish(msg);//現在我們已經向所有連線到chatter topic的節點發送了訊息。
    ROS_INFO("%s", msg.data.c_str());//ROS_INFO和類似的函式用來替代printf/cout.

    ros::spinOnce();
      /*在這個例子中並不是一定要呼叫ros::spinOnce(),因為我們不接受回撥。然而,如果你想拓

展這個程式,卻又沒有在這呼叫ros::spinOnce(),你的回撥函式就永遠也不會被呼叫。所以,在這裡最

好還是加上這一語句。*/

    loop_rate.sleep();//這條語句是呼叫ros::Rate物件來休眠一段時間以使得釋出頻率為10hz。
     ++count;
     }
}

對上邊的內容進行一下總結:
初始化ROS系統
在ROS網路內廣播我們將要在chatter topic上釋出std_msgs/String訊息
以每秒10次的頻率在chatter上釋出訊息
接下來我們要編寫一個節點來接收訊息。
#include "ros/ros.h"
#include "std_msgs/String.h"
        /*這是一個回撥函式,當訊息到達chatter topic的時候就會被呼叫。訊息是以 boost 

shared_ptr指標的形式傳輸,這就意味著你可以儲存它而又不需要複製資料*/
void chatterCallback(const std_msgs::String::ConstPtr& msg)
   {
     ROS_INFO("I heard: [%s]", msg->data.c_str());
   }
int main(int argc, char **argv)
   {
	ros::init(argc, argv, "listener");
	ros::NodeHandle n;
        /*告訴master我們要訂閱chatter topic上的訊息。當有訊息到達topic時,ROS就會呼叫

chatterCallback()函式。第二個引數是佇列大小,以防我們處理訊息的速度不夠快,在快取了1000個

訊息後,再有新的訊息到來就將開始丟棄先前接收的訊息。*/


	ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
/*NodeHandle::subscribe()返回ros::Subscriber物件,你必須讓它處於活動狀態直到你不再想訂閱該

訊息。當這個物件銷燬時,它將自動退訂 上的訊息。*/

	ros::spin();
/*ros::spin()進入自迴圈,可以儘可能快的呼叫訊息回撥函式。如果沒有訊息到達,它不會佔用很多

CPU,所以不用擔心。一旦ros::ok()返回FALSE,ros::spin()就會立刻跳出自迴圈。這有可能是

ros::shutdown()被呼叫,或者是使用者按下了Ctrl-C,使得master告訴節點要shutdown。也有可能是節

點被人為的關閉。*/
	return 0;
    }

下邊,我們來總結一下:
初始化ROS系統
訂閱chatter topic
進入自迴圈,等待訊息的到達
當訊息到達,呼叫chatterCallback()函式

最後,在多個節點同時執行的時候,可以新開啟一個終端,輸入如下指令來觀察節點的通訊圖。

$rqt_graph


相關推薦

ROS 節點通訊

 "節點(Node)" 是ROS中指代連線到ROS網路的可執行檔案的術語。接下來,我們將會建立兩個節點,一個是釋出器節點("talker"),它將不斷的在ROS網路中廣播訊息;另一個是接收節點("listener"),從ROS網路中接收("talker")節點發送的資訊。

Ros 節點之間的通訊--服務和引數伺服器

1.服務可以讓節點發送一個請求並且獲得一個相應,我們可以使用 rosservice 這個命令來獲取服務相關的資訊,具體如下: rosservice args #輸出服務所需的引數,返回的引數 ros

北洋UAM-05LX(網口系列適用)ROS節點

clone light address top dig 解決 戶外 arch 依賴 參考創客智造ROS與激光雷達入門教程 說明: 介紹ROS如何接入Hokuyo網口的雷達及基本使用 測試雷達:UAM-05LX采用太網接口,如果型號是USB口的參考教程 ros wiki:

ROS-4 : ROS節點和主題

圖片 ast client pack 一個數 tab 成功 tro span   依照<ROS-3 : Catkin工作空間和ROS功能包>,創建catkin工作空間,並在起src下創建功能包ros_demo_pkg,依賴項為roscpp、std_msgs、ac

Go語言實現區塊鏈與加密貨幣-Part3(交易優化,單機模擬多節點通訊

交易(二) 在這個系列文章的一開始,我們就提到了,區塊鏈是一個分散式資料庫。不過在之前的文章中,我們選擇性地跳過了“分散式”這個部分,而是將注意力都放到了“資料庫”部分。到目前為止,我們幾乎已經實現了一個區塊鏈資料庫的所有元素。今天,我們將會分析之前跳過的一些機制。而在本篇文章中,我們將

ROS5—理解ROS節點

這篇教程會介紹ROS圖概念和並討論roscore、rosnode和rosrun命令的使用。 1.預備條件 這裡會使用輕量級的模擬器,先安裝 $ sudo apt-get install ros--ros-tutorials 1 將替換成你的ROS版本名稱。 2.圖概念的快

ROS節點、訊息、服務、主題的關係

1.ROS計算圖級 ROS 會建立一個連線到所有程序的網路。在系統中的任何節點都可以訪問此網路,並通過該網路與其他節點互動,獲取其他節點發布的資訊,並將自身資料釋出到網路上。 如圖 在這一層級中最基本的概念包括節點、節點管理器、引數伺服器、訊息、服務、主題和訊息記錄包,這些概念都以不同的

Go語言實現區塊鏈與加密貨幣(用3臺計算機通過區域網模擬3個節點通訊)

本文要實現3臺計算機通過區域網模擬3個節點通訊。(windows環境下) 這是在上一步的基礎上修改而來的。 三個節點所扮演的角色分別是:中心節點、錢包節點、礦工節點 首先3臺計算機要通過區域網連線在一起(可以通過wifi等方式)。 注意要把各自的防火牆關掉。 可以用ping命令測試,互相間的

ROS-4 : ROS節點和主題 ROS-3 : Catkin工作空間和ROS功能包

  依照<ROS-3 : Catkin工作空間和ROS功能包>,建立catkin工作空間,並在起src下建立功能包ros_demo_pkg,依賴項為roscpp、std_msgs、actionlib、actionlib_msgs,並構建該空功能包。ROS中節點間的基本通訊方式是topic,即pub

ROS系列六:理解 ROS節點

轉自:http://wiki.ros.org/cn/ROS/Tutorials/UnderstandingNodes 目錄 先決條件 圖概念概述 節點 客戶端庫 roscore 使用rosnode 使用 rosrun 回顧  

ros節點呼叫gdb偵錯程式和呼叫valgrind分析節點

    在很多情況下我們需要呼叫gdb偵錯程式去除錯自己的程式碼。有時候也需要使用valgrind來檢測程式的記憶體洩露情況。下面我們就來介紹如何啟動gdb或者valgrind分析ros節點。     我是使用的launch檔案去啟動r

開機自動啟動ros節點--robot_upstart

1.安裝package,預設是indigo版本 sudo apt-get install ros-indigo-robot-upstart 2.執行install命令 根據自己實際工程souce下 [email protected]:/mnt# source

在QT上實現ROS 節點的釋出和訂閱

1、安裝ros_qtc_plugin 2、ROS工程建立 2.1、新建工作區,點選New Project 選擇Other Project -> ROS Workspace: 2.2、填寫工作區名稱,選擇路徑。選擇路徑時建議新建同名資料夾,工作區建立時沒

Go語言實現區塊鏈與加密貨幣(用3臺計算機通過區域網模擬3節點通訊)

本文要實現3臺計算機通過區域網模擬3節點通訊。(windows環境下) 這是在上一步的基礎上修改而來的。 首先3臺計算機要通過區域網連線在一起(可以通過wifi等方式)。 注意要把各自的防火牆關掉。 可以用ping命令測試,互相間的通訊是否正常。 一切正常後,需

calico 架構及跨節點通訊原理介紹

0、背景及calico簡介 為了搞定 AI on k8s的網路環境,即誇節點容器通訊的問題,在k8s多個網路解決方案中選擇了延遲表現最好的-calico方案,本文主要介紹calico 架構、元件及網路通

Ubuntu開機自啟ROS節點或執行命令

Ubuntu開機自啟ROS節點或執行命令 自己搭的機器人想讓它每次開機自動啟動相關節點? 介紹兩種方法. 1. 讓Ubuntu開機自動登入tty終端 先確保安裝了mingetty: sudo apt-get install mingetty 然後開啟ttyn配置檔案,

Spark如何使用Akka實現程序、節點通訊的簡明介紹

《深入理解Spark:核心思想與原始碼分析》一書第一章的內容請看連結《第1章 環境準備》 《深入理解Spark:核心思想與原始碼分析》一書第二章的內容請看連結《第2章 SPARK設計理念與基本架構》 Akka簡介   Scala認為Java執行緒通過共享資料以及通過鎖來維護共享資料的

ros-roslaunch啟動多臺機器ros節點

兩臺電腦,分別為p11和p12,環境均為ubuntu16.04,launch程式碼如下 <launch> <machine name="p12" address="p12"

axis ptz ros節點

https://github.com/RobotnikAutomation/axis_camera http://wiki.ros.org/axis_camera opencv 開啟axis攝像頭

ROS 節點 和 命令列傳參

http://wiki.ros.org/Nodes 節點是有節點型別type的的,節點的型別type就是節點所在包package的資源的名字,包括包package檔案的名字和包package內部可執行檔案的名字。 ROS在package內部搜尋特定名字的可執行程式,並以搜到