# Franka Research 3 运行 1kHz 力控环报 communication_constraints_violation 的实时内核与网卡调优

> 原文链接：https://robotics.hellobike.com/pitfalls/franka-fr3-libfranka-communication-constraints-violation
> 频道：pitfalls | 更新日期：2026-10-21 | 标签：Franka, FR3, libfranka, PREEMPT_RT, 1kHz力控, 实时内核
> 核心摘要：libfranka 连续多周期收不到 1kHz 控制包会立即锁臂报错；需配置 PREEMPT_RT 内核、禁用 CPU 节能 C-States 并绑定独立千兆网卡中断。

# Franka Research 3 运行 1kHz 力控环报 communication_constraints_violation 的实时内核与网卡调优

## 硬件与软件环境
- **机型**：Franka Research 3 (FR3) / FR3 Duo
- **软件栈**：Ubuntu 22.04 + `libfranka` + `franka_ros2`

## 故障现象与报错
在运行阻抗控制、力矩控制或 VLA 高频动作块插值节点时，机械臂运行数秒至数分钟后突然急停抱闸，终端报错：
`libfranka: Move command aborted: motion aborted by reflex! ["communication_constraints_violation"]`

## 根因分析
Franka Control Interface (FCI) 要求上位机以严格的 **1000 Hz（周期 1ms）** 发送 UDP 控制包。只要在滑动窗口（20 个周期）内累计丢包或延迟超标超过阈值，控制柜安全反射机制就会立即触发 `communication_constraints_violation` 并抱闸锁臂。常见诱因包括：
1. 未运行 `PREEMPT_RT` 实时内核，或用户未加入 `realtime` 权限组；
2. 主板 BIOS 开启了 CPU 深度睡眠（C-States）或 Ubuntu `power-profiles-daemon` 处于节能降频模式；
3. 连接控制柜的网口经过了 USB 转千兆网卡或与外网/相机共用同一张网卡。

## 解决步骤
1. **验证实时内核与 `realtime` 权限组**：
   确认 `uname -a` 包含 `PREEMPT_RT`，并在 `/etc/security/limits.conf` 中配置：
   ```text
   @realtime soft rtprio 99
   @realtime hard rtprio 99
   @realtime soft memlock unlimited
   @realtime hard memlock unlimited
   ```
2. **锁定 CPU 性能模式并关闭深度 C-State**：
   安装 `cpufrequtils` 将所有核心锁定为 `performance`：
   ```bash
   sudo cpupower frequency-set -g performance
   ```
   并在 `/etc/default/grub` 的 `GRUB_CMDLINE_LINUX_DEFAULT` 中加入 `intel_idle.max_cstate=1 processor.max_cstate=1 idle=poll`，执行 `sudo update-grub` 重启。
3. **使用主板原生 PCIe 网卡直连并关闭网卡中断合并**：
   严禁使用 USB 网卡连接 FCI，执行 `sudo ethtool -C ＜fci_eth_name＞ rx-usecs 0 tx-usecs 0` 关闭网卡中断延迟合并，随后运行 `ping -i 0.001 -c 10000 ＜robot_fci_host＞` 确认最大往返延迟 `＜ 0.35 ms`。

## 原始参考来源 (Sources)

- [GitHub frankaemika/libfranka](https://github.com/frankaemika/libfranka)
- [GitHub frankaemika/franka_ros2](https://github.com/frankaemika/franka_ros2)