首页 > 编程语言 >Cyber_RT-数据通信三层结构源码-Component-Node-transport

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

时间:2025-01-20 12:11:45浏览次数:1  
标签:RT Node service proto cyber public std 源码 class

数据通信三个层次

1.Component 是封装好的数据处理流程 
   
2.Node  Reader/Writer 或 Service/Client

3.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::CreateReader

02.cyber/node/node_channel_impl.h
  auto 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.h

03.cyber/node/writer.h
  class Writer : public WriterBase
cyber/node/reader.h  
 class Reader : public ReaderBase

04.cyber/node/reader_base.h
   class ReaderBase {	
   class ReceiverManager
cyber/node/writer_base.h
   class WriterBase {
   
cyber/service/client.h
  class Client : public ClientBase {	
cyber/service/client_base.h  
      class ClientBase {

cyber/service/service.h
    class Service : public ServiceBase {	
cyber/service/service_base.h	  
	 class ServiceBase {

数据通信-数据传输层

transport 工厂模式 -通过 Transport 创建 Transmitter 或 Receiver 进行通信
    cyber/transport/transport.h
	    auto Transport::CreateTransmitter
           transmitter = 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::CreateReceiver
		   std::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.h
	    class 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 Dispatcher
		class ShmDispatcher : public Dispatcher
		class RtpsDispatcher : public Dispatcher
		class 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。

通知--工程模式--NotifierFactory
 notifier_ = 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.h
    Parameter::Name()
    Parameter::Type()   TypeName() FromProtoParam   ToProtoParam
	Parameter::value() 
 通道 发送或接收消息。
 服务 是节点之间通信的另一种方式。 服务实现双向通信,例如节点通过发送请求获得响应。
		参数 都是apollo::cyber::Parameter 对象	  它负责管理系统配置和参数。
		
cyber/parameter/parameter_client.h	
    #include "cyber/node/node.h"	
		class ParameterClient{  GetParameter  SetParameter  ListParameters

cyber/parameter/parameter_server.h
    #include "cyber/service/service.h"	
	class ParameterServer { GetParameter  SetParameter ListParameters
	
cyber/parameter/parameter_service_names.h	
   "get_parameter";	  "set_parameter"; list_parameters";

Cyber RT

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

标签:RT,Node,service,proto,cyber,public,std,源码,class
From: https://www.cnblogs.com/ytwang/p/18681098

相关文章

  • C#网络调试助手源码(TCP/UDP)
    C#网络调试助手源码(TCP/UDP)文件列表NetWork/.vs/NetWork/v14/.suo , 47616NetWork/NetWork/App.config , 187NetWork/NetWork/bin/Debug/app.ini , 64NetWork/NetWork/bin/Debug/NetWork.exe , 28672NetWork/NetWork/bin/Debug/NetWork.exe.config , 187NetWor......
  • 前端人必知必会:Node.js进程深度剖析
    文章目录一、Node.js进程初相识二、Node.js进程核心概念2.1进程的基本定义2.2与线程的爱恨情仇2.3进程在Node.js架构中的角色三、Node.js进程相关模块3.1process模块:进程掌控者3.2child_process模块:子进程创建利器3.3cluster模块:多核CPU的完美搭档四、......
  • 深入Node.js工具函数:前端开发的得力助手
    文章目录引言1.Node.js工具函数基础1.1常用工具函数概述1.2工具函数与前端开发的关联2.核心工具函数解析2.1path模块2.1.1resolve函数2.1.2join函数2.2fs模块2.2.1readFile与writeFile2.2.2mkdir与rmdir2.3util模块2.3.1inherits函数2.3.2inspe......
  • 节省时间与成本:购买源码搭建体育比分网站的好处
    节省开发时间和成本快速上线:购买现成的源码,省去了从零开始开发的时间,可以更快地将网站或应用上线。降低成本:相比于从头开发,购买源码通常成本更低,尤其是对于复杂的功能。减少开发风险成熟的解决方案:现成的源码通常已经经过测试和使用,减少了开发过程中的不确定性和错误。技术......
  • Seata 源码
    作者:京东物流张士欣核心接口和类ResourceManagerResourceManager是seata的重要组件之一,RM负责管理分支数据资源的事务。  AbstractResourceManager实现ResourceManager提供模板方法。DefaultResourceManager适配所有的ResourceManager,所有方法调用都委派给对应......
  • Slate文档编辑器-Node节点与Path路径映射
    Slate文档编辑器-Node节点与Path路径映射在之前我们聊到了slate中的Decorator装饰器实现,装饰器可以为我们方便地在编辑器渲染调度时处理range的渲染,这在实现搜索替换、代码高亮等场景非常有用。那么在这篇文章中,我们聊一下Node节点与Path路径映射,这里的Node指的是渲染的节点对象,P......
  • sort算法的使用
     sort算法的使用望文生义,sort是STL内置的一个排序算法,其底层是由多个排序算法的配合的使用。需要包含的头文件#include<algorithm>使用sort(参数1,参数2,参数3)参数1:排序的左端点的迭代器或者地址参数2:排序的右端点的迭代器或者地址参数3:控制排序优先级的函数注意:......
  • 【一看就会】Autoware.universe的“规划”部分源码梳理【六】(behavior_path_planner第
    文章目录前言六、避障变道模块——autoware_behavior_path_avoidance_by_lane_change_module文件功能主次关系功能依赖说明核心文件-scene.cpp主要执行流程1.检查阶段2.数据更新阶段3.规划阶段辅助计算函数数据流向源码注释管理文件-manager.c......
  • Amazon Virtual Private Cloud(VPC)
    AmazonVirtualPrivateCloud(VPC)是AmazonWebServices(AWS)的一项强大服务,它提供了一个完全隔离的私有网络环境,使得用户能够在云中精细控制网络资源。以下是VPC更详细的功能和扩展内容:1.VPC网络设计和管理VPC允许你完全控制网络配置,包括:IP地址范围:你可以选择适合自己需求......
  • WebRTC 笔记
    目录通话建立流程特别提醒代码创建 RTCPeerConnection 对象获取本地摄像头/麦克风创建发起方会话描述对象(createOffer)连接的远程对等方属性(setRemoteDescription)建立一条最优的连接方式WebRTC允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的......