ROS学习手记 - 8 编写ROS的Publisher and Subscriber
上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber
要玩 Publisher 和 Subscriber, 需要具备的条件有哪些呢?先总结一下:
- 创建并生成自己的Package,本次是 beginner_tutorials
- 创建并生成ROS message & srv
详细版的手记要看我上传到百度文库的文件了:http://wenku.baidu.com/view/f872755a26fff705cc170ade
这里会写个总结~
Writing a Simple Publisher and Subscriber (C++)
This tutorial covers how to write a publisher and subscriber node in C++.
ROS学习笔记10 - 编写编译和检验Service Node
百度文库:http://wenku.baidu.com/view/e14d5e18dd88d0d232d46a37
Writing a Service Node
Here we'll create the service ("add_two_ints_server")node which will receive two ints and return the sum.
Change directories to your beginner_tutorialspackage you created in your catkin workspace previous tutorials:
cd ~/catkin_ws/src/beginner_tutorials
Please make sure you have followed the directions in the previous tutorialfor creating the service needed in this tutorial,creating
the AddTwoInts.srv (be sure to choose the rightversion of build tool you're using at the top of wiki page in the link).
The Code
Create the src/add_two_ints_server.cpp file within the
beginner_tutorialspackage and paste the following inside it:
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sendingback response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
ROS_INFO("Readyto add two ints.");
ros::spin();
return 0;
}
The Code Explained
Now, let's break the code down.
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
beginner_tutorials/AddTwoInts.h is the header file generated fromthe srv file that we created earlier. 位置:~/catkin_ws/include/beginner_tutorials
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
This function provides the service for adding two ints,it takes in the request and response type defined in the srvfile(AddTwoInts.srv) and returns a boolean.
{
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sendingback response: [%ld]", (long int)res.sum);
return true;
}
Here the two ints are added and stored in theresponse. Then some information about the request and response are logged.Finally the service returns true when it is complete.
ros::ServiceServerservice = n.advertiseService("add_two_ints", add);
Here the service is created and advertised over ROS.
对比一下前一节publisher nodes的创建:
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); //topic name “chatter”, bufferSize:1000
对比一下后面client相关声明语句:
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
This creates a client for the add_two_ints service. The ros::ServiceClient object is used to call the service later on.
Writing the Client Node
The Code
Create the src/add_two_ints_client.cpp file within the
beginner_tutorialspackage and paste the following inside it:
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage:add_two_ints_client X Y");
return1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv;
srv.request.a= atoll(argv[1]);
srv.request.b= atoll(argv[2]);
if (client.call(srv))
{
ROS_INFO("Sum:%ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failedto call service add_two_ints");
return1;
}
return 0;
}
The Code Explained
Now, let's break the code down.
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
This creates a client for the add_two_intsservice. The ros::ServiceClient object is used to call the service later on.
beginner_tutorials::AddTwoInts srv;
srv.request.a= atoll(argv[1]);
srv.request.b= atoll(argv[2]);
Here we instantiate列举 an autogenerated service class, and assignvalues into its request member.Aservice class contains two members,
requestand response.It alsocontains two class definitions,
Requestand Response.
if (client.call(srv))
This actually calls the service. Since service calls are blocking, it willreturn once the call is done. If the service call succeeded, call()will return true and the value in srv.response willbe valid. If the call did not succeed, call() willreturn
false and the value in srv.response will beinvalid.
Building your nodes
Again edit the beginner_tutorials CMakeLists.txt located at ~/catkin_ws/src/beginner_tutorials/CMakeLists.txt and add the following at the end:
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
This will create two executables, add_two_ints_server and add_two_ints_client, which by default will go intopackage directory of yourdevel
space, located by default at ~/catkin_ws/devel/lib/share/<package name>. You can invoke executablesdirectly or you can use rosrun to invoke调用 them. They are not placed in '<prefix>/bin' because that would pollute thePATH when installing your package to
the system. If you wish for your executableto be on the PATH at installation time, you can setup an install target, see:catkin/CMakeLists.txt
For more detailed discription of the CMakeLists.txt file see: catkin/CMakeLists.txt
Now run catkin_make:
# In your catkin workspace
cd ~/catkin_ws
catkin_make
If your build fails for some reason:
- make sure you have followed the directions in the previous tutorial: creating the AddTwoInts.srv.
Now that you have written a simple service and client, let's examine the simple service and client.
Examining the Simple Service and Client
Running the Service
Let's start by running the service:
$ rosrunbeginner_tutorials add_two_ints_server (C++)
$ rosrunbeginner_tutorials add_two_ints_server.py (Python)
You should see something similar to:
Ready to add two ints.
Running the Client
Now let's run the client with the necessaryarguments:
$ rosrunbeginner_tutorials add_two_ints_client1 3 (C++)
$ rosrunbeginner_tutorials add_two_ints_client.py 1 3 (Python)
You should see something similar to:
Requesting 1+3
1 + 3 = 4
Now that you've successfully run your first serverand client, let's learn how torecord and play back data.
Further examples on Service and Client nodes
If you want to investigate further and get ahands-on example, you can get one here. A simple Client and Servicecombination shows the use of custom message types. The Service node is writtenin C++ while the Client is available in C++, Python and LISP.
ROS学习手记 - 8 编写ROS的Publisher and Subscriber的更多相关文章
- ROS学习手记 - 5 理解ROS中的基本概念_Services and Parameters
上一节完成了对nodes, Topic的理解,再深入一步: Services and Parameters 我不理解为何 ROS wiki 要把service与parameter放在一起介绍, 很想分 ...
- ROS学习手记 - 7 创建ROS msg & srv
至此,我们初步学习了ROS的基本工具,接下来一步步理解ROS的各个工作部件的创建和工作原理. 本文的详细文档:http://wenku.baidu.com/view/623f41b3376baf1ff ...
- ROS学习手记 - 6 使用ROS中的工具:rqt_console & roslaunch & rosed
http://wiki.ros.org/ROS/Tutorials/UsingRqtconsoleRoslaunch Using rqt_console and roslaunch This tuto ...
- ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python)
ROS学习手记 - 2.1: Create and Build ROS Package 生成包(Python) 时隔1年,再回来总结这个问题,因为它是ros+python开发中,太常用的一个操作,需要 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——4.如何编写ROS的第一个程序hello_world
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- ROS学习手记 9 -- 阶段性复习
ROS 阶段性总结 1. 基本概念 ROS 是建立在Linux特别是Ubuntu系统上的一套软件系统,它具有操作系统的特征 ,负责管理各个模块的协同运行.设计初衷主要是面向机器人软硬件开发的特点:多 ...
- ROS学习笔记一(ROS的catkin工作空间)
在安装完成ROS indigo之后,需要查看环境变量是否设置正确,并通过创建一个简单的实例来验证ROS能否正常运行. 1 查看环境变量 在ROS的安装过程中,我们执行了如下命令:(此命令就是向当前用户 ...
- ROS学习笔记一:ROS安装与测试
1 Ubuntu和ROS版本的对应关系 Ubuntu 和 ROS 都存在不同的版本,其对应关系如下: 注:如果Ubuntu版本和ROS版本不对应的话,安装就不会成功了- 笔者安装的是Ubuntu14. ...
- ROS学习(一)Ros 中使用kinect
上的安装说明如下: 官网上明确写了如果安装windows kinect还需要安装一个驱动,但是有些ROS的书上并没有这么做,只提到了使用如下两步进行安装即可使用: sudo apt-get insta ...
随机推荐
- Swoole来实现实时异步任务队列
假如要发100封邮件,for循环100遍,用户直接揭竿而起,什么破网站!但实际上,我们很可能有超过1万的邮件.怎么处理这个延迟的问题?答案就是用异步.把“发邮件”这个操作封装,然后后台异步地执行1万遍 ...
- Kafka Stream
Kafka Stream是Apache Kafka从0.10版本引入的一个新Feature(当前:1.0.0-rc0,参见:https://github.com/apache/kafka/releas ...
- 关于Quad PLL /CPLL参考时钟的选择
关于Quad PLL /CPLL参考时钟的选择 1.参考时钟 2.channel PLL具体分析 CPLL端口描述 一张图说清了时钟为怎么被分成了north or south
- 浅析Hyperledger Fabric共识算法 摘自http://www.cocoachina.com/blockchain/20180829/24728.html
Hyperledger Fabric共识算法 区块链系统是一个分布式架构,交易账本信息由各个节点管理,组成一个庞大的分布式账本.在分布式系统中,各个节点收到的交易信息的顺序可能存在差异(例如,网络延迟 ...
- [转]在Eclipse中搭建Python开发环境
在Eclipse中搭建Python开发环境 来自: http://hi.baidu.com/hqwfreefly/blog/item/2543181d0afd9604314e150e.html 前言 ...
- vlan交换机的端口模式有哪几种
一 端口类型1 ,Access用户模式2 ,Trunk链路模式3 ,Hybrid模式(跟Trunk很类似但比trunk高级)二 端口介绍2.1 ,Access类型端口:只允许默认vlan的以太网帧,也 ...
- pytest.1.快速开始
From: http://www.testclass.net/pytest/quick_start/ 简介 pytest测试框架可以让我们很方便的编写测试用例,这些用例写起来虽然简单,但仍然可以规模化 ...
- python之全局安装包管理工具pip
1.curl 'https://bootstrap.pypa.io/get-pip.py' > get-pip.py 2.sudo python get-pip.py 3.sudo easy_i ...
- 一篇对OAuth2.0开发实例的介绍
今天看到了博友对SSO的文章,SSO单点登录的讲解突然想写一篇关于OAuth2.0用户授权的介绍. 应用场景:在APP或者网页接入一些第三方应用时,时长会需要用户登录另一个合作平台,比如QQ,微博,微 ...
- [转]PLSQL 记住密码