ros訊息寫入檔案和用g++編譯roscpp程式從而讀取訊息檔案
阿新 • • 發佈:2020-08-27
1.將點雲訊息和geometry_msgs訊息寫入檔案:
std::stringstream buffer; std::time_t t = std::time(nullptr); std::tm tm = *std::localtime(&t); buffer << "/home/robot/data/PointCloud." << std::put_time(&tm, "%Y-%m-%d-%H-%M-%S"); std::string file_name = buffer.str(); int size = raw_points_.size();int size_int = sizeof(int); mkdir("/home/robot/data", S_IRWXU | S_IRWXG | S_IRWXO); std::ofstream ofs(file_name, std::ios::binary | std::ios::ate);//std::ios::ate從檔案尾部加入 ofs.write((char *)&size, size_int);//寫入int代表點雲數 ofs.write((char *)&raw_points_[0], sizeof(RawPoint) * size); ofs.close(); LOG_INFO("Save point cloud to:%s", file_name.c_str());
//std::stringstream 的clear()函式不清空快取區,所以使用buffer.str("")清空。 buffer.str(""); buffer << "/home/robot/data/RTK." << std::put_time(&tm, "%Y-%m-%d-%H-%M-%S"); file_name.clear();
file_name=buffer.str(); size=1;//這裡先假定pose大小為1,後期可調為實際快取的大小。 std::ofstream ofs_gps(file_name,std::ios::binary|std::ios::ate); ofs_gps.write((char *)&size,size_int);//把資料大小以int寫入檔案 ofs_gps.write((char *)&gps_,sizeof(geometry_msgs::Pose)*size);//sizeof測量的是資料結構的大小 ofs_gps.close(); LOG_INFO("Save GPS to:%s",file_name.c_str());
2.不使用cmake來編譯包含ros標頭檔案的程式,使用該程式測試下儲存的資料是否有問題
#include <iostream> #include <string> #include <vector> #include <fstream> #include <ros/ros.h> #include <geometry_msgs/Pose.h> int main(){ std::vector<geometry_msgs::Pose> gps_; std::ifstream ifs ("/home/robot/data/RTK.2020-08-27-18-47-15", std::ios::binary | std::ios::in); if (ifs.is_open()) { size_t size = 0; ifs.read(reinterpret_cast<char *>(&size), sizeof(int)); std::cout<<size<<std::endl; gps_.resize(size);//調整容器的大小以裝檔案中的訊息。 ifs.read(reinterpret_cast<char *>(&gps_[0]), sizeof(geometry_msgs::Pose) * size); ifs.close(); for (int i=0;i<gps_.size();i++){ std::cout<<"position:"<<gps_[i].position.x<<std::endl
<<gps_[i].position.y<<std::endl
<<gps_[i].position.z<<std::endl
<<"orientation:"<<std::endl
<<gps_[i].orientation.x<<std::endl
<<gps_[i].orientation.y<<std::endl
<<gps_[i].orientation.z<<std::endl
<<gps_[i].orientation.w<<std::endl; } } return 0; }
編譯方式(告知g++庫的位置即可):
g++ -std=c++11 readTimeStamp.cpp -o read -I/opt/ros/kinetic/include -L/opt/ros/kinetic/lib