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

版权声明:本文为博主原创文章,转载请联系作者 https://blog.csdn.net/u013832707/article/details/77890663

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

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):
        #callback

if __name__=='__main__':
    rospy.init_node('node_name', anonymous=True)
    topic = sys.argv[1]
    record_topic = RecordTopic()
    rospy.spin()

三、特殊情况记录

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

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

import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
import thread
import sys

im = cv2.imread('')
flag_im = False

def imSub(imgmsg): #回调函数, 仅用于更新图像信息
  global im, flag_im
  bridge = CvBridge()
  im = bridge.imgmsg_to_cv2(imgmsg, 'bgr8')
  flag_im = True

def 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

发现的问题

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

猜你喜欢

转载自blog.csdn.net/u013832707/article/details/77890663