【FastDDS】Layer DDS之Publisher (05-DataWriter)

FastDDS中DataWriter详解

Fast DDS中的DataWriter总结

一、DataWriter的基本概念

DataWriter 是依附于唯一的发布者(Publisher)的组件,而发布者则充当其工厂。此外,每个DataWriter从创建时起就绑定到一个特定的主题(Topic)。该主题必须在DataWriter创建之前存在,且必须与DataWriter要发布的数据类型相关联。

在发布者中为特定主题创建新的DataWriter,其作用是启动一个新的发布过程,该发布过程以主题所描述的名称和数据类型为准。

DataWriter创建后,应用程序可以通过调用其write()成员函数来告知数据值的变化。这些变化将被传输到所有与该发布过程相匹配的订阅端。

二、DataWriterQos

DataWriterQos 用于控制DataWriter的行为,其内部包含多个QosPolicy对象,具体如下表所示:

QoS策略类 访问器/修改器 是否可修改
DurabilityQ
#include <fastdds/dds/domain/DomainParticipantFactory.hpp> #include <fastrtps/fastdds/dds/domain/DomainParticipant.hpp> #include <fastdds/dds/topic/Topic.hpp> #include <fastdds/dds/publisher/Publisher.hpp> #include <fastdds/dds/publisher/DataWriter.hpp> #include <fastdds/dds/publisher/qos/DataWriterQos.hpp> #include <fastdds/dds/core/status/StatusMask.hpp> #include <fastdds/dds/log/Log.hpp> #include <thread> #include <iostream> #include "PosPubSubTypes.h" using namespace eprosima::fastdds::dds; int main() { // 创建 DomainParticipant DomainParticipant* participant = DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT); if (!participant) { std::cerr << "创建 participant 失败" << std::endl; return 1; } // 注册类型 TypeSupport type(new topic_01::msg::PosPubSubType()); type.register_type(participant); // 创建 Topic Topic* topic = participant->create_topic("rt/pos_topic", "topic_01/msg/Pos", TOPIC_QOS_DEFAULT); if (!topic) { std::cerr << "创建 topic 失败" << std::endl; return 1; } // 创建 Publisher Publisher* publisher = participant->create_publisher(PUBLISHER_QOS_DEFAULT, nullptr); if (!publisher) { std::cerr << "创建 publisher 失败" << std::endl; return 1; } // 创建 DataWriter DataWriter* writer = publisher->create_datawriter(topic, DATAWRITER_QOS_DEFAULT, nullptr); if (!writer) { std::cerr << "创建 writer 失败" << std::endl; return 1; } // 随机数初始化 std::srand(static_cast<unsigned>(std::time(nullptr))); topic_01::msg::Pos msg; for (int i = 0; i < 100000; ++i) { for (int j = 0; j < 4; ++j) { msg.coordinates()[j] = static_cast<float>(std::rand() % 100) / 10.0f; } writer->write(&msg); std::cout << "发送消息: ["; for (int j = 0; j < 4; ++j) { std::cout << msg.coordinates()[j]; if (j != 3) std::cout << ", "; } std::cout << "]" << std::endl; std::this_thread::sleep_for(std::chrono::milliseconds(1000)); } // 清理资源 participant->delete_contained_entities(); DomainParticipantFactory::get_instance()->delete_participant(participant); return 0; } 为什么这样发布的话题,ROS2的订阅者订阅不到?
07-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ray.so

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值