您的位置:首页 > 编程语言 > C语言/C++

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调用的(我们自己写的)函数就是回调函数。接下來举例规范地说一下:

不带参数的回调函数:

//回调函数
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啦!

嗯啊,今天到此结束啦,白白!

          
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: