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

在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