首页 > 解决方案 > 从 IDL 生成的 *_DCPS.hpp 文件中的元信息是什么(使用 cyclonedds-cxx)?

问题描述

我使用 cyclonedds-cxx 和他们的 IDL 编译器来翻译 IDL 文件以供 cyclonedds-cxx 使用。我有这个 IDL 文件:

#ifndef TRANSPORTDATA_IDL
#define TRANSPORTDATA_IDL

#include "Transform_.idl"

module TransportData
{
  struct Data
  {
    long userID; //@key
    geometry_msgs::msg::dds_::Transform_ transform_;
  };
  #pragma keylist Data userID
};

#endif  // TRANSPORTDATA_IDL

此 IDL 文件被转换为 Transportdata_DCPS.hpp,如下所示:

#ifndef ISOCPP2_TRANSPORTDATA_H
#define ISOCPP2_TRANSPORTDATA_H

#include "dds/dds.hpp"

#include "TransportData.h"
#include "TransportDataSplDcps.h"

#include "org/eclipse/cyclonedds/topic/TopicTraits.hpp"
#include "org/eclipse/cyclonedds/topic/DataRepresentation.hpp"

namespace org { namespace eclipse { namespace cyclonedds { namespace topic {
template <>
class TopicTraits<TransportData::Data>
{
public:
    static ::org::eclipse::cyclonedds::topic::DataRepresentationId_t getDataRepresentationId()
    {
        return ::org::eclipse::cyclonedds::topic::OSPL_REPRESENTATION;
    }

    static ::std::vector<uint8_t> getMetaData()
    {
        return ::std::vector<uint8_t>();
    }

    static ::std::vector<uint8_t> getTypeHash()
    {
        return ::std::vector<uint8_t>();
    }

    static ::std::vector<uint8_t> getExtentions()
    {
        return ::std::vector<uint8_t>();
    }

    static const char *getKeyList()
    {
        return "userID";
    }

    static const char *getTypeName()
    {
        return "TransportData::Data";
    }

    static const dds_topic_descriptor_t *getDescriptor()
    {
        return &TransportData_Data_desc;
    }

    static copyInFunction getCopyIn()
    {
        return (copyInFunction) __TransportData_Data__copyIn;
    }

    static copyOutFunction getCopyOut()
    {
        return (copyOutFunction) __TransportData_Data__copyOut;
    }

    static size_t getSampleSize()
    {
        return sizeof(TransportData_Data);
    }
};
}}}}

namespace dds { namespace topic {
template <>
struct topic_type_name<TransportData::Data>
{
    static std::string value()
    {
        return org::eclipse::cyclonedds::topic::TopicTraits<TransportData::Data>::getTypeName();
    }
};
}}

REGISTER_TOPIC_TYPE(TransportData::Data)
#endif /* ISOCPP_TRANSPORTDATA_H */

我对此有三个问题:

标签: metadataidldata-distribution-service

解决方案


这都是特定于实现的,并且使用 Cyclone 的新 IDL 编译器,输出将完全改变,甚至消除大部分生成的文件。

这里的copyInFunctionandcopyOutFunction是指将样本从 C++ 表示复制到内部表示并返回的函数。对于 C++ API 的初始提交,这个内部表示实际上是 C 表示中的样本,之后它被转换为 CDR 或从 CDR 转换。新版本取消了这些功能并避免了这种复制。


推荐阅读