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