fastdds:编译、安装并运行helloworld

news2025/1/8 5:59:36

fastdds安装可以参考官方文档:

3. Linux installation from sources — Fast DDS 3.1.0 documentation

从INSTALLATION MANUAL这一节可以看出来,fastdds支持的操作系统包括linux、windows、qnx、MAC OS。本文记录通过源码和cmake的方式来安装fastdds的过程,也就是3.1.4节的安装过程:

1安装步骤

使用源码和cmake安装fastdds之前,需要先安装一些依赖,可以参考requirements和dependencies两节来安装。

camke、g++、pip3、wget、git这是常用一些工具
asioasynchronous io,异步io库。fastdds作为一个通信中间件,底层的通信就是基于asio实现的
tinyxml2fastdds的配置文件格式为xml,tinyxml2用来解析xml文件
openssl用于加密

1、在家目录下创建一个文件夹

2、安装foonathan memory和fast cdr

foonathan memory提供内存管理功能,fast cdr提供序列化和反序列化。

CMAKE_INSTALL_PREFIX指定安装目录的前缀,如下的install指令,把xxx安装在lib目录下,实际的安装目录会在lib前加上前缀,以上边的命令为例,xxx实际会被安装到~/Fast-DDS/install/lib目录下。

install(TARGETS xxx DESTINATION lib)

3、安装fastdds

如果我们安装fastdds是为了学习或者调试,那么可以编译debug版本,也就是CMAKE_BUILD_TYPE=Debug;需要编译examples,则需要将examples打开,也就是COMPILE_EXAMPLES=ON。

cmake .. -DCMAKE_INSTALL_PREFIX=~/Fast-DDS/install -DCOMPILE_EXAMPLES=ON -DCMAKE_BUILD_TYPE=Debug

2helloworld

2.1fastdds应用的组成

helloworld是fastdds一个最简单的应用,一个fasttdds的应用往往包括以下几个部分:

 topic:话题

topic也表示一个通道,表示reader和writer之间通信的通道,类似于我们的手机号、微信号、抖音号。topic需要在一个domain内保持唯一。topic在实际使用中用一个字符串来表示。helloword中使用的topic是hello_world_topic。

idl:interface definition language

helloworld的idl定义如下,可以看到,很像我们使用c/c++编程的时候使用的结构体。在具体使用的时候,idl不能直接用,要先使用fastddsgen工具将idl生成.h文件和.cpp。

idl定义了通信的数据内容,是writer和reader之间的通信的内容。

fastddsgen是用java开发的工具,用于将idl文件生成编程语言可以使用的格式。fastddsgen的安装说明如下:

3. Linux installation from sources — Fast DDS 3.1.0 documentation

如下是使用fastddsgen将HelloWorld.idl生成了.hpp,.cxx等文件

Publisher和Subscriber:

Publisher发布数据,Subscriber订阅数据。

xml

xml是fastdds应用使用的配置文件。xml中可以配置使用哪些传输层、qos配置、domain id配置、白名单配置等。如果想要使用配置文件,那么需要设置环境变量FASTDDS_DEFAULT_PROFILES_FILE。

<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com" >
    <participant profile_name="hello_world_participant_profile" is_default_profile="true">
        <domainId>0</domainId>
        <rtps>
            <name>hello_world_participant</name>
        </rtps>
    </participant>
    <data_writer profile_name="hello_world_datawriter_profile" is_default_profile="true">
        <qos>
            <durability>
                <kind>TRANSIENT_LOCAL</kind>
            </durability>
            <reliability>
                <kind>RELIABLE</kind>
            </reliability>
        </qos>
        <topic>
            <historyQos>
                <kind>KEEP_LAST</kind>
                <depth>100</depth>
            </historyQos>
            <resourceLimitsQos>
                <max_samples>100</max_samples>
                <max_instances>1</max_instances>
                <max_samples_per_instance>100</max_samples_per_instance>
            </resourceLimitsQos>
        </topic>
    </data_writer>

    <data_reader profile_name="hello_world_datareader_profile" is_default_profile="true">
        <qos>
            <durability>
                <kind>TRANSIENT_LOCAL</kind>
            </durability>
            <reliability>
                <kind>RELIABLE</kind>
            </reliability>
        </qos>
        <topic>
            <historyQos>
                <kind>KEEP_LAST</kind>
                <depth>100</depth>
            </historyQos>
            <resourceLimitsQos>
                <max_samples>100</max_samples>
                <max_instances>1</max_instances>
                <max_samples_per_instance>100</max_samples_per_instance>
            </resourceLimitsQos>
        </topic>
    </data_reader>
