在Cyber RT中还提供了一些工具,这些工具可以拓展Cyber RT功能、提高开发调试效率,本章主要介绍这些工具的使用。
本章内容:
1.cyber record工具的应用;
2.常用命令工具的使用;
学习收获:
1.可以通过cyber record将发布的话题消息序列化到磁盘,可以延时、反复使用数据,并可以对数据做二次处理;
2.可以通过Cyber RT内置的命令工具灵活的获取节点、话题、服务等相关信息,提高开发调试效率。
cyber record
在开发调试过程中,实车路测是必不可少的环节之一,但是实车路测的人力成本和时间成本都是比较高为了降低研发成本,在Cyber RT中提供了工具: cyber record,它可以订阅消息并将之序列化(写)到文件,也可以从磁盘文件反序列化(读)并重新发布消息,这意味着我们可以在实际路测时,将所需数据其保存,后面再调试时可以直接回放数据,从而实现数据的复用。
概念
cyber record是用于序列化或反序列化话题话题消息的一个工具集。
作用
可以实现数据复用,在开发调试车载软件时降低成本提高效率。
需求
通过 cyber record 将学生信息写入磁盘文件,并再通过 cyber record 读取文件中的学生信息。
大致步骤如下:
1.序列化;
2.反序列化;
3.编译并执行。
准备:
需要先准备protobuf 数据,可以直接复用 student.proto文件;
在demo_cc文件夹下新建tools目录,并在 tools目录中新建BUILD文件;
1.序列化
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 const *argv[])
{// 1.初始化 cyber框架;apollo::cyber::Init(argv[0]);// 2.创建recorder写对象;RecordWriter writer;// 3.设置写出参数;writer.SetSizeOfFileSegmentation(0);writer.SetIntervalOfFileSegmentation(0);// 4.打开文件流;writer.Open("/apollo/cyber/demo_cc/tools/mytest.record");// 5.写出消息类型以及消息数据;//5.1话题//param1: 话题名词 param2: 消息类型 param3: 描述writer.WriteChannel("chatter","apollo.cyber.demo_base_proto.Student","test...");//5.2 消息for(size_t i=0;i<100;i++){//创建消息对象auto stu = std::make_shared<Student>();stu->set_name("feng");stu->set_age(7);stu->set_height(1.3);stu->add_books("C++1");stu->add_books("C++2");stu->add_books("C++3");//将对象转化为字符串std::string content;stu->SerializeToString(& content);//写出字符串writer.WriteMessage("chatter",content,1000+i);}// 6.关闭文件流。writer.Close();return 0;
}
BUILD文件:
cc_binary(name = "demo01_record_write",deps = ["//cyber","//cyber/demo_base_proto:student_cc"],srcs = ["demo01_record_write.cc"],
)
编译执行:
2.反序列化
demo_cc/tools 目录下新建C++文件 demo02_record_read.cc,输入如下内容:
/*需求:读取文件的Student数据。实现:1.包含头文件;2.初始化cyber框架;3.创建读取对象;4.读话题相关数据;5.读消息相关数据。
*///1.包含头文件;
#include "cyber/cyber.h"
#include "cyber/record/record_reader.h"
#include "cyber/record/record_message.h"using apollo::cyber::record::RecordReader;
using apollo::cyber::record::RecordMessage;int main(int argc, char const *argv[])
{// 2.初始化cyber框架;apollo::cyber::Init(argv[0]);// 3.创建读取对象;RecordReader reader("/apollo/cyber/demo_cc/tools/mytest.record");// 4.读话题相关数据;//声明读取的话题名称std::string channel = "chatter";//读取内容uint64_t count = reader.GetMessageNumber(channel);std::string msg_type = reader.GetMessageType(channel);std::string desc = reader.GetProtoDesc(channel);AINFO<<"消息数量: "<< count << ";";AINFO<<"消息类型: "<< msg_type<<";";AINFO<<"描述信息:" << desc;// 5.读消息相关数据。//创建 msg 对象,存储读到的消息RecordMessage msg;//编写循环读数据(解析消息)for(size_t i=0; i< count; i++){if(reader.ReadMessage(&msg)){//解析AINFO<<"话题名称:"<<msg.channel_name;AINFO<<"内容:"<<msg.content;AINFO<<"时间:"<<msg.time;AINFO<<"--------------------------------";}else{AINFO<<"读取失败";}}return 0;
}
BUILD 文件:
cc_binary(name = "demo02_record_read",deps = ["//cyber","//cyber/demo_base_proto:student_cc"],srcs = ["demo02_record_read.cc"],
)
常用命令
通信应用中可能会遇到的一些问题,比如:
调试时如何获取Cyber RT中运行的节点及其相关状态?
开发时编写完了发布节点,如何快速验证节点运行是否正常呢?如何判断消息发布的频率是否符合预期?
在Cyber RT中提供了一些命令工具,可以方便快捷的解决上述问题,常用的命令如下:
1.cyber_node;
2.cyber_channel;
3.cyber_service;
4.cyber_launch;
5.cyber_monitor;
6.cyber_record。
1.获取某个指令的使用说明,可以输入如下格式的命令
cyber_xxx -h
2.获取某个指令的某个参数的使用说明,可以输入如下格式的命令
cyber_xxx yyy -h
准备工作
启动多个节点,并在调用命令之前先加载环境变量
sourc cyber/setup.bash
1.cyber_node
用于获取Cyber RT中运行的节点的相关信息。
cyber_node list #列出所有运行中的节点
cyber_node info xxx #输出某个节点或所有节点信息
2.cyber_channel
获取关于话题的相关信息。
cyber_channel list #列出所有运行中的话题
cyber_channel info #输出话题相关信息(发布者、订阅者、消息类型....)
cyber_channel echo #输出话题消息
cyber_channel hz #输出话题消息的发布频率
cyber_channel bw #输出消息发布所占用带宽
cyber_channel type #输出话题消息类型
3.cyber_service
获取关于服务的相关信息
cyber_service list #列出所有运行中的服务
cyber_service info #输出某个服务的相关信息
4.cyber_launch
用于 launch 文件的启动和关闭
cyber_launch start #启动launch文件
cyber_launch stop #关闭launch文件
5.cyber_monitor
cyber_monitor可以在一个单独的窗体中以一种更综合的方式显示话题相关内容。
用法:
cyter_monitor[option]
option:-h 输出提示信息-c 指定某个话题
通用命令:q | Q |Esc --退出Backspace --返回上一步h | H --输出提示信息Common Commands for Topology and Channel Message:
常用命令PgOn| d --下一页PgUp | u--上一页w|W|up Arrow --上移一行s|S|Down Arrowe --下移一行d|D|Enter |Right Arrow --进入被选定的话题a|A|Left Arrow --返回上一层
消息显示相关命令:f|F -- 显示所有消息的频率t|T -- 显示消息类型Space -- 关闭或打开消息
进入某个话题后使用的命令:i|I -- 旦示话题的读写相关消息b|B -- 显示消息内容
显示消息重复字段的命令:n|N -- 重复字段的下一个元素m|M -- 重复字段的上一个元素, -- 关闭或打开重复显示字段的功能
6.cyber_recorder
cyber_recorder info #显示已经存在的record文件信息
cyber_recorder play # 回放record文件信息
cyber_recorder record #录制record文件
cyber_recorder split 分割 #record文件
cyber_recorder recover #复制record文件