跳到主要内容

网络通信问题

实时运动指令和状态信息通过 UDP 单播发送。初次接入时,常见问题主要是地址配置错误、防火墙拦截、丢包和网卡兼容性。

UDP socket 打开失败

当异常提示“提供了一个无效的参数”或“请求的地址无效”,通常是本机地址未填写或填写错误。

本机地址查看

  • Ubuntu:ifconfig
  • Windows 设置:网络和 Internet
  • Windows 命令:ipconfig

本机地址填写示例

int main() {
// 假设机器人地址是10.0.2.160, SDK程序运行在Windows PC上, 本机地址是10.0.2.121
rokae::xMateRobot robot("10.0.2.160", "10.0.2.121");

// 或者连接时填入
rokae::xMateRobot robot2;
robot2.connectToRobot("10.0.2.160", "10.0.2.121");
}

超时前未收到机器人状态反馈

如果 IP 配置正确但仍报“超时前未收到机器人状态反馈”,通常是 UDP 消息被拦截。

Windows 排查

  • 检查防火墙入站规则是否允许对应程序/端口。 Windows入站规则设置
  • 首次弹出防火墙授权时务必允许。 防火墙弹窗

Linux 排查

先验证是否收到数据:

nc -vul -p 1337

再运行任一实时模式示例,观察是否有来自机器人地址的数据。若 1337/1338 持续无数据,按防火墙类型排查。

UFW

sudo ufw status
sudo ufw allow 1337/udp
sudo ufw allow 1338/udp
sudo ufw status

必要时关闭:

sudo ufw disable

firewalld

sudo firewall-cmd --state
sudo firewall-cmd --list-ports
sudo firewall-cmd --add-port=1337/udp
sudo firewall-cmd --add-port=1338/udp
sudo firewall-cmd --permanent --add-port=1337/udp
sudo firewall-cmd --permanent --add-port=1338/udp
sudo firewall-cmd --reload

必要时关闭:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

iptables

sudo iptables -L
sudo iptables -A INPUT -p udp --dport 1337 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 1338 -j ACCEPT

必要时可临时停用或清空规则。

关于丢包率/网络阈值 (错误位19)

发慢了

现象:在 0.7.0之前的版本报错 "请检查丢包阈值的设置是否合理,或机器人是否处于上电状态", 0.7.0之后的版本报错 "指令发送不稳定, 连续多个周期没有收到新指令"。

丢包检测原理:上位机发送过来的指令缓存在队列中,控制器固定每1ms从队列取一条指令。当取指令时队列为空时,记为一次丢包。丢包阈值指的是2秒的时间窗口里允许丢包的最大比例。比如60%,意思是2秒内允许丢2000 * 60%=1200个,大于1200就会抛出异常,报错。 实际上,99%情况下控制器认为的丢包并不是真的丢了,而只是发慢了。这个阈值可以降低判错敏感度,设当提高运行稳定性。

这个报错一般不是真的发生丢包,而且上位机发慢了,

  • 网卡类型可能影响实时性(现场反馈 Intel I219-LM 丢包概率较高,可优先尝试 Realtek)。
  • 配置网络阈值,常用 20~30,超过 50 需重点排查网络链路。
robot.setRtNetworkTolerance(20, ec);

真正发生丢包

真正的丢包发生时,尤其是持续丢包,机械臂运动时会发出很大异响,控制器日志有”ID发生跳变”的内容

发生丢包

当出现偶发的位置超差,指令保证连续且平滑,可联系珞石技术支持人员查看控制器日志,在本次运动之间,是否有"ID发生跳变的报错"。

网络抓包分析

上位机设备抓包

从工控机直连控制器转变为工控机、用户设备、控制器通过交换机连接网络拓扑,查看发送的指令是否每毫秒都有发出。

抓包拓扑

抓包文件分析

下图是控制器侧的抓包,上位机侧也同理,只是发送方和接收方反过来。 抓包分析

数据内容

  • 实时模式运动错误位

实时模式错误位数据

数据内容是20个布尔值,没有错误(指运动中的报错,不是丢包错误)发生时,都是0。

  • 机器人状态数据

机器人状态数据

长度不固定,视接收的数据而定。前8个字节是固定的控制器时间戳。

  • 指令数据

指令数据 指令数据2

分为关节指令、笛卡尔指令、力矩指令3种,长度各不相同。前8个字节都是指令ID,每段运动开始后(也就是每次调用startMove之后)的指令ID从1开始自增。

如果出现ID不连续,说明有丢包,需要结合上位机设备和控制器的抓包文件结合进一步确认。

解决建议

  1. 独立网口

若整个系统有多个设备存在数据交互,比如机械臂+边缘设备+电脑端控制,将边缘设备和机械臂单独用一个网口,避免多个设备共用。

  1. 升级网卡

可换不同的上位机设备(也就是用不同的网卡)做交叉验证,根据过往经验来看存在消费级网卡丢包的情况。

通信协议/网络连接类报错

报网络连接错误

realtime: Failed to create RT controller.network: network connection

除网络本身外,还需检查:

  • 工具工件坐标系设置是否正确
  • startMove / startLoop 调用顺序是否正确,先开始运动,再开始循环。