</profiles>

topic定义了通信的通道,类似于手机号

idl定义了数据内容,类似于打电话的双方之间通话的内容

Publisher和Subsciber是通信的双方

2.2ListenerSubscriber和WaitsetSubscriber

数据的订阅侧有两种实现方式:

ListenerSubscriber1、使用简单,继承fastdds提供的基类

DataReaderListener,实现其中的接口on_subscription_matched、on_data_available,当有publisher和这个subscriber匹配的时候,on_subscription_matched会被调用;当有新的订阅数据到来的时候,on_data_available会被调用。

2、不够灵活,函数on_subscription_matched、on_data_available在哪个线程中调用,线程的调度参数是怎么配置的,一个Subscriber使用一个线程,还是多个Subscriber使用同一个线程,我们不能控制。

WaitsetSubsriber

1、不需要继承fastdds提供的基类,使用灵活,subscriber运行在哪个线程中,线程的调度参数怎么配置,我们可以灵活的进行配置。

2、不如ListenerSubscriber使用简单

如下是helloworld中使用waitset的代码,waitset的使用分为如下3步:

①attach_condition,指定waitset关心哪些条件

②wait,等待条件到来

③使用一个for循环来遍历条件,在for循环中根据条件的类型进行对应的处理

看到这里,如果我们用过epoll的话,可以看到waitset的使用方式和epoll的使用方式是类似的,epoll的使用也可以分为如下3步:

①epoll_ctl,添加关心的事件

②epoll_wait,等待事件到来

③for循环处理事件,根据事件类型做对应处理

wait_set_.attach_condition(reader_->get_statuscondition());
wait_set_.attach_condition(terminate_condition_);

void WaitsetSubscriberApp::run()
{
    while (!is_stopped())
    {
        ReturnCode_t ret_code = wait_set_.wait(triggered_conditions, eprosima::fastdds::dds::c_TimeInfinite);
        if (RETCODE_OK != ret_code)
        {
            EPROSIMA_LOG_ERROR(SUBSCRIBER_WAITSET, "Error waiting for conditions");
            continue;
        }
        for (Condition* cond : triggered_conditions)
        {
            StatusCondition* status_cond = dynamic_cast<StatusCondition*>(cond);
            if (nullptr != status_cond)
            {
                Entity* entity = status_cond->get_entity();
                StatusMask changed_statuses = entity->get_status_changes();
                if (changed_statuses.is_active(StatusMask::subscription_matched()))
                {
                    ...
                }
                if (changed_statuses.is_active(StatusMask::data_available()))
                {
                    ...   
                }
            }
        }
    }
}

2.3Publisher/Subscriber创建步骤

从helloworld的代码来看,创建Publisher和Subscriber的步骤是类似的:

①创建participant

②创建publisher或subscriber

③创建topic

④创建writer/reader

domain

域,domain是fastdds中一个范围最大的概念,一个domain用一个domain id来区分,只有同一个domain内的参与者才可以通信,不同参与者之间的对象不能通信。这给业务隔离带来了方便,比如我们实际使用中,业务A和业务B之间不需要通信,那么就可以将业务A和业务B分别部署在两个domain内。

participant

参与者,一个domain内可以有多个参与者,一个参与者只能属于一个domain。

publisher/subscriber

一个participant可以创建多个publisher/subscriber。

writer/reader

一个publisher可以创建多个writer,一个subscriber可以创建多个reader。

idl定义的数据类型,也就是通信的内容,和topic是绑定的,在创建topic的时候,需要指定type,这里的type就是idl中定义的数据类型。

topic_ = participant_->create_topic(topic_name, type_.get_type_name(), topic_qos);

topic和writer/reader是绑定的,在创建writer/reader的时候需要指定topic:

