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.
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.
Erhalten Sie rosservice und speichern Sie das Bild in mongodb. Löschen Sie die Datenbank. Daten an Browser senden.
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()
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
mkdir ~/.ros/mongo
roslaunch web_lecture mongo_image.launch
Bild in HTML mit base64 einbetten Mit Python in base64 konvertieren