[Documentation] [TitleIndex] [WordIndex

Describe openhab_bridge/Tutorials/WritingAndExaminingASimplePublisherForTheImageItemTypePython here.

import os
import rospy
from openhab_msgs.msg import ImageCommand
import argparse
from sensor_msgs.msg import Image
from cv_bridge import CvBridge, CvBridgeError
import numpy as np

# OpenCV
import cv2

VERBOSE = False

class ImagePublisher(object):
    """Node example class."""

    def __init__(self, item_name, image_path):
        self.image_path = image_path
        self.item_name = item_name
        self.pub = rospy.Publisher("/openhab/items/" + self.item_name + "/command", ImageCommand, queue_size=10)
        self.rate = rospy.Rate(10) # 10hz

        # Initialize message variables.
        self.enable = False
        self.message = None
        self.bridge = CvBridge()
        self.image = None

        if self.enable:
            self.start()
        else:
            self.stop()

    def start(self):
        """Turn on publisher."""
        self.enable = True
        self.pub = rospy.Publisher("/openhab/items/" + self.item_name + "/command", ImageCommand, queue_size=10)

        while not rospy.is_shutdown():
            self.message = ImageCommand()

            if os.path.isfile(self.image_path):
                self.message.isnull = False
                img = cv2.imread(self.image_path)
            else:
                self.message.isnull = True
                self.image_path = "NULL"
                img = np.zeros((100,100,3), dtype=np.uint8)

            # finally convert RGB image to BGR for opencv
            img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)

            try:
                self.image = self.bridge.cv2_to_imgmsg(img, 'bgr8')
            except CvBridgeError as e:
                print(e)

            self.message.command = self.image
            self.message.header.stamp = rospy.Time.now()
            self.message.header.frame_id = "/base_link"
            self.message.item = self.item_name

            message = "Publishing %s to %s at %s" % (self.image_path, self.message.item, rospy.get_time())
            rospy.loginfo(message)

            self.pub.publish(self.message)
            self.rate.sleep()

    def stop(self):
        """Turn off publisher."""
        self.enable = False
        self.pub.unregister()

# Main function.
if __name__ == "__main__":
    # Initialize the node and name it.
    rospy.init_node("ImagePublisherNode", anonymous=True)
    # Go to class functions that do all the heavy lifting.

    parser = argparse.ArgumentParser()
    parser.add_argument("--image", type=str, required=False,
                        help="Path to image file you want to publish to openHAB. If not given an Image.jpg in your current path is expected. If there is no Image NULL will be published.")
    args = parser.parse_args()

    image_path = str(args.image)

    if image_path is None:
        image_path = "Image.jpg"

    imagePublisher = ImagePublisher("testImage", image_path)

    try:
        imagePublisher.start()
    except rospy.ROSInterruptException:
        pass
    # Allow ROS to go to all callbacks.
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()

2024-11-23 14:49