[Documentation] [TitleIndex] [WordIndex

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")

2024-04-27 13:00