使用Google协议缓冲区 - 如何在.proto文件中定义字段

时间:2018-01-29 20:21:42

标签: c++ data-structures protocol-buffers

我正在使用Simulation Open Framework Architecture SOFAC++语言),我的目标是在一些沙发原始本地数据与其他外部应用程序之间建立一些通信类型。通过这个订单,我使用ZeroMQ将沙发数据传输到python外部应用程序。

在SOFA(C++)中,我有以下instrumentData结构

#include <sofa/core/behavior/BaseController.h>
#include <sofa/defaulttype/VecTypes.h>

// To Quat datatype
#include <sofa/defaulttype/Quat.h>
using sofa::defaulttype::Quat;

using std::string;

namespace sofa
{

namespace component
{
namespace controller
{
struct instrumentData
{
  typedef sofa::defaulttype::Vec3d Vec3d;
  Vec3d pos;
  Quat quat;
  int btnState;
  float openInst;
  bool blnDataReady;
};
}
}
}

我正在尝试通过zmq对这些以下数据成员instrumentData结构进行数据通信,并序列化/反序列化这些数据我正在使用Google Protocol Buffer,我的python命运数据应用程序的顺序理解和解释它是instrumentData数据成员结构的内容。目前,这些数据成员结构以二进制格式/内容到达您的命运。

Google协议缓冲区要求在.proto文件扩展名内构建格式的协议,其中有必要

  

您需要从.proto文件开始。 .proto文件中的定义很简单:为要序列化的每个数据结构添加消息,然后为消息中的每个字段指定名称和类型。

如何在instrumentdata.proto个文件中代表以下字段:posquatbool ...?

typedef sofa::defaulttype::Vec3d Vec3d;
Vec3d pos;

using sofa::defaulttype::Quat;
Quat quat;

bool blnDataReady;

目前,in the documentation并不清楚我应该如何定义与Vector和其他数据类型相关的字段,例如Quat(四元数)SOFA原生。

Vec3dQuat由以下一些元素组成:

void ZMQServerComponent::instrumentDataSend(instrumentData a)
{
    a.pos = sofa::defaulttype::Vec3d(1.0f, 1.0f, 1.0f);
    a.quat = defaulttype::Quat(1.0f, 1.0f, 4.0f, 1.0f);
}

可以定义为enumerators吗?

更新

目前我根据documentation构建的暂定instumentdata.proto文件是:

sintax = "proto3";
message InstrumentData {
    // enum Pos {}
    // enum Quat {}
    int32 btnState;
    float openInst;
    bool blnDataReady
}

虽然我对这个单一协议定义有一些疑问

2 个答案:

答案 0 :(得分:3)

根据说明,Vec3dQuat不是枚举,而是结构,您可以将其描述为单独的message类型,例如

message Vec3d {
  float x = 1;
  float y = 2;
  float z = 3;
}

message Quat {
  float a = 1;
  float b = 2;
  float c = 3;
  float d = 4;
}

然后可以在InstrumentData消息类型

中使用这些消息类型
message InstrumentData {
  Vec3d pos = 1;
  Quat quat = 2;
  int32 btnState = 3;
  float openInst = 4;
  bool blnDataReady = 5;
}

答案 1 :(得分:1)

如前所述,您必须将框架中的类型与合理的消息定义相似,并提供映射层以将生成的内容转换为框架本机类。

您的框架中

Vec3DQuad不是enum,因此不应在协议缓冲消息定义中表示。

您的.proto文件应该看起来像(尚未测试):

message Vec3D {
    required float x = 1;
    required float y = 2;
    required float z = 3;
}

message Quad {
    required float a = 1;
    required float b = 2;
    required float c = 3;
    required float d = 4;
}

message InstrumentData {
    optional Vec3D = 1;
    optional Quat = 2;
    optional int32 btnState = 3;
    optional float openInst = 4;
    optional bool blnDataReady = 5;
}