Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 from __future__ import division
00011 import os
00012 import math
00013 import threading
00014
00015 from python_qt_binding import loadUi
00016 from python_qt_binding.QtGui import QWidget
00017 from python_qt_binding.QtCore import Signal
00018
00019 import rospkg
00020 import rospy
00021 import sensor_msgs.msg as sensor_msgs
00022 from rocon_qt_library.widgets import QResourceChooser
00023 from rocon_qt_library.views import QCameraView
00024 from rocon_qt_library.interfaces import ResourceChooserInterface
00025
00026 from qt_gui.plugin import Plugin
00027
00028
00029
00030
00031
00032 class ImageStream(Plugin):
00033
00034 image_received = Signal(sensor_msgs.CompressedImage, name="image_received")
00035
00036 def __init__(self, context):
00037 self._lock = threading.Lock()
00038 self._context = context
00039 super(ImageStream, self).__init__(context)
00040
00041 self.initialised = False
00042 self.is_setting_dlg_live = False
00043
00044 self._widget = QWidget()
00045 rospack = rospkg.RosPack()
00046 ui_file = os.path.join(rospack.get_path('concert_qt_image_stream'), 'ui', 'concert_image_stream.ui')
00047 loadUi(ui_file, self._widget, {'QResourceChooser' : QResourceChooser, 'QCameraView' : QCameraView})
00048 if context.serial_number() > 1:
00049 self._widget.setWindowTitle(self._widget.windowTitle() + (' (%d)' % context.serial_number()))
00050
00051
00052 self._set_resource_chooser_interface()
00053
00054 context.add_widget(self._widget)
00055 self.setObjectName('ImageStream')
00056
00057 self._default_compressed_image_topic = '/image_stream/compressed_image'
00058 self.image_received.connect(self._widget.camera_view.on_compressed_image_received)
00059
00060 def shutdown(self):
00061 with self._lock:
00062 if self._image_stream_interface:
00063 self._image_stream_interface.shutdown()
00064 self._image_stream_interface = None
00065
00066 def _set_resource_chooser_interface(self):
00067 capture_timeout = rospy.get_param('~capture_timeout', 15.0)
00068 service_name = rospy.get_param('~service_name')
00069 available_resource_topic = '/services/%s/available_image_stream'%service_name
00070 capture_resource_pair_topic = '/services/%s/capture_image_stream'%service_name
00071 capture_resource_callbacks = [self._widget.resource_chooser_widget.capture_resource_callback, self._init_image_stream_interface]
00072 release_resource_callbacks = [self._widget.resource_chooser_widget.release_resource_callback, self._uninit_image_stream_interface]
00073 error_resource_callbacks = [self._widget.resource_chooser_widget.error_resource_callback]
00074 refresh_resource_list_callbacks = [self._widget.resource_chooser_widget.refresh_resource_list_callback]
00075
00076 self._resource_chooser_interface = ResourceChooserInterface(capture_timeout, available_resource_topic, capture_resource_pair_topic, capture_resource_callbacks, release_resource_callbacks, error_resource_callbacks, refresh_resource_list_callbacks)
00077
00078 capture_event_callbacks = [self._resource_chooser_interface.capture_resource]
00079 release_event_callbacks = [self._resource_chooser_interface.release_resource]
00080 self._widget.resource_chooser_widget.set_callbacks(capture_event_callbacks, release_event_callbacks)
00081
00082 def _init_image_stream_interface(self, uri, msg):
00083 if msg.result:
00084 compressed_image_topic = self._get_remapped_topic(self._default_compressed_image_topic, msg.remappings)
00085
00086 with self._lock:
00087 self._sub_image = rospy.Subscriber(compressed_image_topic, sensor_msgs.CompressedImage, self._process_image)
00088
00089 def _get_remapped_topic(self, remap_from, remappings):
00090 for r in remappings:
00091 if r.remap_from == remap_from:
00092 return r.remap_to
00093 return remap_from
00094
00095 def _uninit_image_stream_interface(self, uri, msg):
00096 with self._lock:
00097 self._sub_image.unregister()
00098 self._sub_image = None
00099 self._widget.camera_view.load_default_image()
00100
00101 def _process_image(self, msg):
00102 self.image_received.emit(msg)
00103
00104 def shutdown_plugin(self):
00105 self._widget.resource_chooser_widget.shutdown()