当前位置:   article > 正文

ROS回调函数传参_ros subscribe

ros subscribe

一、回调函数仅含单个参数

  1. C++ 代码
  2. void chatterCallback(const std_msgs::String::ConstPtr& msg)
  3. {
  4. ROS_INFO("I heard: [%s]", msg->data.c_str());
  5. }
  6. int main(int argc, char** argv)
  7. {
  8. ....
  9. ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  10. ....
  11. }
  1. #python代码,简要示例
  2. def callback(data):
  3. rospy.loginfo("I heard %s",data.data)
  4. def listener():
  5. rospy.init_node('node_name')
  6. rospy.Subscriber("chatter", String, callback)
  7. # spin() simply keeps python from exiting until this node is stopped
  8. rospy.spin()
  1. C++ 解析图像
  2. #include <ros/ros.h>
  3. #include <image_transport/image_transport.h>
  4. #include <cv_bridge/cv_bridge.h>
  5. #include <sensor_msgs/image_encodings.h>
  6. #include <opencv2/imgproc/imgproc.hpp>
  7. #include <opencv2/highgui/highgui.hpp>
  8. #include<iostream>
  9. using namespace std;
  10. using namespace cv;
  11. long int count_ =0000;//不能命名成count
  12. int n=0;
  13. void imageCallback(const sensor_msgs::ImageConstPtr& msg)
  14. {
  15. cv_bridge::CvImagePtr cv_ptr;
  16. try //对错误异常进行捕获,检查数据的有效性
  17. {
  18. cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
  19. char base_name[256];
  20. if(n%10==0)
  21. {
  22. sprintf(base_name,"/home/zhy/Documents/data/%04ld.jpg",count_++);
  23. imwrite(base_name, cv_ptr->image);
  24. }
  25. n++;
  26. }
  27. catch(cv_bridge::Exception& e) //异常处理
  28. {
  29. ROS_ERROR("cv_bridge exception: %s", e.what());
  30. return;
  31. }
  32. }
  33. int main(int argc, char** argv)
  34. {
  35. ros::init(argc, argv, "msg2img2");
  36. ros::NodeHandle nh_;
  37. ros::Subscriber image_sub_ = nh_.subscribe("/pylon_camera_node/image_raw", 1, imageCallback);///middle/pylon_camera_node/image_raw/compressed
  38. ros::spin();
  39. return 0;
  40. }

二、回调函数含有多个参数

  1. #C++代码
  2. void chatterCallback(const std_msgs::String::ConstPtr& msg,type1 &arg1, type2 &arg2,...,typen &argN)
  3. {
  4. ROS_INFO("I heard: [%s]", msg->data.c_str());
  5. }
  6. int main(int argc, char** argv)
  7. {
  8. ros::Subscriber sub =
  9. n.subscribe("chatter", 1000, boost::bind(&chatterCallback,_1,arg1,arg2,...,argN);
  10. ///需要注意的是,此处 _1 是占位符, 表示了const std_msgs::String::ConstPtr& msg。
  11. }
  1. #python代码,python中使用字典
  2. def callback(data, args):
  3. dict_1 = args[0]
  4. dict_2 = args[1]
  5. ...
  6. sub = rospy.Subscriber("text", String, callback, (dict_1, dict_2))
  1. #include <ros/ros.h>
  2. #include <image_transport/image_transport.h>
  3. #include <cv_bridge/cv_bridge.h>
  4. #include <sensor_msgs/image_encodings.h>
  5. #include <opencv2/imgproc/imgproc.hpp>
  6. #include <opencv2/highgui/highgui.hpp>
  7. #include<iostream>
  8. using namespace std;
  9. using namespace cv;
  10. long int count_ =0000;//不能命名成count
  11. int n=0;
  12. void imageCallback(const sensor_msgs::ImageConstPtr& msg, int &rp,char* &ip, int &up)
  13. {
  14. cv_bridge::CvImagePtr cv_ptr;
  15. try //对错误异常进行捕获,检查数据的有效性
  16. {
  17. cv_ptr = cv_bridge::toCvCopy(msg, sensor_msgs::image_encodings::BGR8);
  18. char base_name[256];
  19. if(n%10==0)
  20. {
  21. sprintf(base_name,"/home/zhy/Documents/data/%04ld.jpg",count_++);
  22. imwrite(base_name, cv_ptr->image);
  23. }
  24. n++;
  25. }
  26. catch(cv_bridge::Exception& e) //异常处理
  27. {
  28. ROS_ERROR("cv_bridge exception: %s", e.what());
  29. return;
  30. }
  31. }
  32. int main(int argc, char** argv)
  33. {
  34. int rtp=3;
  35. char IP[40]="127.0.0.1";
  36. int udp=4;
  37. ros::init(argc, argv, "msg2img2");
  38. ros::NodeHandle nh_;
  39. ros::Subscriber image_sub_ = nh_.subscribe<sensor_msgs::Image>("/pylon_camera_node/image_raw", 1,
  40. boost::bind(&imageCallback, _1, rtp,IP,udp));
  41. ros::spin();
  42. return 0;
  43. }

三、boost::bind()

boost::bind支持所有的function object, function, function pointer以及member function pointers,能够将行数形参数绑定为特定值或者调用所需要的参数,并可以将绑定的参数分配给任意形参。

boost::bind()的使用方法(functions and function pointers)

定义如下函数:

  1. int f(int a, int b)
  2. {
  3. return a + b;
  4. }

bind(f,_1,5)(x)相当于f(x,5);_1是一个占位符,其位于f函数形参的第一形参int a的位置,5位于f函数形参int b的位置;_1表示(x)参数列表的第一个参数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49896
推荐阅读
相关标签
  

闽ICP备14008679号