我正在使用Simulation Open Framework Architecture SOFA(C++
语言),我的目标是在一些沙发原始本地数据与其他外部应用程序之间建立一些通信类型。通过这个订单,我使用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
个文件中代表以下字段:pos
,quat
,bool
...?
typedef sofa::defaulttype::Vec3d Vec3d;
Vec3d pos;
using sofa::defaulttype::Quat;
Quat quat;
bool blnDataReady;
目前,in the documentation并不清楚我应该如何定义与Vector和其他数据类型相关的字段,例如Quat
(四元数)SOFA原生。
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);
}
可以定义为enumerators吗?
更新
目前我根据documentation构建的暂定instumentdata.proto
文件是:
sintax = "proto3";
message InstrumentData {
// enum Pos {}
// enum Quat {}
int32 btnState;
float openInst;
bool blnDataReady
}
虽然我对这个单一协议定义有一些疑问
答案 0 :(得分:3)
根据说明,Vec3d
和Quat
不是枚举,而是结构,您可以将其描述为单独的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)
如前所述,您必须将框架中的类型与合理的消息定义相似,并提供映射层以将生成的内容转换为框架本机类。
您的框架中 Vec3D
和Quad
不是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;
}