博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Subscribe的第四个参数用法
阅读量:6711 次
发布时间:2019-06-25

本文共 1290 字,大约阅读时间需要 4 分钟。

看别人的代码真的是很好的学习过程啊

之前用Subscribe订阅的时候都是简单的用法形如:

ros::Subscriber sub = node.subscribe
("messageepc", 0, rfid_callback) ;

这样只用三个参数。

然后在实际中,如果想要给回调函数传参数可以用C++ 的boost库中的boost::bind() 函数,如:

image_transport::Subscriber sub = it.subscribe(topic_root + "/camera/image", 0, boost::bind(image_callback, _1, &pub_vt));

这里,boost::bind中的第一个参数是回调函数名,第二个 _1 是一个占位符,因为回调函数image_callback的第一个参数是msg,要给它留位置。第三个,就是传的一个参数。以此扩展,如果想要传两个参数,这样:boost::bind(image_callback, _1, &pub_vt, &pub_odo),不要把_1当做参数个数哈

然后在回调函数里面,这样用:

void image_callback(sensor_msgs::ImageConstPtr image, ros::Publisher * pub_vt)

就可以把参数写在第二个实参的位置了O(∩_∩)O

然后来说今天的重点,我学到的第四个参数的用法,先上示例:

ros::Subscriber mysub = nh.subscribe("/move_cmd", 0, &Robot::moveCallback, &tars);

在API里的原型是这样的:

template
Subscriber ros::NodeHandle::subscribe(const std::string & topic, uint32_t queue_size, void(T::*)(M) fp, T * obj, const TransportHints & transport_hints = TransportHints() ) [inline]

看上面原型要注意的是回调函数,应该是和第四个参数的在同一个类中,上面的例子是都在类T中,并且fp和obj都是指针类型 * 的。

解释下用法,第四个参数的T* obj是将类T的对象实例的指针传给同类的回调函数,void(T::*)(M)  fp。因此在实例类obj中,如果改了一个变量的值,在回调函数中也能体现出来。这样,就相当于类中使用全局变量了。

好了,解释完了,放我实现的栗子:

void Robot::moveCallback(const fsm_robot::rcmd_move msg){  cmd_int = n;  n++;}

这里,cmd_int就是类实例中中的全局变量了

转载于:https://www.cnblogs.com/wlzy/p/6800828.html

你可能感兴趣的文章
hdu 5480 Conturbatio
查看>>
shell学习之变量、判断、重复动作
查看>>
企业架构研究总结(42)——企业架构与建模之ArchiMate详述(中)
查看>>
Openstack组件实现原理 — Glance架构(V1/V2)
查看>>
python操作数据库
查看>>
【已解决】WebUploader 0.1.5 安卓手机不能访问相机、IOS直接访问相机 的问题
查看>>
关于网络编程
查看>>
索引(转载)
查看>>
STL容器的删除操作
查看>>
socket中的SO_REUSEADDR
查看>>
java创建TXT文件并进行读、写、修改操作
查看>>
hdu 5176 The Experience of Love
查看>>
使用AFNetworking框架遇到的一个经典bug的解决方案
查看>>
【莫队算法】【权值分块】bzoj3236 [Ahoi2013]作业
查看>>
Levmar:Levenberg-Marquardt非线性最小二乘算法
查看>>
集训队日常训练20181110 DIV2 题解及AC代码
查看>>
DOCTYPE 与浏览器渲染模式分析
查看>>
lf 前后端分离 (3) 中间建跨域
查看>>
Python Day1
查看>>
警惕互联网与经济的双重泡沫
查看>>