在ROS讲座108中,使用ROS和数据库(mongo)进行数据交互

环境

本文章正在以下环境中运行。

項目値CPUCore i5-8250UUbuntu16.04ROSKineticpython2.7.12mongodb2.6.10

有关安装,请参阅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讲座的目录链接

广告
将在 10 秒后关闭
bannerAds