服务发现全流程解析-APOLLO7.0

cyber服务发现完全依赖于fastDDS,下面从底层一步一步看下服务发现的整个过程。

topology_manager.cc

首先从这个类看起,这个类是和dds接壤的,dds发现后,完全由这个类接管,然后整体开始通信。

TopologyManager::TopologyManager(): init_(false),node_manager_(nullptr),channel_manager_(nullptr),service_manager_(nullptr),participant_(nullptr),participant_listener_(nullptr) {Init();
}

从上面的构造函数开始分析,除了赋值一些变量,还有就是调用了init函数, 其中node_manager_、channel_manager_、service_manager_是拓扑结构的一些类成员,participant_、participant_listener_很明显就是FAST_RTPS内部的参与者以及监听事件。紧接着进行了init初始化。

init

init函数就是整个topology_manager初始化的过程,下面逐步分析代码。

bool TopologyManager::Init() {if (init_.exchange(true)) {return true;}node_manager_ = std::make_shared<NodeManager>();channel_manager_ = std::make_shared<ChannelManager>();service_manager_ = std::make_shared<ServiceManager>();CreateParticipant();bool result =InitNodeManager() && InitChannelManager() && InitServiceManager();if (!result) {AERROR << "init manager failed.";participant_ = nullptr;delete participant_listener_;participant_listener_ = nullptr;node_manager_ = nullptr;channel_manager_ = nullptr;service_manager_ = nullptr;init_.store(false);return false;}return true;
}

上面首先是创建了三个share_ptr,分别对应NodeManager、ChannelManager、ServiceManager单个类,然后调用CreateParticipant创建participant_。然后对于三个mangger进行了初始化操作,,我们逐步进入分析。

node_manager_ = std::make_shared<NodeManager>();

首先就是上面的代码创建nodemanger,具体要看nodemanger类里面干了啥,所以暂时跳转到nodemanger.cc.

NodeManager、ChannelManager、ServiceManager他们三个都继承了manger类,主要用于记录节点间的关系及节点网络的图结构,紧接着,调用了CreateParticipant函数创建participant,再调用了initNodeMangger去初始化,具体要看函数实现。

CreateParticipant

bool TopologyManager::CreateParticipant() {std::string participant_name =common::GlobalData::Instance()->HostName() + '+' +std::to_string(common::GlobalData::Instance()->ProcessId());participant_listener_ = new ParticipantListener(std::bind(&TopologyManager::OnParticipantChange, this, std::placeholders::_1));participant_ = std::make_shared<transport::Participant>(participant_name, 11511, participant_listener_);return true;
}

这个函数就是使用fastdds的接口创建一个用于全局服务发现的participant,对于cyber的rtps相关的操作,可以看下participant.cc,里面可以看到和rtps官方demo一样的代码,用于通信。participant.cc中官方又封装了一层,然后来初始化和创建participant。

