在ROS讲座108中,使用ROS和数据库(mongo)进行数据交互
环境
本文章正在以下环境中运行。
有关安装,请参阅ROS课程02 安装。
此外,本文的程序已上传到github。请参考ROS课程11 git存储库。
总结
在ROS中,信息基本上保存在rosbag中。rosbag是一种供人类回顾调试日志的工具,而在运行时如果需要重用数据,则需要每个节点自行保存数据或者通过文件的读写来实现。这里出现的数据库就是指能够连接ROS的mongodb数据库包。
MongoDB的架构配置
MongoDB采用了数据库 -> 集合 -> 文档的结构。
-
- documentは実際のデータの実態で、excelでの1行に当たります。
-
- collectionはdocumentを複数まとめたもの
- batabaseはcollectionを複数まとめたもの
安装
sudo apt install ros-kinetic-mongodb-store
我們可以嘗試在 MongoDB Store 中寫入資料。
执行数据库
在启动时决定数据库文件放置的目录。创建一个空目录。如果指定不存在的目录,将会出现错误。
mkdir /tmp/test_db
roslaunch mongodb_store mongodb_store.launch db_path:=/tmp/test_db port:=27017
执行写入节点
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
from mongodb_store.message_store import MessageStoreProxy
from geometry_msgs.msg import Pose, Point, Quaternion
if __name__ == '__main__':
rospy.init_node("mongo_pose_write")
msg_store = MessageStoreProxy(database="srs", collection="pose1")
p = Pose(Point(0, 1, 2), Quaternion(0, 0, 0, 1))
try:
p_id = msg_store.insert_named("named_pose", p)
p_id = msg_store.insert(p)
except rospy.ServiceException, e:
print "Service call failed: %s"%e
MessageStoreProxy(database=”srs”, collection=”pose1″)で書き込みをするためのオブジェクトを生成します。ここでdatabas名とcollection名を指定します。
msg_store.insert_named(“named_pose”, p)でデータを書き込みます。
rosrun web_lecture mongo_pose_write.py
执行读取节点
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import rospy
import mongodb_store_msgs.srv as dc_srv
import mongodb_store.util as dc_util
from mongodb_store.message_store import MessageStoreProxy
from geometry_msgs.msg import Pose, Point, Quaternion
import StringIO
if __name__ == '__main__':
rospy.init_node("mongo_pose_write")
msg_store = MessageStoreProxy(database="srs", collection="pose1")
try:
for item in msg_store.query(Pose._type):
print item[0].position
except rospy.ServiceException, e:
print "Service call failed: %s"%e
msg_store.query(Pose._type)でデータベースの中からpose型のデータを抽出してきます。もと詳しくクエリを入れることもできます。
結果はリストで帰ってきます。要素の中の0番目はROSのメッセージ型になっています。1番目にはメタ情報が入っています。
rosrun web_lecture mongo_pose_read.py
x: 0.0
y: 1.0
z: 2.0
x: 0.0
y: 1.0
z: 2.0
使用Mongo读取数据。
可以直接读取数据库,而不是通过ROS接口。
启动mongo和命令,您将连接到mongo的控制台。
show dbsでdatabaseの一覧を見れます。
use {database名}でそのdatabaseを使用します。
show collectionsでcollectionの一覧を見れます。
db.{collection名}.find()でそのcollectionの中のデータの全体を見れます。
留言
由于MongoDB已经在后台运行并占用了端口27017,所以即使进行roslaunch也会出现错误。
我们可以使用systemctl status mongodb.service来检查服务是否已经启动。如果服务已经启动,可以使用sudo systemctl disable mongodb.service && sudo systemctl stop mongodb.service来停止服务。
请提供更多的上下文信息。
MongoDB存储
链接到目录页
关于ROS讲座的目录链接