нам нужно декодировать данные TCP в реальном времени от универсального робота - робота UR5e.Идея состоит в том, чтобы управлять манипулятором робота с удаленного компьютера с Windows 7, благодаря интерфейсу TCP (порт 30003).
Мы правильно получаем кадр длиной 1108 байт со следующим распределением (как описано в официальный UR doc ):
Мы используем неблокирующий стандарт QTcpSocket.Когда поступают данные, выполняется следующий слот:
void Robot::onTcpDataReceived()
{
QByteArray buffer = m_socket->readAll();
m_state->update(buffer);
}
void RobotState::update(const QByteArray data)
{
//Decode length data
int length = 0;
memcpy(&length, data.constData(), 4);
length = qToBigEndian(length);
qDebug() << length; //Print 1108 as expected
//Decode joint 1 current position
QByteArray jointArray = data.mid(252,8).toHex();
long long currentJointPosition1=jointArray.toLongLong(0,16);
double converted = reinterpret_cast<double&>(currentJointPosition1);
qDebug() << converted << " " << data.mid(252,8).toHex().toDouble();
//Expected -3.1585... but received 3.1585
//... decode the rest of the values
}
Для декодирования первого значения, целого числа 4 байта, мы получаем доступ к массиву и используем функцию memcpy.Затем мы конвертируем в qToBigEndian, и результат в порядке.
Но для двойных значений данных tcp мы не можем следовать той же процедуре (используя memcpy, а затем конвертируя в big endian, корректируя varтипов).
Вместо этого нам нужно сначала изолировать 8 полученных байтов (jointArray) и преобразовать их в шестнадцатеричный код.Затем используйте метод .ToLongLong и приведите к удвоению, но мы потеряли знак.
Мои вопросы:
- Кто угодноподключился к UR через Qt и Windows и решил этот вопрос?
- Есть ли более чистый способ преобразования из полученных байтов в двойной (как мы в настоящее время делаем с целым)?
- Почему нам нужно преобразовать в HEX, чтобы получить окончательное значение?
- Почему мы потеряли знак двойного в этом преобразовании?
Спасибо за помощь!