消息和数据

Message 用Message实现模块间通信,其实现基于protobuf
cyber/message/message_traits.h
cyber/message/raw_message_traits.h
cyber/message/raw_message.h
cyber/message/arena_message_wrapper.h
cyber/message/protobuf_factory.h

cyber/data data
cyber/data/data_visitor.h
class DataVisitor : public DataVisitorBase {
DataVisitor在Component::Initialize和Reader::Init中都会创建,是实际环境中获取数据的方式。
它最终会调用到AllLatest::Fusion函数。
每个 DataVisitor 的每个消息种类都会有一个缓存 ChannelBuffer,
在初始化的时候这些 ChannelBuffer 都会被加入到 DataDispatcher 中的一张map中。
而所有种类的消息还会有一个消息整合体的 ChannelBuffer

cyber/data/data_visitor_base.h
class DataVisitorBase {

cyber/data/fusion/all_latest.h
#include "cyber/data/channel_buffer.h"
#include "cyber/data/fusion/data_fusion.h"

cyber/data/fusion/data_fusion.h
class DataFusion {
cyber/data/cache_buffer.h
class CacheBuffer {
cyber/data/data_dispatcher.h
class DataDispatcher {

cyber/data/channel_buffer.h
class ChannelBuffer {

cyber/data/data_notifier.h

有多个种类消息的DataVisitor还是只有一个Notifier对应M0,也就是说只有当M0消息来的时候协程会被唤醒并通过DataFusion来获取整合所有种类的信息
DataDispatcher 也是一个全局单例,记录了一个channel_id对应vector<std::weak_ptr<CacheBufferstd::shared_ptr>>的map

基础

include "cyber/base/macros.h" cyber/base/arena_queue.h cyber/base/bounded_queue.h cyber/base/signal.h

include "cyber/common/macros.h" cyber/common/environment.h cyber/common/file.h cyber/common/log.h

include "cyber/io/poll_data.h" cyber/io/session.h

include "cyber/time/time.h"

common模块 ,是整个cyber的重要的基础模块之一,其他模块基本都对其有所依赖
cyber/base
BoundedQueue,用于实现一个固定大小的线程安全队列,该队列支持多个线程同时进行出队和入队操作
signal.h。这份文件中,实现了一个简单的信号-槽机制,也是一种观察者模式的设计,信号-槽机制是一种用于组件之间的事件驱动编程的设计模式

包和tool

cyber/record/record_base.h
cyber/tools/cyber_recorder/recorder.h

性能记录

1.log日志
基于glog
cyber/logger/logger.h
class Logger : public google::base::Logger {

2.Event : 代码插桩+文件打印
cyber/event/perf_event_cache.h
class PerfEventCache {
PerfEventCache::PerfEventCache() {
PerfEventCache::AddSchedEvent
PerfEventCache::AddTransportEvent(
cyber/event/perf_event.h
enum class EventType { SCHED_EVENT = 0, TRANS_EVENT = 1, TRY_FETCH_EVENT = 3 };
event::PerfEventCache::Instance () ==> 创建perf对象

class SchedEvent : public EventBase {
class TransportEvent : public EventBase {

Blocker里注册 的回调函数应该都是管理员注册的监控函数
Blocker是Reader的一个成员,BlockerManager保存了全局的一张channel_name对应Blocker的map
3.cyber/statistics/statistics.h
#include "third_party/var/bvar/bvar.h"
#include "third_party/var/bvar/bvar.h
:bvar是多线程环境下的计数器类库,方便记录和查看用户程序中的各类数值,它利用了thread local存储减少了cache bouncing
using LatencyVarPtr = std::shared_ptr<::bvar::LatencyRecorder>;
using StatusVarPtr = std::shared_ptr<::bvar::Status<uint64_t>>;
using AdderVarPtr = std::shared_ptr<::bvar::Adder<int32_t>>;
bvar中很重要的一个组件,bvar除了是一个性能优秀的计数器,设计的最重要的使用场景就是监控,
通过了解bvar::Adder和bvar::LatencyRecorder两个类,
百度开源RPC框架brpc源码解析

4.cyber/blocker/blocker_manager.h
Blocker是 Reader的一个成员,BlockerManager保存了全局的一张channel_name对应Blocker的map
cyber/blocker/blocker.h
class BlockerBase {

cyber/blocker/blocker_manager.h
class BlockerManager {

cyber/blocker/intra_reader.h
cyber/blocker/intra_writer.h

proto数据

两部分proto ,
一部分放在了 cyber/proto/,
另外一部分放在了各个模块
modules/common_msgs/sensor_msgs/pointcloud.proto
modules/common_msgs/sensor_msgs/sensor_image.proto
modules/data/proto/frame.proto
cyber/proto/cyber_conf.proto
message CyberConfig {
optional SchedulerConf scheduler_conf = 1;
optional TransportConf transport_conf = 2;
optional RunModeConf run_mode_conf = 3;
optional PerfConf perf_conf = 4;
}

cyber/proto/component_conf.proto
ComponentConfig
TimerComponentConfig {
cyber/proto/dag_conf.proto
ComponentInfo TimerComponentInfo
ModuleConfig DagConfig
cyber/proto/qos_profile.proto

cyber/proto/transport_conf.proto

cyber/proto/role_attributes.proto
cyber/proto/topology_change.proto

cyber/proto/scheduler_conf.proto
cyber/proto/choreography_conf.proto
cyber/proto/classic_conf.proto

cyber/proto/run_mode_conf.proto
cyber/proto/record.proto

cyber/proto/proto_desc.proto
cyber/proto/parameter.proto
cyber/proto/perf_conf.proto

自动驾驶

Apollo的bridge模块UDP数据的格式。
Apollo的bridge模块通过UDP协议发送的基本数据被称为帧,其由首部和数据组成。
在UDPBridgeSenderComponent::Proc函数当中,
protobuf数据首先进行序列化,然后将其根据参数FRAME_SIZE分割为一个个大小相同的数据块,
为每个数据块添加首部后,就组成了一个个的帧,然后将所有的帧发送发送
cyber_launch start /apollo/modules/bridge/launch/bridge_receiver.launch

参考

苯苯的嗷呜-CyberRt 源码解读(十六 https://zhuanlan.zhihu.com/p/656700246

posted on 2025-01-20 17:51  辰令  阅读(112)  评论(0)    收藏  举报