1. 程式人生 > >ROS的初步學習(五)--自己寫一個簡單的釋出(Publisher)、訂閱(Subscriber)程式

ROS的初步學習(五)--自己寫一個簡單的釋出(Publisher)、訂閱(Subscriber)程式

1 寫一個釋出(Publisher)節點

節點(node)是連線到ROS網路中可執行的基本單元。我們在這建立一個釋出者—“talker”節點,這個節點持續對外發布訊息。

首先我們要把目錄切換到我們的beginner_tutorials工程包中

$ cd ~/catkin_ws/src/beginner_tutorials  

因為我們已經編譯過這個工程包了,所以會在beginner_tutorials資料夾下看到CmakeList.txt、package.xml檔案和include、src這兩個目錄。接下來進入src子目錄
src目錄中建立一個talker.cpp檔案,裡面的內容如下:

#include "ros/ros.h"  
#include "std_msgs/String.h" #include <sstream> int main(int argc, char **argv) { /** * The ros::init() function needs to see argc and argv so that it can perform * any ROS arguments and name remapping that were provided at the command line. For programmatic * remappings you can use a different version
of init() which takes remappings * directly, but for most command-line programs, passing argc and argv is the easiest * way to do it. The third argument to init() is the name of the node. * * You must call one of the versions of ros::init() before using any other * part of the ROS system. */ ros::init(argc, argv, "talker"
); /** * NodeHandle is the main access point to communications with the ROS system. * The first NodeHandle constructed will fully initialize this node, and the last * NodeHandle destructed will close down the node. */ ros::NodeHandle n; /** * The advertise() function is how you tell ROS that you want to * publish on a given topic name. This invokes a call to the ROS * master node, which keeps a registry of who is publishing and who * is subscribing. After this advertise() call is made, the master * node will notify anyone who is trying to subscribe to this topic name, * and they will in turn negotiate a peer-to-peer connection with this * node. advertise() returns a Publisher object which allows you to * publish messages on that topic through a call to publish(). Once * all copies of the returned Publisher object are destroyed, the topic * will be automatically unadvertised. * * The second parameter to advertise() is the size of the message queue * used for publishing messages. If messages are published more quickly * than we can send them, the number here specifies how many messages to * buffer up before throwing some away. */ ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); ros::Rate loop_rate(10); /** * A count of how many messages we have sent. This is used to create * a unique string for each message. */ int count = 0; while (ros::ok()) { /** * This is a message object. You stuff it with data, and then publish it. */ std_msgs::String msg; std::stringstream ss; ss << "hello world " << count; msg.data = ss.str(); ROS_INFO("%s", msg.data.c_str()); /** * The publish() function is how you send messages. The parameter * is the message object. The type of this object must agree with the type * given as a template parameter to the advertise<>() call, as was done * in the constructor above. */ chatter_pub.publish(msg); ros::spinOnce(); loop_rate.sleep(); ++count; } return 0; }

2**寫一個訂閱(Subscriber)節點**
還是在src目錄下,建立一個listener.cpp檔案。內容如下:

    #include "ros/ros.h"  
    #include "std_msgs/String.h"  

    /** 
     * This tutorial demonstrates simple receipt of messages over the ROS system. 
     */  
    void chatterCallback(const std_msgs::String::ConstPtr& msg)  
    {  
      ROS_INFO("I heard: [%s]", msg->data.c_str());  
    }  

    int main(int argc, char **argv)  
    {  
      /** 
       * The ros::init() function needs to see argc and argv so that it can perform 
       * any ROS arguments and name remapping that were provided at the command line. For programmatic 
       * remappings you can use a different version of init() which takes remappings 
       * directly, but for most command-line programs, passing argc and argv is the easiest 
       * way to do it.  The third argument to init() is the name of the node. 
       * 
       * You must call one of the versions of ros::init() before using any other 
       * part of the ROS system. 
       */  
      ros::init(argc, argv, "listener");  

      /** 
       * NodeHandle is the main access point to communications with the ROS system. 
       * The first NodeHandle constructed will fully initialize this node, and the last 
       * NodeHandle destructed will close down the node. 
       */  
      ros::NodeHandle n;  

      /** 
       * The subscribe() call is how you tell ROS that you want to receive messages 
       * on a given topic.  This invokes a call to the ROS 
       * master node, which keeps a registry of who is publishing and who 
       * is subscribing.  Messages are passed to a callback function, here 
       * called chatterCallback.  subscribe() returns a Subscriber object that you 
       * must hold on to until you want to unsubscribe.  When all copies of the Subscriber 
       * object go out of scope, this callback will automatically be unsubscribed from 
       * this topic. 
       * 
       * The second parameter to the subscribe() function is the size of the message 
       * queue.  If messages are arriving faster than they are being processed, this 
       * is the number of messages that will be buffered up before beginning to throw 
       * away the oldest ones. 
       */  
      ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);  

      /** 
       * ros::spin() will enter a loop, pumping callbacks.  With this version, all 
       * callbacks will be called from within this thread (the main one).  ros::spin() 
       * will exit when Ctrl-C is pressed, or the node is shutdown by the master. 
       */  
      ros::spin();  

      return 0;  
    }  
