在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文件