2. DDS主题定义与数据类型注册

任务说明

本案例在 DDS 中定义一个自定义车载数据类型 VehicleStatus(含车速 speed、转速 rpm),通过 IDL 描述类型,用 fastddsgen 生成类型支持代码,再在程序中完成类型注册并创建 Topic。运行后程序会打印注册与创建结果,用于确认类型与主题可用。

环境与依赖

  • eProsima Fast DDS(含 fastddsgen 工具),Linux 环境。
  • 编译工具:g++、cmake。
  • IDL 编译器 fastddsgen 需在 PATH 中。

1. 定义 IDL 数据类型

新建 VehicleStatus.idl,描述车速与转速字段:

struct VehicleStatus
{
    unsigned long speed;   // 车速 km/h
    unsigned long rpm;     // 发动机转速 r/min
};

2. 生成类型支持代码

执行以下命令,会生成 VehicleStatus.cxx/.h 及 VehicleStatusPubSubTypes.cxx/.h:

fastddsgen -replace VehicleStatus.idl

3. 类型注册与主题创建

下面代码完成 Participant 创建、类型注册(register_type)与 Topic 创建(create_topic),并打印结果。核心逻辑集中在 main 中,便于直接验证。

#include <iostream>
#include <memory>

#include "fastdds/dds/domain/DomainParticipantFactory.hpp"
#include "fastdds/dds/domain/DomainParticipant.hpp"
#include "fastdds/dds/topic/Topic.hpp"
#include "fastdds/dds/topic/TypeSupport.hpp"

#include "VehicleStatusPubSubTypes.hpp"

using namespace eprosima::fastdds::dds;

int main()
{
    // 1. 创建 DomainParticipant
    DomainParticipant* participant =
        DomainParticipantFactory::get_instance()->create_participant(0, PARTICIPANT_QOS_DEFAULT);
    if (participant == nullptr)
    {
        std::cerr << "create_participant failed" << std::endl;
        return 1;
    }

    // 2. 注册自定义类型
    TypeSupport type(new VehicleStatusPubSubType());
    type.register_type(participant);
    std::cout << "type registered: " << type.get_type_name() << std::endl;

    // 3. 创建 Topic
    Topic* topic = participant->create_topic("VehicleStatusTopic", type.get_type_name(), TOPIC_QOS_DEFAULT);
    if (topic == nullptr)
    {
        std::cerr << "create_topic failed" << std::endl;
        DomainParticipantFactory::get_instance()->delete_participant(participant);
        return 1;
    }
    std::cout << "topic created: " << topic->get_name()
              << " (type=" << topic->get_type_name() << ")" << std::endl;

    // 4. 清理
    participant->delete_topic(topic);
    DomainParticipantFactory::get_instance()->delete_participant(participant);
    return 0;
}

4. 编译与运行

用 CMake 链接 Fast DDS 与生成的类型代码:

cmake_minimum_required(VERSION 3.16)
project(vehicle_status_demo CXX)
set(CMAKE_CXX_STANDARD 14)

find_package(fastcdr REQUIRED)
find_package(fastrtps REQUIRED)

add_executable(vehicle_status_demo
    main.cpp
    VehicleStatus.cxx
    VehicleStatusPubSubTypes.cxx)

target_link_libraries(vehicle_status_demo
    fastrtps fastcdr)
cmake -B build && cmake --build build
./build/vehicle_status_demo

5. 验证方法与通过条件

  • 编译无错误,说明 IDL 生成代码与类型注册接口匹配。
  • 运行后输出包含 type registered: VehicleStatus,说明类型注册成功。
  • 输出包含 topic created: VehicleStatusTopic (type=VehicleStatus),说明主题创建成功且类型名一致。
  • 程序返回码为 0,表示注册与创建流程完整执行并正常清理。

关键关系图

VehicleStatus.idl speed / rpm fastddsgen 生成 PubSubType 代码 register_type() 向 Participant 注册类型 create_topic() VehicleStatusTopic Topic 可用 供 Publisher/Subscriber 使用