网络通信问题
实时运动指令和状态信息通过 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 排查
- 检查防火墙入站规则是否允许对应程序/端口。

- 首次弹出防火墙授权时务必允许。

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个字节是固定的控制器时间戳。
- 指令数据

分为关节指令、笛卡尔指令、力矩指令3种,长度各不相同。前8个字节都是指令ID,每段运动开始后(也就是每次调用startMove之后)的指令ID从1开始自增。
如果出现ID不连续,说明有丢包,需要结合上位机设备和控制器的抓包文件结合进一步确认。
解决建议
- 独立网口
若整个系统有多个设备存在数据交互,比如机械臂+边缘设备+电脑端控制,将边缘设备和机械臂单独用一个网口,避免多个设备共用。
- 升级网卡
可换不同的上位机设备(也就是用不同的网卡)做交叉验证,根据过往经验来看存在消费级网卡丢包的情况。
通信协议/网络连接类报错
报网络连接错误
realtime: Failed to create RT controller.network: network connection
除网络本身外,还需检查:
- 工具工件坐标系设置是否正确
startMove/startLoop调用顺序是否正确,先开始运动,再开始循环。