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,表示注册与创建流程完整执行并正常清理。