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
學習筆記:利用markdown寫readme文件 (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框架時,當入了個門之後可以自己寫一套增刪改查,這樣可以