Расшифровка данных TCP в реальном времени универсального робота в двойные значения с помощью Qt - PullRequest
0 голосов
/ 06 марта 2019

нам нужно декодировать данные TCP в реальном времени от универсального робота - робота UR5e.Идея состоит в том, чтобы управлять манипулятором робота с удаленного компьютера с Windows 7, благодаря интерфейсу TCP (порт 30003).

Мы правильно получаем кадр длиной 1108 байт со следующим распределением (как описано в официальный UR doc ):

enter image description here

Мы используем неблокирующий стандарт 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 и приведите к удвоению, но мы потеряли знак.

local variables

QByteArray raw data received

Мои вопросы:

  • Кто угодноподключился к UR через Qt и Windows и решил этот вопрос?
  • Есть ли более чистый способ преобразования из полученных байтов в двойной (как мы в настоящее время делаем с целым)?
    • Почему нам нужно преобразовать в HEX, чтобы получить окончательное значение?
    • Почему мы потеряли знак двойного в этом преобразовании?

Спасибо за помощь!

...