3 編譯建立的節點

在編譯我們建立的節點之前,我們還需要編輯Cmakelist.txt檔案(注意:是beginner_tutorials專案包下的CMakelist檔案),告訴編輯器我們需要編輯什麼檔案,需要什麼依賴。

    $ gedit CMakeLists.txt 

在檔案末尾新增如下語句:

 include_directories(include ${catkin_INCLUDE_DIRS})  

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

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

將目錄切換到工作區目錄,並執行catkin_make執行命令:

    $ cd ~/catkin_ws  
    $ catkin_make  

這裡寫圖片描述
至此,程式已經建立完成,而接下來我們要檢查一下我們建立的程式是否正確。
測試程式的正確性
首先,我們得要啟動ROS核心程式
roscore.
在使用我們的程式之前,需要先把程式註冊

    $ cd ~/catkin_ws  
    $ source ./devel/setup.bash 

執行talker節點:

$ rosrun beginner_tutorials talker   

出現如下圖所示:
這裡寫圖片描述
這就表示釋出(Publisher)節點已經正確的運行了。
接下來執行listener節點

    $ rosrun beginner_tutorials listener  

這裡寫圖片描述
這說明訂閱節點(listener)已經成功的接收到了釋出節點(talker)釋出的資訊。至此,整個程式結束!

相關推薦

ROS初步學習--自己一個簡單釋出Publisher訂閱(Subscriber)程式

1 寫一個釋出(Publisher)節點 節點(node)是連線到ROS網路中可執行的基本單元。我們在這建立一個釋出者—“talker”節點,這個節點持續對外發布訊息。 首先我們要把目錄切換到我們的beginner_tutorials工程包中 $ cd ~

深入Java日記——自己一個ORM框架1

眾所周知,ORM框架有很多,例如Hibernate,MyBatis,還有BeetlSQL等等,裡面獲取有很多我們不需要的功能,本系列部落格主要教大家如何寫一個簡單的ORM框架 這個ORM框架主要有以下功能: 1. 生成JavaBean程式碼 2. 通過

學習筆記 利用反射 手一個簡單的實體類 轉json 的方法

不得不說 反射真的是個好動  # 貼上我的程式碼   package com.lengff.test; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetExce

自己一個簡單的Spring IOC容器

為了能更好的理解SpirngIOC是如何工作的,在查閱網上的資料後,自己寫了一個非常簡單的SpringIOC容器,使用setter方法將值注入。 本例子需要用到jdom的包:http://pan.baidu.com/s/1hsmgsfi 以下是包結構 A和B介面的定義就不

自己一個簡單的ArrayList

