ros中使用mongdb_store
参考链接
http://wiki.ros.org/mongodb_store
https://github.com/strands-project/mongodb_store
配置mongodb数据库
我直接把mongodb_store git 下来放进自己的工作空间中。
自己建一个数据库路径,我在opt/ros/下建了一个文件夹为mongdb_store,去修改相应mongdb_store包下mongodb_store.launch中db_path参数指向的mongodb数据库路径。
编译完了就launch启动就完事了。
如果这样就ok了。
可能出现的问题
如出现 mongo process error! exit code=100这样的报错,百度一下,通过则将/var/lib/mongodb下的mongod.lock文件删除即可;
如出现 mongo process error! exit code=48 ,则因为未正常关闭mongod 导致,可以通过 ps aux|grep mongo 检查与mongod相关的任务队列,通过sudo kill <任务ID>结束进程。
若遇到mongo process error! exit code=100以上方法如果都不管用,那记得检查自己建的数据库文件夹的权限,将其改为777;之后确定系统没有在跑mongod的程序,检查方式如code=48时的解决方式;再将/var/lib/mongodb 下的mongodb.lock删除之后进行启动roslaunch mongodb_store mongodb_store.launch
出其他错的话再重新启动几次就可以了吧,别的情况也每遇到过。
数据库的使用
在mongdb_store包中(mongodb_store/mongodb_store/tests/)message_store_cpp_test.cpp以及(ongodb_store/mongodb_store/src/)example_mongodb_store_cpp_client.cpp基本把所提供的增删改查方式都进行了测试编写,可以以其作为demo进行编写。
通过name,ID等进行增改查没啥大问题,但删除一条数据好像只能通过DeleteID 成员函数进行删除,所以在insert一条数据时应将返回的ID进行保留,以在后面需要删除时进行删除。
各个怎删改查的成员函数在mongodb_store/mongodb_store/include/mongodb_store/下的 头文件中可以查看。
查找特定数据
会遇到这样的需求,基于某个存储类型数据的指定值进行检索相关的各条数据,使用例程大致如下:
messageStore = new MessageStoreProxy(n, "task_queue_store");
mongo::BSONObjBuilder task_builder;
vector< boost::shared_ptr<assistant_msgs::TaskQueue> > task_results;
task_builder.append("job_type.data",2);
if(messageStore->query<assistant_msgs::TaskQueue>(task_results,task_builder.obj(), mongo::BSONObj(), mongo::BSONObj(),false, 0)){
/*相关工作代码块*/
}
我在类中定义数据库messagestore :“task_queue_store”,定义查询结果存放的智能指针task_results,通过task_builder进行相关具体数据的查询写入,这里我的存入数据类型为assistant_msgs::TaskQueue,该类型下有std_msgs::Int64 类型的jod_type,查询"task_queue_store"中job_type为2的所有数据,再通过task_results读取。
在其他功能包中使用
在其他功能包的节点中使用MongoDB,在CMakeList.txt 中添加相应依赖,包括:
find_package(catkin REQUIRED COMPONENTS
mongodb_store_msgs
)
include_directories(
include
${catkin_INCLUDE_DIRS}
${MongoClient_INCLUDE_DIR}
)
link_directories(${MongoClient_LINK_DIRS})
target_link_libraries(<节点名>
message_store
${MongoClient_LIBRARIES}
${catkin_LIBRARIES} )
在package.xml中:
<build_depend>mongodb_store_msgs</build_depend>
<exec_depend>mongodb_store_msgs</exec_depend>
然后cpp中include:
#include "mongodb_store/message_store.h"
后面就可以存储一些自定义数据了,包括pose坐标点,各种传感器数据,队列等数据。