1. 程式人生 > 資料庫 >ros中使用mongodb資料庫的淺嘗--基於mongdb_store功能包

ros中使用mongodb資料庫的淺嘗--基於mongdb_store功能包

ros中使用mongdb_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座標點,各種感測器資料,佇列等資料。