[PYTHON] ROS Lecture 114 DataBase verarbeitet Bilder und greift über einen Browser darauf zu

Umgebung

Dieser Artikel funktioniert in der folgenden Umgebung.

Artikel Wert
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic
python 2.7.12
mongodb 2.6.10

Informationen zur Installation finden Sie unter ROS-Kurs 02-Installation. Das Programm in diesem Artikel wurde ebenfalls auf github hochgeladen. Weitere Informationen finden Sie im ROS Lecture 11 Git Repository.

Überblick

Bisher wurden verschiedene Daten im Browser angezeigt, es ist jedoch schwierig, das von ROS erfasste Bild im Browser anzuzeigen. Auch wenn es als ROS-Bild gespeichert ist, kann es nicht im Browser angezeigt werden. Sie können das Bild einmal in eine Datei mit ROS exportieren und mit einem Browser anzeigen, aber ich möchte das Dateisystem mit ROS nicht sehr häufig verwenden. Hier werden die Bilddaten in Base64 codiert und im Browser angezeigt. Wenn Sie diese Daten mit mongodb speichern, können Sie die Informationen auch dann speichern, wenn das Gerät ausgeschaltet ist. Das base64-Format ist eine Textdarstellung von Binärdaten. Konvertiert eine 3-Byte-Binärdatei in 4 ASCII-Zeichen.

Quellcode

Erhalten Sie rosservice und speichern Sie das Bild in mongodb. Löschen Sie die Datenbank. Daten an Browser senden.

ROS-Knoten, der auf Mongodb zugreift

web_lecture/scripts/mongo_image.py


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import rospy
from std_srvs.srv import Empty, EmptyResponse
from sensor_msgs.msg import Image
from web_lecture.msg import StringStamp
from web_lecture.srv import StringStampList, StringStampListResponse
from mongodb_store.message_store import MessageStoreProxy
from cv_bridge import CvBridge, CvBridgeError
import base64
import cv2

class MongoImage:
    def __init__(self):
        rospy.Service('shot', Empty, self.shotCallback)
        rospy.Service('delete', Empty, self.deleteCallback)
        rospy.Service('request', StringStampList, self.requestCallback)
        rospy.Subscriber("/image_raw", Image, self.imageCallback)
        self.last_image = Image()
        self.scale = 0.5
        self.bridge = CvBridge()
        self.last_base64 = None
        self.msg_store = MessageStoreProxy(database="srs", collection="image_stamp")

    def imageCallback(self, msg):
        self.last_image = msg

    def shotCallback(self, msg):
        frame = self.bridge.imgmsg_to_cv2(self.last_image, "bgr8")
        height = frame.shape[0]
        width = frame.shape[1]
        frame2 = cv2.resize(frame , (int(width*self.scale), int(height*self.scale)))
        encode_param = [int(cv2.IMWRITE_JPEG_QUALITY), 50]
        result, frame3 = cv2.imencode(".jpg ", frame2, encode_param)
        mongo_data = StringStamp()
        mongo_data.stamp = rospy.get_rostime()
        mongo_data.data = base64.b64encode(frame3)
        try:
            p_id = self.msg_store.insert(mongo_data)            
        except rospy.ServiceException, e:
            print "Service call failed: %s"%e
        return EmptyResponse()

    def deleteCallback(self, msg):
        list = self.msg_store.query(StringStamp._type)
        for item in list:
            self.msg_store.delete(str(item[1]["_id"]))
        return EmptyResponse()

    def requestCallback(self, msg):
        mongo_list = self.msg_store.query(StringStamp._type)
        output = []
        try:
            for item in mongo_list:
                output.append(item[0])
        except rospy.ServiceException, e:
            print "Service call failed: %s"%e  
        return StringStampListResponse(output)

if __name__ == '__main__':
    rospy.init_node('mongo_image')
    mongo_image = MongoImage()
    rospy.spin()

HTML mit Blowser anzuzeigen

web_lecture/www/image_view.html


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html;charset=utf-8"/>
    web_lecture index.html
  </head>
  <body>
    <p>
      <a href="pub.html">pub.html</a> <br/>
      <a href="sub.html">sub.html</a> <br/>
      <a href="camera.html">camera.html</a> <br/>
      <a href="camera_full.html">camera_full.html</a> <br/>
      <a href="twist.html">twist.html</a> <br/>
      <a href="gamepad_api_test.html">gamepad_api_test.html</a> <br/>
      <a href="gamepad.html">gamepad.html</a> <br/>
      <a href="image_view.html">image_view.html</a> <br/>
    </p>
  </body>
</html>

Lauf

Lauf


mkdir ~/.ros/mongo
roslaunch web_lecture mongo_image.launch 

mongo_image.gif

Referenz

Bild in HTML mit base64 einbetten Mit Python in base64 konvertieren

Link zur Tabellenseite

Link zum Inhaltsverzeichnis des ROS-Kurses

Recommended Posts

ROS Lecture 114 DataBase verarbeitet Bilder und greift über einen Browser darauf zu
Sie, die Befehle über einen WEB-Browser suchen und ausführen 2