自己通過寫一個簡單的SimpleArrayList來加深對JDK原始碼中的ArrayList的理解。 構造器 如果沒有對集合設定長度,這裡我們預設採取長度為10作為內建陣列的初始化長度。 public SimpleArrayList() {

自己一個簡單的Web伺服器(附Demo)

一、什麼是Web伺服器? 先來寫個例子親身體驗一下。下面的示例程式碼演示瞭如何通過 java.net.Socket 與 java.net.ServerSocket這兩個重要的類建立一個簡單基於 Java 的 Web 伺服器 。這個伺服器通過8784

怎樣自己一個簡單的作業系統

       如非業務需要必要,不建議自己實現完整的計算機作業系統。重造車輪的累贅先不說。        在自己造的過程中,彷彿體驗了事無鉅細一切都要自己實現的艱辛,和訪問底層硬體處理dirty work帶來的虛假的智力/經驗上升的快感和空洞的談資的積累。 這不一定帶來良好

使用 js,自己一個簡單的滾動條

back http 之前 fun 完全 light get ini 計算 當我們給元素加上 overflow: auto; 的時候,就會出現滾動條,然而瀏覽的不同,滾動條的樣式大不一樣,有些甚至非常醜。 於是就想著自己寫一個滾動條,大概需要弄清楚一下這幾個點: 1、滾

java基礎學習總結二十一自己一個java.lang.reflect.Proxy代理的實現

     動態代理裡面用到了一個類就是java.lang.reflect.Proxy,這個類是根據代理內容為傳入的介面生成代理用的。本文就自己寫一個Proxy類出來,功能和java.lang.reflect.Proxy一樣,傳入介面、代理內容,生成代理。  

ROS學習十六用C++一個簡單的伺服器(service)和客戶端(client)

      我們將建立一個伺服器節點add_two_ints_server,它將會收到兩個整數,並且返回它們的和。切換目錄到之前建立的beginner_tutorials包下: cd ~/catkin_ws/src/beginner_tutorials      編輯sr

python學習8實例:一個簡單商城購物車的代碼

商品 流程圖 index blog pen 什麽 author 數字 git 要求: 1、寫一段商城程購物車序的代碼2、用列表把商城的商品清單存儲下來,存到列表 shopping_mail3、購物車的列表為shopping_cart4、用戶首先輸入工資金額,判斷輸入為數字5

spring ioc原理 spring ioc原理看完後大家可以自己一個spring

原 spring ioc原理(看完後大家可以自己寫一個spring) 2009年08月02日 20:33:00 超級谷歌 閱讀數:332663

STM32開發筆記55:STM32F4+DP83848乙太網通訊指南系列自己一個ARP協議

本章為系列指南的第九章,終結篇,本章主要來分析一下完整的ARP協議,並在STM32F4中實現一個精簡的ARP協議響應流程。 ARP協議的本質是使區域網內的其他主機能夠知道我在哪兒,比如在區域網上有人衝著所有人喊了一句「IP為XXXX的傢伙,你在哪兒」,我一聽,XXXX不是我的IP嗎,我得回答他啊

自己動手一個Vue外掛MD.7

造不完的輪子,封不完的外掛。網上什麼都有,但是有那找的功夫,自己都寫完了。漫島仍然在向前推進,只是你們看不到最新的更新內容了,剩餘的不會展示,等以後上線了再去看把。 講一下如何寫一個的Vue外掛,(以一個極其簡單的loading效果為例),會了這個其他不愁。 第一步,在compon

學習筆記:利用markdownreadme文件 Udacity學城

週末逛知乎等資訊平臺的時候,無意間瞭解到Udacity學城有一期關於利用markdown撰寫readme文件的教程,想到CSDN部落格也提供了markdown編輯功能,而自己到現在還不會用,看著自己寫的醜陋的部落格,決定趁此機會學習一下。於是乎,在學習過程中寫了

1017 Queueing at Bank 自己的模擬時間的版本

Suppose a bank has K windows open for service. There is a yellow line in front of the windows which devides the waiting area into two parts. All the custom

spring ioc原理看完後大家可以自己一個spring

最近,買了本Spring入門書:spring In Action 。大致瀏覽了下感覺還不錯。就是入門了點。Manning的書還是不錯的,我雖然不像哪些只看Manning書的人那樣專注於Manning,但懷著崇敬的心情和激情通覽了一遍。又一次接受了IOC 、DI、AOP等S

自己動手一個簡單的MVC框架第一版

一、MVC概念回顧   路由(Route)、控制器(Controller)、行為(Action)、模型(Model)、檢視(View) 用一句簡單地話來描述以上關鍵點:   路由(Route)就相當於一個公司的前臺小姐,她負責帶你(請求)找到跟你面試的面試官(控制器Controller),面試官

自己動手一個簡單的MVC框架第二版

一、ASP.NET MVC核心機制回顧   在ASP.NET MVC中,最核心的當屬“路由系統”,而路由系統的核心則源於一個強大的System.Web.Routing.dll元件。   在這個System.Web.Routing.dll中,有一個最重要的類叫做UrlRoutingModule,它是一個

SpringMVC增刪改查附原始碼,新手學SpringMVC最好的辦法就是自己一套增刪改查

最近在自學SpringMVC,有Spring的基礎,但不是很深,僅存在於表面。當前在手書籍有《SpringMVC學習指南》 個人認為學習一種MVC框架時,當入了個門之後可以自己寫一套增刪改查,這樣可以