Cyber RT 开发工具

news2025/1/20 0:55:29

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基础50刷题之一(交替合并字符串)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、题目二、力扣官方题解&#xff08;双指针&#xff09;三、文心一言解释总结 前言 刚上研一&#xff0c;有人劝我好好学C&#xff0c;当时用的不多就没学&a…

Javascript进阶课程——大纲

JavaScript进阶教程_哔哩哔哩_bilibili

Windows下 OracleXE_21 数据库的下载与安装

Oracle 数据库的下载与安装 数据库安装包下载数据库安装访问数据库进行测试Navicat连接数据库 1. 数据库安装包的下载 1.1 下载地址 Oracle Database Express Edition | Oracle 中国 1.2 点击“下载 Oracle Database XE”按钮&#xff0c;进去到下载页面&#xff08;选择对…

图论练习5

Going Home Here 解题思路 模板 二分图最优匹配&#xff0c;前提是有完美匹配&#xff08;即存在一一配对&#xff09;左右集合分别有顶标&#xff0c;当时&#xff0c;为有效边&#xff0c;即选中初始对于左集合每个点&#xff0c;选择其连边中最优的&#xff0c;然后对于每…

uniapp 解决请求出现 /sockjs-node/info?t=问题

1. uniapp请求出现 /sockjs-node/info?t问题 1.1. 问题 uniapp项目老是出现 http://192.168.2.106:8080/sockjs-node/info?t1709704280949 1.1. sockjs-node介绍 sockjs-node 是一个JavaScript库&#xff0c;提供跨浏览器JavaScript的API&#xff0c;创建了一个低延迟、全…

spring 注解缓存查询方法使用

spring-boot项目启动类上加注解: EnableCaching 查询方法注解: Cacheable

基于springboot的精准扶贫管理系统论文

精准扶贫管理系统 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了精准扶贫管理系统的开发全过程。通过分析精准扶贫管理系统管理的不足&#xff0c;创建了一个计算机管理精准扶贫管理系统的方案。文章介绍了精…

【Java JVM】Class 文件的加载

Java 虚拟机把描述类的数据从 Class 文件加载到内存, 并对数据进行校验, 转换解析和初始化, 最终形成可以被虚拟机直接使用的 Java 类型, 这个过程被称作虚拟机的类加载机制。 与那些在编译时需要进行连接的语言不同, 在 Java 语言里面, 类的加载, 连接和初始化过程都是在程序…

SpringBoot整合【RocketMQ】

目录 1.POM文件添加依赖及yml配置 2.RocketmqUtil 3.生产者&#xff08;异步发送示例&#xff09; 4.消费者 5.测试 1.POM文件添加依赖及yml配置 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter&l…

html--3D爱心

文章目录 代码效果 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>爱心</title><style type"text/css">*{margin: 0px;border: 0px;}body{overflow: hidden;background-…

简单整理vue-router,路由知识

1.项目中引入 1.1 安装注册 1.2 封装抽离 在main.js中 书写,会造成单个js文件过于臃肿的情况,需要将路由配置部分抽离出来,在src下新建router文件夹,新建index.js文件 import Vue from vue import VueRouter from vue-router import HomeView from ../views/HomeView.vue im…

Wireshark——获取指定协议的数据包

1、问题 使用Wireshark捕获了大量的数据包&#xff0c;但是只想要指定协议的数据包。 2、方法 例如&#xff0c;只想要Modbus/TCP协议的数据包。 在应用显示过滤器中输入协议的名称&#xff08;小写&#xff09;&#xff0c;回车。 选择文件&#xff0c;导出特定分组。 将所…

Matlab 机器人工具箱 RobotArm类

文章目录 1 RobotArm1.1 方法1.2 注意2 RobotArm.RobotArm3 RobotArm.cmove4 其他官网:Robotics Toolbox - Peter Corke 1 RobotArm 串联机械臂类 1.1 方法 方法描述plot显示机器人的图形表示teach驱动物理和图形机器人mirror使用机器人作为从机来驱动图形</

影响哈默纳科Harmonic减速机使用寿命的5大因素

哈默纳科HarmonicDrive减速机以其轻量、小型、传动效率高、减速范围广、精度高等特点&#xff0c;被广泛应用于各种传动系统中。然而&#xff0c;尽管哈默纳科Harmonic减速机具有诸多优势&#xff0c;但其使用寿命仍可能受到多种因素的影响。 首先&#xff0c;环境因素对哈默纳…

【ESP32 IDF快速入门】点亮第一个LED灯与流水灯

文章目录 前言一、有哪些工作模式&#xff1f;1.1 GPIO的详细介绍1.2 GPIO的内部框图输入模式输出部分 二、GPIO操作函数2.1 GPIO 汇总2.2 GPIO操作函数gpio_config配置引脚reset 引脚函数设置引脚电平选中对应引脚设置引脚的方向 2.3 点亮第一个灯 三、流水灯总结 前言 ESP32…

基于深度学习的苹果叶片病害检测系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 可以任意更换主干结构&#xff0c;支持几百种网络主干。 数据集&#xff1a;     网上下载的数据集&#x…

UE4 Niagara 关卡1.4官方案例解析

sprites can face the camera&#xff0c;or they can face any arbitrary vector&#xff0c;in this case the vector between the center of the system and the particle itself&#xff08;粒子可以面对摄影机&#xff0c;也可以面对任意向量&#xff0c;在这个实例中的向…

为国产信创服务器提供LDAP统一身份认证方案

金融信创作为 8 大行业信创之首&#xff0c;早已成为其他行业信创建设的参考。金融行业有着极为复杂的业务场景&#xff0c;对系统有着极高的稳定可靠需求&#xff0c;因此&#xff0c;在寻找微软 AD 国产化替代方案时&#xff0c;常会涉及到更深层次的场景。例如&#xff0c;最…

免费体验重保利器!AI加持智胜攻防,企业安全巡查活动等你加入

两会时刻&#xff0c;重保启动 今年&#xff0c;亚信安全护航重保 又有新“利器”加持 新增AI智能降噪算法的 “外部攻击面管理”服务 升级加入攻防“编制” 国内TOP级攻防专家团队&#xff0c;亚信安全北极狐高级攻防实验室赋能支撑&#xff0c;正式推出“攻防利器系列行动…

【b站咸虾米】1 Vue介绍 2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例

课程地址&#xff1a;【2021最新Vue从基础到实例高级_vue2_vuecli脚手架博客案例】 https://www.bilibili.com/video/BV1pz4y1S7bC/?share_sourcecopy_web&vd_sourceb1cb921b73fe3808550eaf2224d1c155 感觉尚硅谷的Vue看完忘得差不多了&#xff0c;且之前学过咸虾米的unia…