writer_ = publisher_->create_datawriter(topic_, writer_qos, this, StatusMask::all());

qos,也就是服务质量,在创建publisher/subscriber、topic、writer/reader时均需要配置qos。

2.4运行helloworld

在两个终端分别启动subscriber和publisher,运行结果如下两张图所示。可以看出,当puhlisher和subscriber匹配的时候,会打印日志;当其中一方退出的时候,另一方也会打印unmatched日志。如果subscriber侧要使用waitset方式,可以执行./hello_world subscriber -w。

 

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

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

相关文章

HTTP 探秘之旅:从入门到未来

文章目录 导言&#xff1a;目录&#xff1a;第一篇&#xff1a;HTTP&#xff0c;互联网的“快递员”第二篇&#xff1a;从点开网页到看到内容&#xff0c;HTTP 究竟做了什么&#xff1f;第三篇&#xff1a;HTTP 的烦恼与进化史第四篇&#xff1a;HTTP 的铠甲——HTTPS 的故事第…

【软件项目测试文档大全】软件测试方案,验收测试计划,验收测试报告,测试用例,集成测试,测试规程和指南,等保测试(Word原件)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.…

前端拿不到 response 响应流返回的 header 例如 Content-Disposition 等

同步发布于我的网站 &#x1f680; 背景介绍默认可访问的响应头问题分析解决方案 示例 前端代码示例注意事项总结 背景介绍 在进行前后端交互时&#xff0c;前端有时需要读取服务器返回的特定响应头&#xff08;如 Content-Disposition&#xff09;&#xff0c;以便根据这些…

SQL进阶——C++与SQL进阶实践

在C开发中&#xff0c;SQL数据库的操作是开发者常见的任务之一。虽然前面我们已经介绍了如何在C中通过数据库连接执行基本的SQL查询&#xff0c;但在实际项目中&#xff0c;我们通常需要更加复杂和高效的数据库操作。存储过程与函数的调用、复杂SQL查询的编写、以及动态构造SQL…

论文概览 |《Urban Analytics and City Science》2023.05 Vol.50 Issue.4

本次给大家整理的是《Environment and Planning B: Urban Analytics and City Science》杂志2023年5月第50卷第4期的论文的题目和摘要&#xff0c;一共包括19篇SCI论文&#xff01; 论文1 Data analytics and sustainable urban development in global cities 全球城市的数据…

HarmonyOS4+NEXT星河版入门与项目实战(24)------Stage模型

文章目录 1、概念2、配置文件1、全局配置文件2、模块配置文件3、UIAbility生命周期1、图文归纳2、生命周期方法入口4、页面生命周期1、图文描述1、概念 2、配置文件 1、全局配置文件 2、模块配置文件 统一修改配置文件技巧:点击任意json 文件,选择 Open editor ,在显示的列表…

kubernetes——part3-2 集群声明式文件YAML

一、YAML介绍 YAML 的意思是&#xff1a;仍是一种标记语言&#xff0c;但为了强调这种语言以数据做为中心&#xff0c;而不是以标记语言为重点。是一个可读性高&#xff0c;用来表达数据序列的格式。 二、基本语法 1.低版本缩进时不允许使用Tab键&#xff0c;只允许使用空格…

告别 Kafka,拥抱 Databend:构建高效低成本的用户行为分析体系

用户行为数据埋点指标是数据仓库中不可或缺的重要数据源之一&#xff0c;同时也是企业最宝贵的资产之一。通常情况下&#xff0c;用户行为数据分析包含两大数据源&#xff1a;用户行为分析日志和上游关系型数据库&#xff08;如 MySQL&#xff09;。基于这些数据&#xff0c;企…

产出一篇论文的各个步骤

产出一篇论文的各个步骤 建议–实用 如何看论文&#xff1a; &#xff08;前提&#xff1a;优秀论文&#xff0c;如顶会论文/杂志&#xff0c;了解顶会是那些&#xff0c;召开时间是什么时候&#xff09; 创新点 记录下来说过的别的文章/方法的缺陷 – 看文章就是看优点/指出…

AtomicIntegerFieldUpdater能否降低内存

