Describe openhab_bridge/Tutorials/WritingAndExaminingASimpleSubscriberForTheImageItemTypePython here.
import os
import rospy
from openhab_msgs.msg import ImageState
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
# OpenCV
import cv2
VERBOSE = False
class ImageSubscriber(object):
def __init__(self, item_name):
self.item_name = item_name
"""Configure subscriber."""
# Create a subscriber with appropriate topic, custom message and name of
# callback function.
self.sub = rospy.Subscriber("/openhab/items/" + self.item_name + "/state", ImageState, self.callback)
# Initialize message variables.
self.enable = False
self.data = None
self.bridge = CvBridge()
self.image = None
if self.enable:
self.start()
else:
self.stop()
def start(self):
self.enable = True
self.sub = rospy.Subscriber("/openhab/items/" + self.item_name + "/state", ImageState, self.callback)
def callback(self, data):
"""Handle subscriber data."""
self.data = data
if self.data.isnull == False:
msg = "Received %s" % self.data.item
try:
self.image = self.bridge.imgmsg_to_cv2(self.data.state, 'bgr8')
except CvBridgeError as e:
print(e)
cv2.imshow(str(self.item_name), self.image)
cv2.waitKey(25)
else:
msg = "Received %s with NULL" % self.data.item
rospy.loginfo(rospy.get_caller_id() + msg)
def stop(self):
"""Turn off subscriber."""
self.enable = False
self.sub.unregister()
if __name__ == '__main__':
# Initialize the node and name it.
node_name = "ImageSubscriberNode"
rospy.init_node(node_name, anonymous=True)
imageSubscriber = ImageSubscriber("testImage")
# Go to the main loop
try:
imageSubscriber.start()
# Wait for messages on topic, go to callback function when new messages arrive.
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
# Stop with Ctrl + C
except KeyboardInterrupt:
imageSubscriber.stop()
nodes = os.popen("rosnode list").readlines()
for i in range(len(nodes)):
nodes[i] = nodes[i].replace("\n","")
for node in nodes:
os.system("rosnode kill " + node_name)
print("Node stopped")import os
import rospy
from openhab_msgs.msg import ImageState
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
# OpenCV
import cv2
VERBOSE = False
class ImageSaver(object):
def __init__(self, item_name):
self.item_name = item_name
"""Configure subscriber."""
# Create a subscriber with appropriate topic, custom message and name of
# callback function.
self.sub = rospy.Subscriber("/openhab/items/" + self.item_name + "/state", ImageState, self.callback)
# Initialize message variables.
self.enable = False
self.data = None
self.bridge = CvBridge()
self.image = None
self.i = 0
self.name = "%s_%s_%s.jpg" % (self.item_name, rospy.Time.now(), self.i)
if self.enable:
self.start()
else:
self.stop()
def start(self):
self.enable = True
self.sub = rospy.Subscriber("/openhab/items/" + self.item_name + "/state", ImageState, self.callback)
def callback(self, data):
"""Handle subscriber data."""
self.data = data
if self.data.isnull == False:
msg = "Received %s" % self.data.item
try:
self.image = self.bridge.imgmsg_to_cv2(self.data.state, 'bgr8')
except CvBridgeError as e:
print(e)
self.i = self.i + 1
cv2.imwrite(self.name, self.image)
else:
msg = "Received %s with NULL" % self.data.item
rospy.loginfo(rospy.get_caller_id() + msg)
def stop(self):
"""Turn off subscriber."""
self.enable = False
self.sub.unregister()
if __name__ == '__main__':
# Initialize the node and name it.
node_name = "ImageSaverNode"
rospy.init_node(node_name, anonymous=True)
imageSaver = ImageSaver("testImage")
# Go to the main loop
try:
imageSaver.start()
# Wait for messages on topic, go to callback function when new messages arrive.
# spin() simply keeps python from exiting until this node is stopped
rospy.spin()
# Stop with Ctrl + C
except KeyboardInterrupt:
imageSaver.stop()
nodes = os.popen("rosnode list").readlines()
for i in range(len(nodes)):
nodes[i] = nodes[i].replace("\n","")
for node in nodes:
os.system("rosnode kill " + node_name)
print("Node stopped")