participant
Participant::Participant(const std::string& name, int send_port,eprosima::fastrtps::ParticipantListener* listener): shutdown_(false),name_(name),send_port_(send_port),listener_(listener),fastrtps_participant_(nullptr) {}eprosima::fastrtps::Participant* Participant::fastrtps_participant() {if (shutdown_.load()) {return nullptr;}std::lock_guard<std::mutex> lk(mutex_);if (fastrtps_participant_ != nullptr) {return fastrtps_participant_;}CreateFastRtpsParticipant(name_, send_port_, listener_);return fastrtps_participant_;
}void Participant::CreateFastRtpsParticipant(const std::string& name, int send_port,eprosima::fastrtps::ParticipantListener* listener) {uint32_t domain_id = 80;const char* val = ::getenv("CYBER_DOMAIN_ID");if (val != nullptr) {try {domain_id = std::stoi(val);} catch (const std::exception& e) {AERROR << "convert domain_id error " << e.what();return;}}auto part_attr_conf = std::make_shared<proto::RtpsParticipantAttr>();auto& global_conf = common::GlobalData::Instance()->Config();if (global_conf.has_transport_conf() &&global_conf.transport_conf().has_participant_attr()) {part_attr_conf->CopyFrom(global_conf.transport_conf().participant_attr());}eprosima::fastrtps::ParticipantAttributes attr;attr.rtps.port.domainIDGain =static_cast<uint16_t>(part_attr_conf->domain_id_gain());attr.rtps.port.portBase = static_cast<uint16_t>(part_attr_conf->port_base());attr.rtps.builtin.discovery_config.discoveryProtocol =eprosima::fastrtps::rtps::DiscoveryProtocol_t::SIMPLE;attr.rtps.builtin.discovery_config.m_simpleEDP.use_PublicationWriterANDSubscriptionReader = true;attr.rtps.builtin.discovery_config.m_simpleEDP.use_PublicationReaderANDSubscriptionWriter = true;attr.domainId = domain_id;/*** The user should set the lease_duration and the announcement_period with* values that differ in at least 30%. Values too close to each other may* cause the failure of the writer liveliness assertion in networks with high* latency or with lots of communication errors.*/attr.rtps.builtin.discovery_config.leaseDuration.seconds =part_attr_conf->lease_duration();attr.rtps.builtin.discovery_config.leaseDuration_anno

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

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

相关文章

IO流及字符集

IO流 作用&#xff1a; 用于读写文件中的数据 分类&#xff1a; 图来自黑马程序员网课 纯文本文件&#xff1a;Windows自带的记事本打开能读懂的文件&#xff0c;word excel不是纯文本文件 图来自黑马程序员网课 FileOutputStream: 操作本地文件的字节输出流&#xff0c;可…

【JVM】STW、OopMap和安全点的定义以及特点

在Java垃圾回收机制中&#xff0c;Stop The World、OopMap和安全点是重要的概念&#xff0c;它们在垃圾收集的执行过程中起着关键作用。 Stop The World Stop The World&#xff08;STW&#xff09;是指在垃圾回收期间&#xff0c;JVM暂停所有应用程序的线程&#xff0c;以便…

【5】JDK、JRE和JVM的区别与联系

JDK、JRE和JVM的区别与联系 Java是一种广泛使用的编程语言&#xff0c;它的跨平台特性得益于Java虚拟机&#xff08;JVM&#xff09;。然而&#xff0c;在Java的世界里&#xff0c;JDK、JRE和JVM这三个术语常常让人感到困惑。本文将阐述它们各自的功能&#xff0c;以及它们是如…

过滤器和拦截器处理跨域问题

过滤器和拦截器处理跨域问题 1、过滤器,固定格式&#xff0c;只需要添加下面的配置类即可 添加依赖&#xff0c;这个依赖一般创建项目时就自动添加了 <!-- For Maven --> <dependency><groupId>org.springframework.boot</groupId><artifactId&g…

板凳------56.Linux/Unix 系统编程手册(下) -- SOCKET 介绍

56.1.概述 socket 是一种IPC方法&#xff0c;允许位于同一主机或使用网络连接起来的不同主机上的应用程序之间交换数据。 UNIX 允许位于同一主机系统上的应用程序之间通信 Internet domain IPv4 and IPV6 // socket 通信方式 1.各个应用程序创建一个socket&#xff0c;socket是…

vue3:实现图片放大浏览功能组件

两种实现方式&#xff1a; 1.将原本的盒子与img标签放大至全屏浏览。 2.新建一个div和img标签进行全屏浏览。这样不会改变布局。 第一种&#xff1a; 效果&#xff1a; 组件代码&#xff1a; <template><div :class"isScreen ? fullImg : norImg">…

Confluence是否免费?你需要知道的都在这里!

根据Atlassian官方信息&#xff0c;可以确定的是 Confluence 并不免费&#xff0c;但为10人以下团队提供了免费版本。免费版可以使用不限量的页面、空间&#xff0c;但只有2GB的存储空间和3个活动白板。但国内有不少公司通过使用破解版的方式来免费使用Cofluence。下面本文将详…

GitHub每日最火火火项目(6.15)

好的&#xff0c;以下是按照你的要求对每个项目进行的总结&#xff1a; 项目名称&#xff1a;huggingface / diffusers 项目介绍&#xff1a;diffusers 是一个用于图像和音频生成的扩散模型库。它提供了一系列预训练模型和工具&#xff0c;使得用户可以轻松地进行图像和音频的生…

【什么!Grok记录被打破了】坏消息不是Meta的 llama3 400,好消息是Nvidia发布的Nemotron-4 340B且支持开源

Nvidia 发布了开创性的开放模型系列 “Nemotron-4 340B”&#xff0c;再次巩固了其作为人工智能创新领域无可争议的领导者的地位。这一发展标志着人工智能行业的一个重要里程碑&#xff0c;因为它使各行各业的企业能够创建功能强大的特定领域 LLM&#xff0c;而无需大量昂贵的真…

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例&#xff1a;监听网络状态变化 2.2. 自定义广播示例&#xff1a;发送自定义广播 2.3. 有序广播示例&#xff1a;有序广播 2.4. …

线代知识点总结

目录 一.初等行/列变换 1.计算行列式时&#xff0c;行列变换都可 2.求矩阵的秩时&#xff0c;行列变换都可 3.解线性方程组时&#xff0c;仅能使用初等行变换 4.判定解的情况&#xff0c;单纯求r(A),r(A,b)的过程行列变换都可 5.求向量组极大无关组、线性表出关系&#x…

汽车级TPSI2140QDWQRQ1隔离式固态继电器,TMUX6136PWR、TMUX1109PWR、TMUX1133PWR模拟开关与多路复用器(参数)

1、TPSI2140-Q1 是一款隔离式固态继电器&#xff0c;专为高电压汽车和工业应用而设计。 TPSI2140-Q1 与 TI 具有高可靠性的电容隔离技术和内部背对背 MOSFET 整合在一起&#xff0c;形成了一款完全集成式解决方案&#xff0c;无需次级侧电源。 该器件的初级侧仅由 9mA 的输入电…

MySQL入门学习-子查询.ALL

子查询是指在一条查询语句中嵌套另一条查询语句。 在 MySQL 中&#xff0c;子查询 ALL 表示子查询结果中的所有值都满足某个条件。 例如&#xff1a; sql SELECT * FROM table1 WHERE column1 > ALL (SELECT column2 FROM table2); 上述代码表示从表 table1 中选择所有 c…

线程介绍及其Java如何用Thread 类创建线程和操作线程方法

目录 一、进程和线程1.1 进程特征 2.2 线程特征 2.3 区别 二、利用Thread类创建线程2.1 通过创建Thread子类&#xff0c;重写run()方法2.2 通过实现Runnable接口&#xff0c;重写run()方法2.3. Callable接口 FutureTask 创建线程2.3 三种方法区别1. 通过创建Thread子类&#x…

SQL深度解析:掌握这些技巧,让你的数据库查询如虎添翼!

前言 随着大数据时代的来临&#xff0c;数据库的角色愈发重要。SQL作为使用最为广泛的数据查询语言&#xff0c;其深度解析与优化对于数据密集型应用来说至关重要。掌握高级SQL技巧不仅可以提升开发效率&#xff0c;还能显著提高数据查询的性能和灵活性。本文将探讨一些关键的S…

Android BMI程序设计

android:layout_width“match_parent” android:layout_height“wrap_content” android:gravity“left” android:text“体重&#xff08;KG&#xff09;” android:textSize“25sp” /> <EditText android:id“id/tz” android:layout_width“match_parent” …

修改SubVI的LabVIEW默认搜索路径

在启动顶级VI后&#xff0c;LabVIEW可能会遇到找不到subVI的情况。这通常是由于subVI的路径发生了变化或没有被正确配置。 LabVIEW默认搜索路径 默认情况下&#xff0c;LabVIEW会按以下顺序搜索文件位置&#xff08;*表示LabVIEW将搜索子目录&#xff09;&#xff1a; <t…

C# —— 类型转换

类型转换就是不同变量数据类型之间进行互相转换 隐式转换 : 默认是C#中安全的进行数据转换的方式 一般不会造成数据丢失 相同数据类型之间的隐式转换 有符号 long -> int ->short ->sbyte long l 1; int i 2; short s 3; sbyte sb 4; // 大范围可以装小范围的 l…

如何从印刷体的图片中把手写体部分统统去掉?--免费途径

AI图像处理技术 我是从国外某个网站上找到在线AI免费credit的处理方式的。国内的基本没有全功能试用、或者即使收费也不好用。 国内的差距主要是&#xff1a;1、对图片分辨率和大小有更多限制&#xff0c;即使收费用户也是&#xff1b;2、需要安装app之类&#xff0c;然后连线…

MongoDB使用$addToSet向数组中添加元素

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第66篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题&#xff0c;欢迎在文章下面点个赞&#xff0c;或者关…