Cyber-cyber开发工具
/* 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"] )
//////////////////////////////////////////////////////////////////////////
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。