美文网首页
Topic in roscpp——Listener

Topic in roscpp——Listener

作者: 徐凯_xp | 来源:发表于2019-05-05 10:42 被阅读0次

在topic接收方,有一个比较重要的概念,就是回调(CallBack),回调就是预先给 gps_info 话题传来的消息准备一个回调函数,你事先定义好回调函数的操作,本例中是计算到原点的距离。只有当有消息来时,回调函数才会被触发执行。具体去触发的命令就是 ros::spin() ,它会反复的查看有没有消息来,如果有就会让回调函数去处理。
但是,千万不要认为,只要指定了回调函数,系统就回去自动触发,你必须 ros::spin() 或者 ros::spinOnce() 才能真正使回调函数生效。

Listener.cpp
#include <ros/ros.h>
#include <topic_demo/gps.h>
#include <std_msgs/Float32.h>
void gpsCallback(const topic_demo::gps::ConstPtr &msg)
{
std_msgs::Float32 distance; //计算离原点(0,0)的距离
//建议使用ROS原生的float类型
distance.data = sqrt(pow(msg->x,2)+pow(msg->y,2));
ROS_INFO("Listener: Distance to origin = %f, state: %s",distance.data,msg->state.c
_str()); //输出
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("gps_info", 1, gpsCallback); //设置回调函数gpsCallback
//三个参数:1.监听topic 2、队列长度 3、指针:指向处理这个消息的回调函数。 
ros::spin(); //ros::spin()用于调用所有可触发的回调函数,将进入循环,不会返回,类似于在循环里反复
调用spinOnce()
//而ros::spinOnce()只会去触发一次
return 0;
}
CmakeLisrs.txt文件修改

在CMakeLists.txt添加以下内容,生成可执行文件。

add_executable(talker src/talker.cpp) #生成可执行文件talker
add_dependencies(talker topic_demo_generate_messages_cpp)
#表明在编译talker前,必须先生编译完成自定义消息
#必须添加add_dependencies,否则找不到自定义的msg产生的头文件
#表明在编译talker前,必须先生编译完成自定义消息
target_link_libraries(talker ${catkin_LIBRARIES}) #链接
add_executable(listener src/listener.cpp ) #声称可执行文件listener
add_dependencies(listener topic_demo_generate_messages_cpp)
target_link_libraries(listener ${catkin_LIBRARIES})#链接
扩展:回调函数与spin()方法

回调函数在编程中是一种重要的 方法,在维基百科上的解释是:

In computer programming, a callback is any executable code that is passed as an argument to other code, which is expected to call back (execute) the argument at a given time.

回调函数作为参数被传入到了另一个函数中(在本例中传递的是函数指针),在未来某个时刻(当有新的message到达),就会立即执行。Subscriber接收到消息,实际上是先把消息放到一个队列中去,如图所示。队列的长度在Subscriber构建的时候设置好了。当有spin函数执行,就会去处理消息队列中队首的消息。


1.png

spin具体处理的方法又可分为阻塞/非阻塞,单线程/多线程,在ROS函数接口层面我们有4种spin的方式:


编译、执行

catkin_make\rosrun

相关文章

  • Topic in roscpp——Listener

    在topic接收方,有一个比较重要的概念,就是回调(CallBack),回调就是预先给 gps_info 话题传来...

  • Topic in roscpp——Talker

    Topic是ROS里一种异步通信的模型,一般是节点间分工明确,有的只负责发送,有的只负责接收处理。对于绝大多数的机...

  • ros系统入门笔记(三)

    roscpp ——ros提供给cpp的接口(client library) 用C++语言与ros系统的topic,...

  • 使用rosed命令编译文件

    使用rosed roscpp Logger.msg命令就可以使用默认编辑器vim打开roscpp包里的Logger...

  • ROS param 使用说明

    1. 说明 param就是个中央注册表,可以进行参数的增删改查 2. roscpp中的使用 roscpp提供了两套...

  • Service in roscpp

    Service是一种请求-反馈的通信机制。请求的一方通常被称为客户端,提供服务的一方叫做服务器端。Service机...

  • Param in roscpp

    严格来说,param并不能称作一种通信方式,因为它往往只是用来存储一些静态的设置,而不是动态变化的。所以关于par...

  • ROS 学习-3

    用rosed命令修改文件 rosed [package_name] [filename] rosed roscpp...

  • Event Emitter

    Tips: 先注册listener - on,后emit Listener function 同步执行 'on' ...

  • 启动和停止Oracle

    配置Oracle listener 启动Oracle 2.1 启动server 2.2 启动listener 停止...

网友评论

      本文标题:Topic in roscpp——Listener

      本文链接:https://www.haomeiwen.com/subject/bqtcoqtx.html