image_stream.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 # License: BSD
00004 #   https://raw.github.com/robotics-in-concert/rocon_qt_gui/license/LICENSE
00005 #
00006 ##############################################################################
00007 # Imports
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 # Image Stream App
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         # I'd like these to be also configurable via the gui
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         ##### Setting Resource Chooser Interface ####
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()


concert_qt_image_stream
Author(s): Donguk Lee
autogenerated on Fri Feb 12 2016 02:49:59