记录数据
Rosbag ROS
ROS中通过record.cpp 调用Recorder 类来进行bag的保存
rosbag record 的代码位于 ros_comm\tools\rosbag\src\recorder.cpp 中。实现的类主要为Recorder。
Recorder的接口,一共有4个。总的来说,录制bag包的流程分为2个部分,
一个流程订阅消息,并且放入队列,
另一个流程从队列中读取消息,并且保存到bag文件中。
doTrigger
01.subscribe 订阅指定的topic消息,并且返回Subscriber
02.订阅的消息通过doQueue来放入队列。
void Recorder::doQueue(const ros::MessageEvent<topic_tools::ShapeShifter const>& msg_event,
string const& topic,
shared_ptr<ros::Subscriber> subscriber, shared_ptr<int> count) {
03.int Recorder::run() { 启动了另一个线程record_thread来进行录制
04.void Recorder::doRecord() { doRecord 读取消息,并且写入bag文件,其中会检查磁盘和是否超过最大间隔还没接收消息
Record CyberRT
1.录制数据-工具
cyber_recorder
cyber_recorder 是一个功能强大的工具,支持录制、回放、查询、分割和修复 Cyber RT 的通信数据
record play info split recover
name = "recorder",
srcs = [
"recorder.cc", "info.cc", "recoverer.cc",
"spliter.cc", "player/play_task.cc", "player/play_task_buffer.cc",
"player/play_task_consumer.cc", "player/play_task_producer.cc",
"player/player.cc",
],
hdrs = [
"recorder.h", "info.h", "recoverer.h", "spliter.h",
"player/play_param.h", "player/play_task.h",
"player/play_task_buffer.h", "player/play_task_consumer.h",
"player/play_task_producer.h", "player/player.h",
],
入口函数
cyber/tools/cyber_recorder/main.cc
auto recorder = std::make_shared<Recorder>(opt_output_vec[0],
opt_all,
opt_white_channels,
opt_black_channels, opt_header);
bool record_result = recorder->Start();
2.定义的数据结构和文件结构以及操作
01.record 结构
cyber/proto/record.proto
cyber/proto/proto_desc.proto
cyber/record/file/section.h 只包含类型和长度 struct Section { proto::SectionType type;int64_t size; };
02.record 读写
cyber/record/file/record_file_base.h
cyber/record/file/record_file_reader
cyber/record/file/record_file_writer
cyber/record/[header_build record_base]
cyber/record/record_reader 回放
cyber/record/record_viewer 多通道回放 RecordViewer
cyber/record/record_writer 录制文件:按时间分段也可以按大小分段
apollo_cc_library(
name = "cyber_record",
srcs = [
"header_builder.cc",
"record_reader.cc",
"record_viewer.cc",
"record_writer.cc",
"file/record_file_base.cc",
"file/record_file_reader.cc",
"file/record_file_writer.cc",
],
hdrs = [
"header_builder.h",
"record_base.h",
"record_message.h",
"record_reader.h",
"record_viewer.h",
"record_writer.h",
"file/record_file_base.h",
"file/record_file_reader.h",
"file/record_file_writer.h",
"file/section.h",
],
deps = [
"//cyber/common:cyber_common",
"//cyber/proto:record_cc_proto",
"//cyber/time:cyber_time",
"@com_google_protobuf//:protobuf",
"//cyber/message:cyber_message",
],
)
命令行工具集
tools
cyber_node cyber_channel cyber_launch cyber_monitor
cyber_service cyber_recorder
分为两类
一类是通过python脚本
cyber/tools/cyber_channel/cyber_channel.py
cyber/tools/cyber_launch/cyber_launch.py
cyber/tools/cyber_node/cyber_node.py
cyber/tools/cyber_performance/cyber_performance.py
cyber/tools/cyber_service/cyber_service.py
from cyber.python.cyber_py3 import cyber_time
from cyber.python.cyber_py3 import cyber
from cyber.proto.role_attributes_pb2 import RoleAttributes
一类是通过C++源码
cyber/tools/cyber_monitor
cyber/tools/cyber_recorder
/recorder.cc
自定义命令行
01.框架搭建和功能实现
02.修改 tools 下的 BUILD 与 cyber_tools_auto_complete.bash 这两个配置文件
BUILD 文件添加 cyber_param 的相关依赖
cyber_tools_auto_complete.bash 文件需要添加如下内容
03.修改 /apollo/cyber/setup.bash setup.bash 中需要设置 cyber_param 相关参数 cyber/setup.bash
recorder_path="${cyber_tool_path}/cyber_recorder"
launch_path="${cyber_tool_path}/cyber_launch"
for entry in "${mainboard_path}" \
04. 编译
其他--命令说明
命令补全 任意的一个shell里面输入 com紧接着【tab】,这个是命令补全,只要命令在系统的shell的环境变量里,就可以补全,无需特别设置。
bash 提供的补全功能。默认的补全脚本保存在 /etc/bash_completion.d 目录下
命令参数补全 实现自动补全的功能,涉及到两个两个命令 complete 和 compgen
设置 complete 参数补全
complete -d 命令---设置命令的参数为 文件夹
complete -W "词组" 命令 ---设置命令的参数为词组
complete -F function 执行function函数,把函数中生成COMPREPLY作为候选的补全结果
compgen(筛选命令) 这个命令,用来筛选生成 匹配单词的 候选补全结果
-W wordlist 分割 wordlist 中的单词,生成候选补全列表
compopt(修改补全命令设置)这个命令可以修改补全命令设置,注意了,这个命令必须在补全函数中使用,否则会报错
设置命令补全后不要多加空格 compopt -o nospace
Python API
C++中开发程序并提供Python API通常涉及以下步骤:
使用C++编写你的核心功能。
使用Python的C API或者现代的方法,如Boost.Python、pybind11来创建Python可调用的封装。
CyberRT是使用了 cyber_py3 中使用了ctypes importlib ,即Python的C API
Python API有 cyber record
如何使用API接口
Cyber RT Python API
from cyber.python.cyber_py3 import cyber
cyber.init()
if not cyber.ok():
pass
cyber.shutdown()
如何定义python API接口
cyber/python/cyber_py3/cyber.py
import ctypes
import importlib
from google.protobuf.descriptor_pb2 import FileDescriptorProto
cyber/python/cyber/python/cyber_py3
//cyber/python/internal:_cyber_wrapper.so"
//cyber/python/internal:_cyber_timer_wrapper.so
//cyber/python/internal:_cyber_parameter_wrapper.so
//cyber/python/internal:_cyber_record_wrapper.so
#include <Python.h> 自定义扩展类型 使用 ctypes 模块或 cffi 库
Python API(应用程序编程接口)定义了一系列函数、宏和变量,可以访问 Python 运行时系统的大部分内容。
Python 的 API 可以通过在一个 C 源文件中引用 "Python.h" 头文件来使用。
cmake_minimum_required(VERSION 3.1)
project(LatLon2UTM)
include_directories(./include/)
SET(LIBLatLon2UTM_SRC src/LatLon2UTM.cpp)
# C++ 库
ADD_LIBRARY(LatLon2UTM_core SHARED ${LIBLatLon2UTM_SRC})
SET_TARGET_PROPERTIES(LatLon2UTM_core PROPERTIES OUTPUT_NAME "LatLon2utm_core")
参考
rosbag record代码分析 https://zhuanlan.zhihu.com/p/438698296
百度Apollo智能驾驶之CyberRT__自定义cyber_param命令行工具 https://blog.csdn.net/qq_22701545/article/details/124539300
rosbag record代码分析 https://zhuanlan.zhihu.com/p/438698296
https://apollo.baidu.com/docs/apollo/latest/classapollo_1_1cyber_1_1record_1_1Recorder.html
标签:补全,cc,CyberRT,cyber,record,源码,file,recorder
From: https://www.cnblogs.com/ytwang/p/18675404