Cyber_RT-数据通信三层结构源码-Component-Node-transport

news/2025/1/20 12:06:28/文章来源:https://www.cnblogs.com/ytwang/p/18681098

数据通信三个层次

1.Component 是封装好的数据处理流程 2.Node  Reader/Writer 或 Service/Client3.Transport 创建 Transmitter 或 Receiver

Component

  Component 是封装好的数据处理流程 Dag 文件是模块拓扑关系的配置文件Launch 文件提供了一种启动模块的简单方法

Node

通过Node创建Reader或Writer进行通信
Node 是整个数据拓扑网络中的基本单元。通过在节点中定义 Reader/Writer 或 Service/Client,

cyber/node/node.h    #include "cyber/node/node_channel_impl.h"#include "cyber/node/node_service_impl.h"01.class Node {public:template <typename M0, typename M1, typename M2, typename M3>friend class Component;friend class TimerComponent;auto CreateService(const std::string& service_name,const typename Service<Request, Response>::ServiceCallback&service_callback)-> std::shared_ptr<Service<Request, Response>>;auto CreateClient(const std::string& service_name)-> std::shared_ptr<Client<Request, Response>>;	CreateService DeleteReader   Node::CreateReader02.cyber/node/node_channel_impl.hauto CreateWriter(const std::string& channel_name)-> std::shared_ptr<Writer<MessageT>>;	   auto CreateReader(const ReaderConfig& config, const CallbackFunc<MessageT>& reader_func)-> std::shared_ptr<Reader<MessageT>>;
cyber/node/node_service_impl.h03.cyber/node/writer.hclass Writer : public WriterBase
cyber/node/reader.h  class Reader : public ReaderBase04.cyber/node/reader_base.hclass ReaderBase {	class ReceiverManager
cyber/node/writer_base.hclass WriterBase {cyber/service/client.hclass Client : public ClientBase {	
cyber/service/client_base.h  class ClientBase {cyber/service/service.hclass Service : public ServiceBase {	
cyber/service/service_base.h	  class ServiceBase {

数据通信-数据传输层

transport 工厂模式 -通过 Transport 创建 Transmitter 或 Receiver 进行通信cyber/transport/transport.hauto Transport::CreateTransmittertransmitter = std::make_shared<IntraTransmitter<M>>(modified_attr);transmitter = std::make_shared<ShmTransmitter<M>>(modified_attr);std::make_shared<RtpsTransmitter<M>>(modified_attr, participant());std::make_shared<HybridTransmitter<M>>(modified_attr, participant());auto Transport::CreateReceiverstd::make_shared<IntraReceiver<M>>(modified_attr, msg_listener);std::make_shared<ShmReceiver<M>>(modified_attr, msg_listener);std::make_shared<RtpsReceiver<M>>(modified_attr, msg_listener);std::make_shared<HybridReceiver<M>>( modified_attr, msg_listener, participant());IntraDispatcher::Instance(); ShmDispatcher::Instance(); RtpsDispatcher::Instance();  
Transmitter和Receiver各有三个派生类,对应Cyber的三种数据传输方式 ,分别是进程内(Intra) 进程间(Shm))以及网络(RTPS)		cyber/transport/transmitter/transmitter.hclass IntraTransmitter : public Transmitter<M> class ShmTransmitter : public Transmitter<M> class RtpsTransmitter : public Transmitter<M> 		class HybridTransmitter : public Transmitter<M>cyber/transport/receiver/receiver.h	  class Receiver : public Endpoint class IntraReceiver : public Receiver<M>class ShmReceiver : public Receiver<M>class RtpsReceiver : public Receiver<M>class HybridReceiver : public Receiver<M>cyber/transport/dispatcher/dispatcher.h	class IntraDispatcher : public Dispatcherclass ShmDispatcher : public Dispatcherclass RtpsDispatcher : public Dispatcherclass SubscriberListener : public eprosima::fastdds::dds::SubscriberListener
01.进程内 Intra  传输使用的是函数直接调用(回调)的方式			1.上层 Writer ---> IntraTransmitter ---> IntraDispatcher--->(回调)IntraReceiver ---> (回调)上层Reader。
02.进程间 Shm (本机)传输是通过共享内存辅助实现。链用链条是:		1、上层Writer---> Segment(共享内存)和Notifier(发送通知)2、ShmDispatcher(有独立线程)---> (主动读取)Segment---> (回调)上层Reader。03.主机间-Rtps(路网络)传输是通过RTPS(DDS)实现。链用链条是:1、上层Writer--->RtpsTransmitter 打包成protobuf---> fastrtps发送到网络。2、fastrtps接收到网络报文---> (回调)RtpsDispatcher ---> (回调)RtpsReceiver---> (回调)上层Reader。通知--工程模式--NotifierFactorynotifier_ = NotifierFactory::CreateNotifier();notifier_type = g_conf.transport_conf().shm_conf().notifier_type();NotifierFactory::CreateConditionNotifier()NotifierFactory::CreateMulticastNotifier()数据分发器 DataDispather 和数据访问器   DataVistor     DataNotifier 用于唤醒协程任务DataDispatcher 进行消息分发, DataVisitor 允许用户自定义通道和缓冲区大小
ChannelBuffer 实现缓冲区管理,

数据通信-service_discovery

cyber/service_discovery/topology_manager.h	 Participant 类封装fastrtps接口成员 participant_ 是 Participant实例Manager 基于 Participant 管理 topology消息的收发NodeManager  ChannelManager ServiceManager 并有共同的基类Manager TopologyManager  初始化三个子管理器 - NodeManager 用于管理网络拓扑中的节点。- ChannelManager用于管理channel,即网络拓扑中的边。- ServiceManager用于管理Service和Client。   	
cyber/service_discovery/topology_manager.cc	node_manager_ = std::make_shared<NodeManager>();channel_manager_ = std::make_shared<ChannelManager>();service_manager_ = std::make_shared<ServiceManager>();class NodeManager : public Manager {class ChannelManager : public Manager { friend class TopologyManager;class ServiceManager : public Manager {

参数-parameter

cyber/parameter/parameter.hParameter::Name()Parameter::Type()   TypeName() FromProtoParam   ToProtoParamParameter::value() 通道 发送或接收消息。服务 是节点之间通信的另一种方式。 服务实现双向通信,例如节点通过发送请求获得响应。参数 都是apollo::cyber::Parameter 对象	  它负责管理系统配置和参数。cyber/parameter/parameter_client.h	#include "cyber/node/node.h"	class ParameterClient{  GetParameter  SetParameter  ListParameterscyber/parameter/parameter_server.h#include "cyber/service/service.h"	class ParameterServer { GetParameter  SetParameter ListParameterscyber/parameter/parameter_service_names.h	"get_parameter";	  "set_parameter"; list_parameters";

Cyber RT

 目前对整理的框架有了粗浅的了解,更进一步处理对源码进行处理基本概念--数据通信-任务调度-变化通知两部分proto ,一部分放在了 cyber/proto/,另外一部分放在了各个模块modules/common_msgs/sensor_msgs/pointcloud.protomodules/common_msgs/sensor_msgs/sensor_image.protomodules/data/proto/frame.proto

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.protoComponentConfigTimerComponentConfig {
cyber/proto/dag_conf.protoComponentInfo  TimerComponentInfoModuleConfig  DagConfig
cyber/proto/qos_profile.proto	  cyber/proto/transport_conf.proto	 cyber/proto/role_attributes.proto
cyber/proto/topology_change.protocyber/proto/scheduler_conf.proto
cyber/proto/choreography_conf.proto
cyber/proto/classic_conf.protocyber/proto/run_mode_conf.proto
cyber/proto/record.protocyber/proto/proto_desc.proto
cyber/proto/parameter.proto
cyber/proto/perf_conf.proto

自动驾驶

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

参考

https://apollo.baidu.com/docs/apollo/latest/rtps__transmitter_8h.html
https://blog.csdn.net/deyili/article/details/120327777
自动驾驶开发入门(三)---浅谈Apollo Cyber RT中的Transport
Apollo 应用与源码分析:CyberRT-服务通信与参数服务器

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用效率驱动增长:直播团队如何协同工作?

一、企业增长离不开效率提升 在直播电商领域,企业的增长速度往往与团队运营效率息息相关。一个高效的直播团队不仅可以降低运营成本,还能快速响应市场需求,抓住增长机遇。然而,大多数团队仍在效率优化上存在不足。二、直播团队效率低下的常见问题- 1. 任务堆积:未能合理分…

2025年安卓苹果手机有哪些好用的日记本app推荐?

进入2025年,有很多人想要直接在手机上随手写每天的日记,那么安卓或苹果手机上有哪些好用的日记本app推荐呢? 今天来介绍四款简单又好用的手机版写日记的app软件,总有一款是适合你的。 一、手机系统自带便签/备忘录/笔记工具 不管你用的是哪款手机,手机上都有系统自带的便签…

Silicon Labs C8051F020 单片机 USB Debug Adapter适配器调试无法连接问题

在做单片机大作业,使用Keil,使用USB连接开发板。想要进入到调试或烧录功能时总是报错: Cannot connect to the selected USB debug adapterToolStick base adapter. Please check that the device is plugged in and not already in use 如图:首先按照老师发的教程逐个复查…

C# PriorityQueue优先队列

namespace PriorityQueueDemo {public class Task{public string Name { get; set; } }public class TaskPriorityComparer : IComparer<(int, int)>{public int Compare((int, int) x, (int, int) y){// 首先比较紧急程度,然后比较重要性int compareUrgency = x.Item1.…

如何修改网站后台登录地址以避免触发安全规则?

在某些情况下,网站后台登录地址可能会触发安全规则,导致无法正常登录。可以通过修改后台登录地址来避免这种情况。以下是具体步骤:修改目录名称:将后台目录名称修改为不包含敏感关键词的名称,例如将admin修改为admin-。 更新配置文件:确保所有配置文件中的后台路径指向新…

Vue2_了解核心概念和一个示例工程

本文做了简要的 Vue2 核心概念和示例工程介绍,包括两种 Vue 实例的挂载方式,并对比两者的区别;简单介绍了响应式,包括 data 对象内的数据,使用计算属性,使用 v-model 双向绑定,使用了 button 和 input 做了交互Vue2_了解核心概念和一个示例工程 写文的目的是为了梳理知识…

如何解决FTP连接超时问题?

在使用FTP连接时,如果遇到超时问题,可能是由于网络配置或服务器设置不当导致的。以下是具体步骤:检查FTP端口:确保FTP端口(默认为21)在服务器防火墙中已开放。 检查本地网络:确保本地网络连接正常,尝试更换网络环境后重新连接。 使用替代FTP地址:如果使用的是特定的FT…

如何下载文件到电脑桌面?

将文件从远程服务器下载到本地电脑桌面的操作看似简单,但对于初次接触此类任务的朋友来说,仍需掌握一些基本技巧。下面我们将详细介绍几种常用的下载方法,帮助您顺利完成操作。 方法一:通过FTP客户端下载 FTP(文件传输协议)是一种广泛应用于互联网上的标准协议,用于在客…

网站登录无响应,如何排查和解决?

您好,当您在尝试登录网站时遇到无响应的情况,这可能是由多种因素引起的。为了帮助您更有效地解决问题,我们将从以下几个方面进行详细分析,并提供相应的解决方案。 1. 服务器状态检查 首先,确保您的云服务器处于正常运行状态。服务器的意外重启或负载过高都可能导致网站无法…

如何解决虚拟主机上的数据库导入失败问题?

当您在虚拟主机上尝试导入数据库时遇到失败,这通常是由几个常见原因造成的。为了帮助您顺利解决问题,我们将从以下几个角度出发,为您提供详细的解决方案。 1. 确认数据库文件格式 首先,确保您要导入的SQL文件是正确的格式,并且与目标数据库版本兼容。不同版本的MySQL/Mari…

如何处理服务器遭受DDoS攻击后被封禁的情况?

当服务器遭遇大规模DDoS攻击并因此被封禁时,用户将面临严重的访问障碍。为了解决这一问题,您可以参考以下详细的解决方案:评估当前状况:首先明确攻击的具体情况,包括流量大小、持续时间以及受影响的服务范围。根据服务商提供的信息,了解封禁政策及其解除条件。一般情况下…

服务器升级配置后无法启动的原因及解决办法

在对服务器进行配置升级后,如果遇到无法启动的情况,可能是由以下几个方面的原因造成的:磁盘分区问题:某些情况下,升级过程中可能会出现磁盘分区丢失或损坏的现象。这会导致系统无法找到根文件系统,从而无法正常启动。此时,可以通过进入单用户模式来修复这个问题。具体做…