Cyber-cyber开发工具

发布时间 2023-09-18 13:46:17作者: WTSRUVF

 

/*
cyber rt开发工具
    cyber record
        可以通过cyber recode将发布的话题消息序列化到磁盘,可以延时、反复使用数据,并可以对数据
        做二次处理
    常用cyber命令
        可以通过cyber rt内置的命令工具灵活的获取节点、话题、服务等相关信息,提高开发调试效率
*/
/*
    cyber record
        用于序列化(写磁盘文件)或反序列化(读磁盘文件)话题消息的一个工具集
        可以实现数据复用,在开发调试车载软件时降低成本提高效率
    需求
        通过cyber record将学生信息写入磁盘文件,并通过cyber record读取文件中的学生信息

    流程
        序列化
        反序列化
        编译并执行
    准备
        需要先准备protobuf数据,可以直接复用student.proto文件
        在demo_cc文件夹下新建tools目录,并在tools目录中新建BUILD文件

*/

///////////////////////////序列化cpp文件//////////////////////////////
// demo_cc/tools目录下新建c++文件demo01_record_write.cc
/*
    流程:
        1.初始化cyber框架
        2.创建recorder写对象
        3.设置写出参数
        4.打开文件流
        5.写出消息类型以及消息数据
        6.关闭文件流
*/
#include "cyber/cyber.h"
#include "cyber/record/record_writer.h"
#include "cyber/demo_base_proto/student.pb.h"

using apollo::cyber::record::RecordWriter;
using apollo::cyber::demo_base_proto::Student;

int main(int argc, char* argv[])
{
    apollo::cyber::Init(argv[0]);
    AINFO << "init...";
    RecordWriter writer;
    // 每一页的最大size
    writer.SetSizeOfFileSegmentation(0); 
    // 写interval时间后分页
    writer.SetIntervalOfFileSegmentation(0);
    // 打开文件流
    writer.Open("/apollo/cyber/demo_cc/tools/mytest.record");
    AINFO << "file : " << writer.GetFile();
    
    // 写出消息类型以及消息数据
    std::string channel = "chatter"; // 话题名称
    // 参数:话题名称,消息类型,描述
    writer.WriteChannel(channel, "apollo.cyber.demo_base_proto.Student", "test...");

    for(int i = 0; i < 100; i++){
        auto stu = std::make_shared<Student>();
        stu->set_name("zhangsan");
        stu->set_age(18);
        stu->set_height(1.76);
        
        // 将对象转化成字符串
        std::string content;
        stu->SerializeToString(&content);
        // 写出字符串
        writer.WriteMessage(channel, content, i);

    }

    // 关闭文件流
    writer.Close();


    return 0;
}

 

////////////////////////////////////////////////////////////////////

///////////////////////////BUILD文件/////////////////////////////////////////
cc_binary(
    name = "demo01_record_write_cc",
    srcs = ["demo01_record_write.cc"],
    deps = [
            "//cyber",
            "//cyber/demo_base_proto:student_proto_cc_lib"]

)

 

//////////////////////////////////////////////////////////////////////////

// bezal build cyber/demo_cc/tools/...
// source cyber/setup.bash

// ./bezal-bin/cyber/demo_cc/tools/demo01_record_write_cc



//////////////////////////////反序列化cpp文件//////////////////////////////////////
// demo_cc/tools目录下新建c++文件demo02_record_read.cc
#include "cyber/cyber.h"
#include "cyber/record/record_reader.h"
#include "cyber/demo_base_proto/student.pb.h"

using apollo::cyber::record::RecordReader;
using apollo::cyber::record::RecordMessage;
using apollo::cyber::demo_base_proto::Student;

int main(int argc, char* argv[])
{
    apollo::cyber::Init(argv[0]);
    AINFO << "init...";

    RecordReader reader("/apollo/cyber/demo_cc/tools/mytest.record");

    std::string channel = "chatter"; // 话题名称
    int64_t msg_count = reader.GetMessageNumber(channel); // 获取消息个数
    AINFO << "总共 " << msg_count << " 条消息";
    std::string msg_type = reader.GetMessageType(channel); // 获取消息类型
    std::string msg_desc = reader.GetProtoDesc(channel); // 获取消息描述
    AINFO << "消息类型:" << msg_type;
    AINFO << "消息描述:" << msg_desc;

    RecordMessage msg; // 存储消息

    for(int i = 0; i < msg_count; i++){
        if(reader.ReadMessage(&msg)){ // 读取消息
            AINFO << "" << i << " 条消息"
                  << "channel name: " << msg.channel_name
                  << "  content: " << msg.content
                  << "  msg time: " << msg.time;
        }
        else{
            AINFO << "消息读取失败";
        }

    }
    return 0;
}

 

/////////////////////////////////////////////////////////////////////////////
///////////////////////////BUILD文件/////////////////////////////////////////
cc_binary(
    name = "demo02_record_read_cc",
    srcs = ["demo02_record_read.cc"],
    deps = [
            "//cyber",
            "//cyber/demo_base_proto:student_proto_cc_lib"]

)

 

//////////////////////////////////////////////////////////////////////////