Кодирование плоских буферов, затем декодирование C ++, двойной массив + таблица + объединение возвращает мусор

Я заполняю некоторые сообщения плоского буфера, но когда я кодирую, а затем декодирую их, я получаю ненужную информацию. Я не включил полное сообщение, чтобы избежать посторонней информации, но я могу успешно извлечь значение перечисления компонента объединения. Однако, когда я собираюсь извлечь тип, идентифицируемый перечислением, двойной массив, который я распечатываю, содержит мусор, как показано ниже.

Вот важные части буферов:

Ввод, вывод:

KukaJAVAdriver sending armposition command:[1, 0, 0, 0, 0, 0, 1]
re-extracted 7 joint angles: 0 11 02 03 04 05 06 1

JointState.fbs:

table JointState {
// @todo consider adding name string
position:[double]; // angle in radians
velocity:[double]; // velocity in radians/second
acceleration:[double]; // acceleration in radians/(second^2)
torque:[double]; // Newton Meters (N*m)
}

ArmControlState.fbs:

include "JointState.fbs";
include "Geometry.fbs";

namespace grl.flatbuffer;

table StartArm {
}

table StopArm {
}

table PauseArm {
}

table TeachArm {
}

table ShutdownArm {
}

table MoveArmTrajectory {
traj:[JointState];
}

table MoveArmJointServo {
goal:JointState;
}

table MoveArmCartesianServo {
parent:string; // Object/Frame/Coordinate System to move wrt. Empty default is robot base
goal:Pose;
}

union ArmState { StartArm, StopArm, PauseArm, ShutdownArm, TeachArm, MoveArmTrajectory, MoveArmJointServo, MoveArmCartesianServo }

table ArmControlState {
name:string;   // entity to move
sequenceNumber:long;
timeStamp:double;
state:ArmState;
}

закодировать:

          flatbuffers::Offset<flatbuffer::ArmControlState> controlState;switch (armControlMode_) {

case flatbuffer::ArmState::ArmState_StartArm: {
controlState = flatbuffer::CreateArmControlState(*fbbP,bns,sequenceNumber++,duration,armControlMode_,flatbuffer::CreateStartArm(*fbbP).Union());
break;
}
case flatbuffer::ArmState::ArmState_MoveArmJointServo: {

/// @todo when new
JointScalar                          armPosVelAccelEmpty;
auto armPositionBuffer = fbbP->CreateVector(armPosition_.data(),armPosition_.size());
auto goalJointState = grl::flatbuffer::CreateJointState(*fbbP,armPositionBuffer);
auto moveArmJointServo = grl::flatbuffer::CreateMoveArmJointServo(*fbbP,goalJointState);
controlState = flatbuffer::CreateArmControlState(*fbbP,bns,sequenceNumber++,duration,armControlMode_,moveArmJointServo.Union());
std::cout << "KukaJAVAdriver sending armposition command:" <<armPosition_<<"\n";
break;
}
//...snip...
}

расшифровывает:

          auto states = flatbuffer::CreateKUKAiiwaStates(*fbbP,kukaiiwaStateVec);

grl::flatbuffer::FinishKUKAiiwaStatesBuffer(*fbbP, states);

flatbuffers::Verifier verifier(fbbP->GetBufferPointer(),fbbP->GetSize());
BOOST_VERIFY(grl::flatbuffer::VerifyKUKAiiwaStatesBuffer(verifier));if(armControlMode_ == flatbuffer::ArmState::ArmState_MoveArmJointServo)
{
auto states2 = flatbuffer::GetKUKAiiwaStates(fbbP->GetBufferPointer());
auto movearm = static_cast<const flatbuffer::MoveArmJointServo*>(states2->states()->Get(0)->armControlState()->state());
std::cout << "re-extracted " << movearm->goal()->position()->size() << " joint angles: ";
for(std::size_t i = 0; i <  movearm->goal()->position()->size(); ++i)
{
std::cout << i << " " << movearm->goal()->position()->Get(i);
}
std::cout << "\n";
}

kukaJavaDriverP->async_send_flatbuffer(fbbP);

1

Решение

Вы не получаете мусор, данные на самом деле верны. Ошибка в этом утверждении: std::cout << i << " " << movearm->goal()->position()->Get(i);

Если вместо этого вы написали что-то вроде: std::cout << i << "=" << movearm->goal()->position()->Get(i) << ", "; это будет более читабельным 🙂

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]