[PYTHON] ROS Lecture 114 DataBase gère les images et y accède à partir d'un navigateur

environnement

Cet article fonctionne dans l'environnement suivant.

article valeur
CPU Core i5-8250U
Ubuntu 16.04
ROS Kinetic
python 2.7.12
mongodb 2.6.10

Pour l'installation, reportez-vous à ROS Course 02 Installation. Le programme de cet article a également été téléchargé sur github. Veuillez vous référer à ROS Lecture 11 git Repository.

Aperçu

Jusqu'à présent, diverses données ont été affichées sur le navigateur, mais il est gênant d'afficher l'image acquise par ROS sur le navigateur. Même si elle est enregistrée en tant qu'image ROS, elle ne peut pas être affichée dans le navigateur. Vous pouvez exporter l'image dans un fichier avec ROS une fois et l'afficher avec un navigateur, mais je ne veux pas beaucoup utiliser le système de fichiers avec ROS. Ici, les données d'image sont encodées en Base64 et affichées sur le navigateur. De plus, en enregistrant ces données avec mongodb, vous pouvez enregistrer les informations même si l'alimentation est coupée. Le format base64 est une représentation textuelle de données binaires. Convertit un binaire de 3 octets en 4 caractères ASCII.

Code source

Recevez rosservice et enregistrez l'image dans mongodb. Supprimez la base de données. Envoyez les données au navigateur.

Nœud ROS accédant à mongodb

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 à afficher avec blowser

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>

Courir

Courir


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

mongo_image.gif

référence

Incorporer l'image en html avec base64 Convertir en base64 avec python

Lien vers la page du tableau

Lien vers la table des matières du cours ROS

Recommended Posts

ROS Lecture 114 DataBase gère les images et y accède à partir d'un navigateur
Vous qui recherchez et exécutez des commandes depuis un navigateur WEB 2