1. 代码如下&#xff1a; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger;public class AtomicIntegerTest {final AtomicInteger startPosition new AtomicInteger(0);final AtomicInteger wrotePosition new Atom…

ClickHouse数据迁移(远程)

一、背景 公司最近买了新的服务器&#xff0c;旧的服务器上面安装了ClickHouse22.2.2.1&#xff0c;新的服务器上面安装了ClickHouse24.9.2.42&#xff0c;两个版本之间要做历史数据迁移 旧服务器&#xff1a;80(IP最后一段&#xff0c;以下代称)&#xff0c;ClickHouse版本&am…

Flutter:页面滚动

1、单一页面&#xff0c;没有列表没分页的&#xff0c;推荐使用&#xff1a;SingleChildScrollView() return Scaffold(backgroundColor: Color(0xffF6F6F6),body: SingleChildScrollView(child: _buildView()) );2、列表没分页&#xff0c;如购物车页&#xff0c;每个item之间…

Artec Leo:航海设备维护的便携式3D扫描利器【沪敖3D】

挑战&#xff1a;海军服务提供商USP Maritime需要CAD数据来执行维修和改装任务&#xff0c;特别是在偏远地区的任务&#xff0c;以及原始设计丢失的情况下。 解决方案&#xff1a;Artec Leo, Artec Studio, Autodesk Inventor 效果&#xff1a;高精度船舶组件和船坞机械模型&…

复杂网络(三)

一、几种常见的中心性指标 1.1 度中心性 度中心性分为节点度中心性和网络度中心性。前者指的是节点在其与之直接相连的邻居节点当中的中心程度&#xff0c;二后者则侧重节点在整个网络的中心程度&#xff0c;表征的是整个网络的集中或集权程度&#xff0c;即整个网络围绕一个…

蓝桥杯嵌入式入门指南-UART【7】

在all.c定义缓存变量 char uart_tx[50];//uart缓冲区 char uart_rx[50];//uart缓冲区USRT发送(使用strlen时需要在all.h添加string.h) sprintf(uart_tx ," PB15:%.4f V \r\n ",adc_data_PB15);HAL_UART_Transmit(&huart1,(uint8_t *)uart_tx,strlen(uart_tx)…

docker 在ubuntu系统安装,以及常用命令,配置阿里云镜像仓库,搭建本地仓库等

1.docker安装 1.1 先检查ubuntu系统有没有安装过docker 使用 docker -v 命令 如果有请先卸载旧版本&#xff0c;如果没有直接安装命令如下&#xff1a; 1.1.0 首先&#xff0c;确保你的系统包是最新的&#xff1a; 如果是root 权限下面命令的sudo可以去掉 sudo apt-get upda…

IOS ARKit进行图像识别

先讲一下基础控涧&#xff0c;资源的话可以留言&#xff0c;抽空我把它传到GitHub上&#xff0c;这里没写收积分&#xff0c;竟然充值才能下载&#xff0c;我下载也要充值&#xff0c;牛&#xff01; ARSCNView 可以理解画布或者场景 1 配置 ARWorldTrackingConfiguration AR追…

CSS笔记(二)类名复用

这里我通过两张不同位置的卡片来实现效果 代码 <!DOCTYPE html> <html><head><style>/*设置画布*/body{/* 方便排列与对齐*/display: flex; /*画布布满整个窗口*/height: 100vh;/*水平居中*/justify-content: center;/*垂直居中*/align-items: cente…

远程协助软件Todesk免费版有什么限制

大名鼎鼎的远程todesk也开始出限制了&#xff0c;国内远程协助一直是向日葵一家独大&#xff0c;todesk起来以后慢慢占领了部分市场&#xff0c;随用户越来越多&#xff0c;其服务器也开始不堪重负了&#xff0c;于2024年的6月发了公告&#xff0c;出告了限制发表的措施具体如下…

【力扣热题100】[Java版] 刷题笔记-3. 无重复字符的最长子串

题目:3. 无重复字符的最长子串 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 解题思路 根据题目&#xff0c;只需要返回无重复字符串的最长子串的长度&#xff0c;所以我们不需要知道知道字符串内容是什么&#xff0c;在整个字符串 s 中&…