1. 程式人生 > 實用技巧 >ros訊息寫入檔案和用g++編譯roscpp程式從而讀取訊息檔案

ros訊息寫入檔案和用g++編譯roscpp程式從而讀取訊息檔案

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