当前位置: 首页 > 知识库问答 >
问题:

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

宰父焕
2023-03-14

我正在使用模拟开放框架架构SOFA(C语言),我的目标是在一些沙发源本机数据与其他外部应用程序之间设置一些通信类型。按照这个顺序,我使用ZeroMQ将沙发数据传输到python外部应用程序。

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

#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 destiny数据应用程序的顺序理解和解释instrumentData数据成员结构的内容。目前,此数据成员结构以二进制格式/内容实现。

Google Protocol Buffer要求以内置的格式描述协议。proto文件扩展名,其中是必需的

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

如何在instrumentdata中表示。proto文件,以下字段:posquatbool

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

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

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);
}

是否可以定义为枚举数?

更新

目前,我的暂定仪器数据。我根据文档构建的proto文件是:

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

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

共有2个答案

钱劲
2023-03-14

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

在您的框架中,Vec3D和Quad不属于枚举,因此不应在协议缓冲区消息定义中表示为枚举。

您的<代码>。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;
}
商飞航
2023-03-14

从描述来看,Vec3dQuat不是枚举,而是结构,您可以将其描述为单独的消息类型,例如。

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;
}
 类似资料:
  • 问题内容: 我正在尝试动态解析Java中的给定.proto文件,以解码Protobuf编码的二进制文件。 我有以下解析方法,其中“ proto”字符串包含.proto文件的内容: 但是,执行时,先前的方法将引发消息“协议消息标签的电线类型无效”的异常。我使用了来自Google的示例.proto文件,因此我认为它是有效的:https : //github.com/google/protobuf/bl

  • 根据示例代码https://developers.google.com/protocol-buffers/docs/cpptutorial,它们展示了如何解析二进制格式的原始文件。使用 我尝试删除文本格式的输入文件的,但在读取文件时仍然失败。我需要做什么才能读取文本格式的原始文件?

  • 我试图在Windows上的Qt中使用google协议缓冲区。因此,我使用MingGW的msys从github编译了protobuf源代码。proto编译器(protoc)似乎工作得很好,但遗憾的是,它无法使用生成的。博士和。pb。从Qt环境中抄送文件。 将此添加到我的。pro文件: 但我仍然得到“未定义的引用…”当我试图编译这个类时,它使用了所有的方法。 代码必须正确,因为它在使用protoc和Q

  • 我一直在试图让汽车制造商自动决定如何建造。pb。抄送和。pb。来自google协议缓冲区的hh文件。原型描述,但没有运气。 我试过在SO上使用这篇文章,但仍然不起作用。 这是我的Makefile的摘录。是: 尝试运行make时,我得到: ac\u proto\u cmd由configure填充到protoc二进制文件的路径。ac,当它检查GPB依赖关系时。我已经验证了它的格式是“/opt/comm

  • 问题内容: 我正在使用gSoap将旧式C 系统重构为SOA。我们遇到了一些性能问题(非常大的XML),因此我的领导要我看一下协议缓冲区。我做到了,它看起来非常酷(我们需要C 和Java支持)。但是协议缓冲区是仅用于序列化的解决方案,现在我需要将其发送到Java前端。从C ++和Java角度来看,我应该使用什么来通过HTTP(只是内部网络)发送那些序列化的内容? PS。另一个人试图加速我们的gSoa

  • 我是协议缓冲区的新手,我想知道是否可以搜索协议缓冲区二进制文件并以结构化格式读取数据。例如,如果我的.proto文件中的一条消息有4个字段,我希望序列化该消息,并将多条消息写入一个文件,然后在该文件中搜索特定的字段。如果我找到该字段,我希望以与写入时相同的结构化格式读回消息。对于协议缓冲区,这是可能的吗?如果可能,任何示例代码或示例都将非常有用。谢谢