You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过TCP在JavaScript中读取并处理UR10机器人的数据

在JavaScript中解析UR10机器人TCP数据的解决方案

问题背景

尝试通过TCP在JavaScript中读取UR10机器人的数据,但直接转ASCII出现乱码,且不知道如何正确解析二进制数据。

运行输出

已连接至UR10机器人
--------------------原始数据---------------------
<Buffer 00 00 00 37 14 ff ff ff ff ff ff ff ff fe 03 09 55 52 43 6f 6e 74 72 6f 6c 03 0f 00 00 00 07 00 00 00 00 30 36 2d 30 38 2d 32 30 32 31 2c 20 30 38 3a ... 29 more bytes>

-----------------解码后的数据------------------
n=79
dataIn:7ÿÿÿÿÿÿÿÿþ       URControl06-08-2021, 08:31:17ÿÿÿÿÿÿÿÿþ
w&w(

(node:14184) [DEP0005] 弃用警告:Buffer() 因安全和易用性问题已被弃用。请改用 Buffer.alloc()、Buffer.allocUnsafe() 或 Buffer.from() 方法。
(使用`node --trace-deprecation ...`查看警告生成位置)
与UR10机器人的连接已关闭

所用代码

const net = require('net');
const HOST = '192.168.1.50'; 
const PORT = 30002; 

const client = new net.Socket();
client.connect(PORT, HOST, () => {
    console.log('Connected to UR10 robot');    
});

client.on('data', (data) => {

    console.log("--------------------raw data ---------------------");
    console.log(data);
    console.log("-------------------------------------------------");

    console.log("-----------------data decoded ------------------");
    var bytes = new Buffer(data, "ascii");
    var n = bytes.length;
    var dataIn = "";
    console.log('n=' + n);
    for (d = 0; d < n; d++) {
        var c = bytes[d];
        var c = String.fromCharCode(bytes[d]);
        dataIn = dataIn + c;
    }
    console.log("dataIn:" + dataIn); // this gives that buffer


    var dataInX = socket_read_ascii_float(data);
    console.log("dataInX:" + dataInX); // seems to decode, but not very useful

    client.destroy(); // Close the connection after receiving data
});

client.on('close', () => {
    console.log('Connection to UR10 robot closed');
});

解决步骤

1. 修复Buffer弃用警告

原代码中new Buffer(data, "ascii")已被Node.js弃用,直接替换为Buffer.from():

// 替换前
var bytes = new Buffer(data, "ascii");
// 替换后
var bytes = Buffer.from(data, "ascii");

2. 正确解析UR10的二进制数据

UR10在30002端口推送的是RTDE(实时数据交换)二进制协议,并非纯ASCII文本,直接转ASCII会导致乱码。需按照协议结构解析:

手动解析示例

RTDE数据头部包含4字节的uint32长度字段(小端字节序),后续为对应长度的有效载荷,可按字段类型逐个读取:

client.on('data', (data) => {
    // 读取数据长度(前4字节,小端格式)
    const payloadLength = data.readUInt32LE(0);
    // 截取有效载荷部分
    const payload = data.slice(4, 4 + payloadLength);

    // 解析关节角度(示例:前6个字段为float64类型的关节角度)
    const jointAngles = [];
    for (let i = 0; i < 6; i++) {
        // 每个float64占8字节,按小端读取
        jointAngles.push(payload.readDoubleLE(i * 8));
    }
    console.log('实际关节角度:', jointAngles);

    // 其他字段(如工具坐标、机器人状态等)可参考UR官方RTDE文档定义的偏移量和数据类型
});

使用现成库简化开发

直接使用npm库ur-rtde封装好的解析逻辑,无需手动处理二进制:

npm install ur-rtde
const rtde = require('ur-rtde');

const client = new rtde.RTDEClient('192.168.1.50', 30002);
client.connect().then(() => {
    // 订阅需要的数据源,比如实际关节角度、工具坐标等
    return client.sendOutputSetup(['actual_q', 'actual_TCP_pose']);
}).then(() => {
    // 开始接收数据
    client.sendStart();
    client.on('data', (data) => {
        console.log('实际关节角度:', data.actual_q);
        console.log('实际TCP坐标:', data.actual_TCP_pose);
    });
}).catch(err => console.error('连接或解析错误:', err));

3. 保持连接持续性

原代码中client.destroy()会在收到一次数据后关闭连接,若需要持续接收机器人实时数据,需移除该语句。


内容的提问来源于stack exchange,提问作者raymond van ophoven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:13:10