c++回调函数/ROS回调函数
2018-01-09 10:15
99 查看
以下均是个人在实际耕码的过程中遇到的问题和整理的结果,可能会有不对的地方,望各位指正与交流
------------------------------------------------------------------我会有喵的-------------------------------------------------------------------
c++中的回调函数:
A "callback" is any function that is called by another function which takes the first function as a parameter.
直白点说,就是“函数#"的参数是另一个函数,通过“函数#"调用另一个函数,这个“函数#"就是回调函数。以数学形式来看(虽然不太恰当):Function(y)和Function(g(x))。Function(y)是一个函数,g(x)也是一个函数,那么Function(g(x))就可以看成是一个回调过程,g(x)就是回调函数。
更直接地说,我们一般都是调用opencv里面的库函数,现在关系反过来了,我们要让opencv调用一个我们自己写的函数,这个过程就是回调。那个被opencv调用的(我们自己写的)函数就是回调函数。接下來举例规范地说一下:
不带参数的回调函数:
带参数的回调函数:
接下来我们看看ROS中的回调函数。一般来说这个回调函数会用一些比较显著且比较统一的名字:**Callback(如ScanCallback/CameraCallback),它是在订阅话题的时候使用的。所以在使用时,我们需要声明订阅话题的名称,然后选择话题,最后调用Callback函数。废话不多说,举个例子(突然想吃举个栗子了啊-------):
先声明订阅的话题的名称:
然后,选择我们需要订阅的话题。
题外话,ROS中有很多话题,你可以自己写,上面这个IMAGE_TOIC就是我自己写的。当然你也可以使用一些系统提供的。比如你启动了激光雷达,不论是仿真Gazebo中的还是真的激光雷达(如rplidar),那你就可以订阅“/scan”这个话题。
2000代表我们一次性可以缓存多少消息(暂时没发现这个数字对我的程序会带来很大的影响,我经常写成1),最后那个就是回调函数了。
对于imageCallback的实现需要说一下。ROS中,imageCallback的参数是与你的话题息息相关的,你要跟据订阅的话题来确定参数。一般来说,程序的主要功能也都是在回调函数中实现的。你需要的数据,都是要通过话题订阅的,而订阅了就肯定有回调函数。你可以把一个个回调函数看成是一个个单独的线程。只要你订阅的消息一更新,回调函数就会被调用,对新的数据进行处理,程序就这么不断的进行下去了。这里我们仍旧举例:
需要确定的就是这个sensor_msgs::ImageConstPtr和nav_msgs::Odometry::ConstPtr啦!
嗯啊,今天到此结束啦,白白!
------------------------------------------------------------------我会有喵的-------------------------------------------------------------------
c++中的回调函数:
A "callback" is any function that is called by another function which takes the first function as a parameter.
直白点说,就是“函数#"的参数是另一个函数,通过“函数#"调用另一个函数,这个“函数#"就是回调函数。以数学形式来看(虽然不太恰当):Function(y)和Function(g(x))。Function(y)是一个函数,g(x)也是一个函数,那么Function(g(x))就可以看成是一个回调过程,g(x)就是回调函数。
更直接地说,我们一般都是调用opencv里面的库函数,现在关系反过来了,我们要让opencv调用一个我们自己写的函数,这个过程就是回调。那个被opencv调用的(我们自己写的)函数就是回调函数。接下來举例规范地说一下:
不带参数的回调函数:
//回调函数 void wordsCallback() { std::cout<<"Hello World!"<<std::endl; } //实现回调函数的"调用函数" void wods(void (*callfuction)()) { callfuction(); } int main(int argc,char* argv[]) { words(wodsCallback); return 0; } 程序的正确输出结果是:Hello World!
带参数的回调函数:
//回调函数 void wordsCallback(char* s) { std::cout<<s<<std::endl; } //实现带参回调函数的"调用函数" void words(void (*callfuction)(char*),char* s) { callfuction(s); } int main(int argc,char* argv[]) { words(wordsCallback,"Hello World!"); return 0; } 程序的正确输出结果:Hello World!
接下来我们看看ROS中的回调函数。一般来说这个回调函数会用一些比较显著且比较统一的名字:**Callback(如ScanCallback/CameraCallback),它是在订阅话题的时候使用的。所以在使用时,我们需要声明订阅话题的名称,然后选择话题,最后调用Callback函数。废话不多说,举个例子(突然想吃举个栗子了啊-------):
ros::Subscriber sub_raw_image= n.subscribe(IMAGE_TOPIC, 2000, imageCallback);
先声明订阅的话题的名称:
sub_raw_image
然后,选择我们需要订阅的话题。
IMAGE_TOPIC
题外话,ROS中有很多话题,你可以自己写,上面这个IMAGE_TOIC就是我自己写的。当然你也可以使用一些系统提供的。比如你启动了激光雷达,不论是仿真Gazebo中的还是真的激光雷达(如rplidar),那你就可以订阅“/scan”这个话题。
2000代表我们一次性可以缓存多少消息(暂时没发现这个数字对我的程序会带来很大的影响,我经常写成1),最后那个就是回调函数了。
imageCallback
对于imageCallback的实现需要说一下。ROS中,imageCallback的参数是与你的话题息息相关的,你要跟据订阅的话题来确定参数。一般来说,程序的主要功能也都是在回调函数中实现的。你需要的数据,都是要通过话题订阅的,而订阅了就肯定有回调函数。你可以把一个个回调函数看成是一个个单独的线程。只要你订阅的消息一更新,回调函数就会被调用,对新的数据进行处理,程序就这么不断的进行下去了。这里我们仍旧举例:
void forwardCallback(const nav_msgs::Odometry::ConstPtr &forward_msg){} void imageCallback(const sensor_msgs::ImageConstPtr &image_msg){}
需要确定的就是这个sensor_msgs::ImageConstPtr和nav_msgs::Odometry::ConstPtr啦!
嗯啊,今天到此结束啦,白白!
相关文章推荐
- 打印图形 c++解法
- C语言函数嵌套调用作业总结
- C++笔记之为什么一个类定义了析构函数就几乎肯定要定义拷贝构造函数和拷贝赋值运算符
- C语言实现分布式自增有序的唯一ID生成算法-snowflake算法
- MyEclipse 2015利用Cygwin+CDT搭建C/C++开发环境
- 读书笔记《Effective c++》 条款10 令operator= 返回一个reference to *this
- 用c++求π的近似值
- 循环嵌套
- 远程调试软件
- C++ new详解
- 循环嵌套
- c语言实训任务1
- C++ 模板
- Windows C++导入导出类
- 0109-C语言习题与解析 (A版)
- C语言之const关键字
- C语言中常用计时方法总结
- C语言--结构体成员有指针
- c++多线程 及mutex锁
- c++:函数重载