ROS回调函数的类方法实现,both in Python 和 C++

来源:互联网 发布:网络运营公司简介 编辑:程序博客网 时间:2024/06/10 23:48

一、常用的回调函数的实现

C++版本

ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);

python版本

rospy.Subscriber(topic, Image, callback, queue_size=1)

二、用类的方法实现回调函数

C++版本

class Listener{public:  void callback(const std_msgs::String::ConstPtr& msg);};Listener listener;ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, &listener);

python 版本

class RecordTopic:    def __init__(self):        rospy.Subscriber(topic, Image, self.callback, queue_size=1)    def callback(self, imgmsg):        #callbackif __name__=='__main__':    rospy.init_node('node_name', anonymous=True)    topic = sys.argv[1]    record_topic = RecordTopic()    rospy.spin()

三、特殊情况记录

在使用回调函数时,我有自己的一种方式,不知道会存在什么问题。不过我发现了一种特殊的现象,于是记录在这里。

首先,我的使用方式如下:

import rospyimport cv2from sensor_msgs.msg import Imagefrom cv_bridge import CvBridgeimport threadimport sysim = cv2.imread('')flag_im = Falsedef imSub(imgmsg): #回调函数, 仅用于更新图像信息  global im, flag_im  bridge = CvBridge()  im = bridge.imgmsg_to_cv2(imgmsg, 'bgr8')  flag_im = Truedef call_rosspin():  print 'call_rosspin: running rosspin'  rospy.spin()if __name__ == '__main__':  argc = len(sys.argv)  if argc < 2:    print 'please input topicname'    sys.exit()  else:    topicname = sys.argv[1]    if argc == 2:      filename = 'imsave.jpg'    else:      filename = argv[2]  rospy.init_node('imsave')  im_sub = rospy.Subscriber(topicname, Image, imSub)  thread.start_new_thread(call_rosspin, ()) #使用多线程的方式调用回调函数,更新图像  key = 100  cv2.namedWindow('im')  while key != ord('q'): #主循环,做需要进行的工作    if flag_im:      flag_im = False      cv2.imshow('im', im)    key = cv2.waitKey(1)    key = key&0xFF    if key == ord('s'):      cv2.imwrite(filename, im)      print 'pic is saved as', filename

发现的问题

以上面多线程的使用方式,图像显示更具有实时性;而以常规方式实现的回调函数,看到的画面会有一定时间的延迟。

原创粉丝点击