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內部搜尋特定名字的可執行程式,並以搜到