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

C++ 使用Google协议缓冲区-如何在.proto文件中定义字段,c++,data-structures,protocol-buffers,C++,Data Structures,Protocol Buffers,我正在使用(C++language),我的目标是在一些sofa源本地数据与其他外部应用程序之间建立某种通信类型。按照这个顺序,我使用ZeroMQ将sofa数据传输到python外部应用程序 在SOFA(C++)中,我有以下instrumentData结构 #include <sofa/core/behavior/BaseController.h> #include <sofa/defaulttype/VecTypes.h> // To Quat datatype #in

我正在使用(
C++
language),我的目标是在一些sofa源本地数据与其他外部应用程序之间建立某种通信类型。按照这个顺序,我使用ZeroMQ将sofa数据传输到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;
};
}
}
}
目前,尚不清楚如何定义与向量和其他数据类型相关的字段,如SOFA原生的
Quat
(四元数)

Vec3d
Quat
由以下元素组成:

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);
}
是否可以定义为

更新

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


尽管从描述中我对这个单一协议定义有一些疑问,
Vec3d
Quat
不是枚举,而是结构,您可以将其描述为单独的
消息类型,例如

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

然后,这些消息类型可用于
仪表数据
消息类型

message InstrumentData {
  Vec3d pos = 1;
  Quat quat = 2;
  int32 btnState = 3;
  float openInst = 4;
  bool blnDataReady = 5;
}

根据描述,
Vec3d
Quat
不是枚举,而是结构,您可以将其描述为单独的
消息类型,例如

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

然后,这些消息类型可用于
仪表数据
消息类型

message InstrumentData {
  Vec3d pos = 1;
  Quat quat = 2;
  int32 btnState = 3;
  float openInst = 4;
  bool blnDataReady = 5;
}

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

Vec3D
Quad
在您的框架中不属于
enum
s,因此不应在协议缓冲区消息定义中表示为这样

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


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

Vec3D
Quad
在您的框架中不属于
enum
s,因此不应在协议缓冲区消息定义中表示为这样

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


您可能需要一些额外的
.proto
文件(消息描述)来描述
Vec3D
Quat
类型。你能展示一下你对
.proto
文件的尝试吗?无论如何,到本机结构的映射层是必要的,您不能直接表示这些本机结构。当然,也可以用协议缓冲区语言定义枚举。“你读过他们的书吗?”首先,谢谢你的提示。这并不是说我没有研究或阅读,而是我已经有了一些原型文件版本,只是我不认为这是足够好的构建。你能看到我的更新吗?@当然,我已经阅读了enum文档,并且我已经清楚了它们的应用案例,我的问题是如何将enum概念应用到我的
Vec3d
Quat
数据类型结构中。如果我的问题降低了stackoverflow的哲学,我真的很抱歉,我接受你的评论并建议一个更好的方法:)当然。我会专门对我的问题进行大量的研究。最佳Regards它们不能表示为枚举数组。如前所述,您必须将这些类型类似于单独的
message
定义。很好,您现在提供了
.proto
语言尝试。@TheDude Ok谢谢!。我将跟踪研究并记录我如何在我的
.proto
文件中表示此
SOFA
数据类型结构,它不包含在
C++
stack中。您可能需要一些额外的
.proto
文件(消息描述)来描述
Vec3D
Quat
类型。你能展示一下你对
.proto
文件的尝试吗?无论如何,到本机结构的映射层是必要的,您不能直接表示这些本机结构。当然,也可以用协议缓冲区语言定义枚举。“你读过他们的书吗?”首先,谢谢你的提示。这并不是说我没有研究或阅读,而是我已经有了一些原型文件版本,只是我不认为这是足够好的构建。你能看到我的更新吗?@当然,我已经阅读了enum文档,并且我已经清楚了它们的应用案例,我的问题是如何将enum概念应用到我的
Vec3d
Quat
数据类型结构中。如果我的问题降低了stackoverflow的哲学,我真的很抱歉,我接受你的评论并建议一个更好的方法:)当然。我会专门对我的问题进行大量的研究。最佳Regards它们不能表示为枚举数组。如前所述,您必须将这些类型类似于单独的
message
定义。很好,您现在提供了您的
.proto
语言尝试。@TheDude Ok谢谢!。我将跟踪研究并记录如何在我的
.proto
文件中表示此
SOFA
数据类型结构,该结构不包含在
C++
stackAs中,因为我从SOFA文档
Vec3D
中了解到,它非常类似于一个点数组,看来你又错过了一个间接层次。另外,
Quad
似乎是一个输入错误,原始类型实际上被命名为
Quad
。另外,如果仔细查看
Quad
的定义,也没有<
message InstrumentData {
  Vec3d pos = 1;
  Quat quat = 2;
  int32 btnState = 3;
  float openInst = 4;
  bool blnDataReady = 5;
}
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;
}