Franka机械臂安装实时内核

📅 2026/7/6 3:19:46 👁️ 阅读次数 📝 编程学习
Franka机械臂安装实时内核

之前安装了一个实时内核,结果电脑一开实时内核就发烫然后温度抬高就关机,后来才发现是因为NVIDIA 图形环境没有编译成功,导致一开浏览器就高温爆炸,所以后面重新安装了实时内核,最主要的就是NVIDIA 模块重新安装成功。

Ubuntu 20.04 安装 5.15.209-rt96 实时内核并配置 NVIDIA 驱动,用于 Franka 机械臂控制

1. 背景说明

本文记录一次在 Ubuntu 20.04 上手动编译安装 PREEMPT_RT 实时内核的完整过程。目标是用于 Franka Emika Panda 机械臂真机控制,同时希望保留 NVIDIA 图形环境,方便日常调试代码、浏览器查资料、运行图形界面程序。

本次安装目标:

Linux 5.15.209-rt96-lenovo PREEMPT_RT=y NVIDIA Driver 570.133.20 Ubuntu 20.04

最终验证结果:

uname -r # 5.15.209-rt96-lenovo cat /sys/kernel/realtime # 1 nvidia-smi # NVIDIA-SMI 正常显示 dkms status | grep -i nvidia # nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

2. 安装前注意事项

2.1 一定保留原来的可用内核

安装实时内核前,一定不要删除原来的普通内核。例如本文机器上保留了:

5.15.0-139-generic 5.15.0-140-lowlatency

如果实时内核启动失败,还可以从 GRUB 的 Advanced options 里选择普通内核进入系统。

2.2 实时内核不等于一定适合跑桌面

Franka 真机控制需要实时性,但浏览器、RViz、RealSense、点云、NVIDIA 图形界面都会增加系统负载和温度。

本文的目标是:

实时控制 Franka 时使用 PREEMPT_RT 调试代码时保留 NVIDIA/图形界面 正式跑真机时尽量少开浏览器、RViz、点云、视频网页

2.3 本机硬件环境

CPU:AMD Ryzen 9 5900HX GPU:NVIDIA GeForce RTX 3080 Laptop GPU 系统:Ubuntu 20.04 目标内核:5.15.209-rt96-lenovo

3. 先确认当前内核

uname -r

本文开始时处于普通内核:

5.15.0-139-generic

建议所有编译操作都先在普通稳定内核中进行。


4. 修复 apt 源问题

如果执行:

sudo apt update

出现类似:

E: 仓库 “https://dl.google.com/linux/chrome-stable/deb stable Release” 不再含有 Release 文件。

可以先临时禁用 Chrome 源:

grep -R "dl.google.com/linux/chrome" /etc/apt/sources.list /etc/apt/sources.list.d/*.list

如果源文件是:

/etc/apt/sources.list.d/google-chrome.list

执行:

sudo sed -i.bak '/dl.google.com\/linux\/chrome/s/^/# /' /etc/apt/sources.list.d/google-chrome.list

然后重新更新:

sudo apt update

5. 安装编译依赖

sudo apt install build-essential bc curl debhelper dpkg-dev devscripts \ fakeroot libssl-dev libelf-dev bison flex cpio kmod rsync libncurses-dev \ dkms pkg-config cpufrequtils

6. 下载 Linux 5.15.209 和 RT96 补丁

mkdir -p ~/rt_kernel_build cd ~/rt_kernel_build curl -LO https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.209.tar.xz curl -LO https://cdn.kernel.org/pub/linux/kernel/projects/rt/5.15/patch-5.15.209-rt96.patch.xz

解压:

xz -d linux-5.15.209.tar.xz xz -d patch-5.15.209-rt96.patch.xz tar xf linux-5.15.209.tar cd linux-5.15.209

打 RT 补丁:

patch -p1 < ../patch-5.15.209-rt96.patch

如果一路显示:

patching file ...

说明补丁成功。


7. 使用 Ubuntu 原内核配置作为模板

不要从默认配置开始。建议直接复制当前稳定内核配置:

cp /boot/config-5.15.0-139-generic .config

然后设置关键配置:

scripts/config --disable DEBUG_INFO scripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULT scripts/config --disable DEBUG_KERNEL scripts/config --disable SYSTEM_TRUSTED_KEYS scripts/config --disable SYSTEM_REVOCATION_LIST scripts/config --disable PREEMPT_NONE scripts/config --disable PREEMPT_VOLUNTARY scripts/config --disable PREEMPT scripts/config --enable PREEMPT_RT scripts/config --set-str LOCALVERSION "-rt96-lenovo"

生成配置:

make olddefconfig

检查:

grep CONFIG_PREEMPT_RT .config

希望看到:

CONFIG_PREEMPT_RT=y

8. 处理 localversion 导致版本名重复的问题

打完 RT 补丁后,源码目录里可能有:

localversion-rt

里面内容是:

-rt96

如果同时设置了:

CONFIG_LOCALVERSION="-rt96-lenovo"

可能导致最终内核版本名变成:

5.15.209-rt96-rt96-lenovo

可以检查:

make kernelrelease

如果看到重复的rt96,执行:

cd ~/rt_kernel_build/linux-5.15.209 mv localversion-rt ../localversion-rt.bak scripts/config --set-str LOCALVERSION "-rt96-lenovo" make olddefconfig rm -rf debian make kernelrelease

希望最终看到:

5.15.209-rt96-lenovo

9. 禁用 NFSD,绕过 nfs4state.c 编译错误

编译过程中可能遇到如下错误:

fs/nfsd/nfs4state.c:1826:10: note: in expansion of macro ‘clamp_t’ make[5]: *** [scripts/Makefile.build:289:fs/nfsd/nfs4state.o] 错误 1

这是 NFS Server 相关模块的编译错误。用于 Franka 控制时不需要 NFS Server,可以禁用:

cd ~/rt_kernel_build/linux-5.15.209 scripts/config --disable NFSD scripts/config --disable NFSD_V2 scripts/config --disable NFSD_V3 scripts/config --disable NFSD_V4 scripts/config --disable NFSD_BLOCKLAYOUT scripts/config --disable NFSD_SCSILAYOUT scripts/config --disable NFSD_FLEXFILELAYOUT scripts/config --disable NFSD_V4_2_INTER_SSC make olddefconfig

检查:

grep CONFIG_NFSD .config

希望看到:

# CONFIG_NFSD is not set

禁用 NFSD 不影响:

Franka 控制 libfranka ROS 浏览器 普通网络连接 NVIDIA Wi-Fi / 有线网卡

它只是关闭本机作为 NFS Server 给其他机器共享目录的功能。


10. 处理 X32 warning

如果出现:

arch/x86/Makefile:142: CONFIG_X86_X32 enabled but no binutils support

可以尝试禁用:

scripts/config --disable X86_X32_ABI scripts/config --disable X86_X32 make olddefconfig

本文实际编译时即使仍然有该 warning,也没有阻止编译成功。


11. 编译内核 deb 包

笔记本编译内核容易过热,不建议直接-j16-j10。建议保守一点:

cd ~/rt_kernel_build/linux-5.15.209 make -j4 bindeb-pkg 2>&1 | tee ~/rt_kernel_build/build_rt_j4_final.log

如果还担心过热,可以用:

make -j3 bindeb-pkg 2>&1 | tee ~/rt_kernel_build/build_rt_j3_final.log

如果报错,查看关键错误:

grep -n -iE "error:|fatal error|killed|No such file|undefined|pahole|BTF|failed|cannot|缺少|错误" \ ~/rt_kernel_build/build_rt_j4_final.log | tail -n 120

编译成功时,会看到类似:

dpkg-deb: 正在 '../linux-libc-dev_5.15.209-rt96-lenovo-1_amd64.deb' 中构建软件包 dpkg-deb: 正在 '../linux-image-5.15.209-rt96-lenovo_5.15.209-rt96-lenovo-1_amd64.deb' 中构建软件包 dpkg-buildpackage: info: binary-only upload

12. 安装新实时内核

查看生成的 deb 包:

cd ~/rt_kernel_build ls -lh *.deb

本文生成了:

linux-headers-5.15.209-rt96-lenovo_5.15.209-rt96-lenovo-1_amd64.deb linux-image-5.15.209-rt96-lenovo_5.15.209-rt96-lenovo-1_amd64.deb linux-libc-dev_5.15.209-rt96-lenovo-1_amd64.deb

安装:

sudo dpkg -i linux-image-5.15.209-rt96-lenovo_*.deb \ linux-headers-5.15.209-rt96-lenovo_*.deb \ linux-libc-dev_5.15.209-rt96-lenovo-1_amd64.deb

修复依赖并更新 GRUB:

sudo apt -f install sudo update-grub

如果 GRUB 输出里能看到:

找到 Linux 镜像:/boot/vmlinuz-5.15.209-rt96-lenovo 找到 initrd 镜像:/boot/initrd.img-5.15.209-rt96-lenovo

说明新内核已经被 GRUB 识别。


13. 处理 NVIDIA DKMS 在 PREEMPT_RT 下编译失败

安装内核时,NVIDIA DKMS 可能报错:

The kernel you are installing for is a PREEMPT_RT kernel! The NVIDIA driver does not support real-time kernels. *** Failed PREEMPT_RT sanity check. Bailing out! ***

这是 NVIDIA 驱动检测到 PREEMPT_RT 后主动退出。

先检查当前 NVIDIA DKMS 状态:

dkms status | grep -i nvidia

如果只看到普通内核,例如:

nvidia, 570.133.20, 5.15.0-139-generic, x86_64: installed nvidia, 570.133.20, 5.15.0-140-lowlatency, x86_64: installed

说明还没有为 RT 内核安装 NVIDIA 模块。

手动强制忽略 PREEMPT_RT 检查:

cd ~/rt_kernel_build sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \ dkms build -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo \ 2>&1 | tee ~/rt_kernel_build/nvidia_dkms_build_rt.log

如果成功,会看到:

DKMS: build completed.

然后安装:

sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \ dkms install -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo \ 2>&1 | tee ~/rt_kernel_build/nvidia_dkms_install_rt.log

如果成功,会看到:

DKMS: install completed.

再次检查:

dkms status | grep -i nvidia

希望看到:

nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

更新 initramfs 和 GRUB:

sudo update-initramfs -u -k 5.15.209-rt96-lenovo sudo update-grub

14. 重启进入新实时内核

sudo reboot

重启时进入 GRUB:

Advanced options for Ubuntu Ubuntu, with Linux 5.15.209-rt96-lenovo

如果 GRUB 菜单不显示,可以开机时连续按EscShift


15. 验证实时内核、NVIDIA 和 DKMS

进入系统后执行:

uname -a

希望看到:

Linux tinycarcar 5.15.209-rt96-lenovo #1 SMP PREEMPT_RT ...

检查实时内核:

cat /sys/kernel/realtime

希望看到:

1

检查 NVIDIA:

nvidia-smi

希望 NVIDIA-SMI 正常显示,例如:

NVIDIA-SMI 570.133.20 Driver Version: 570.133.20 CUDA Version: 12.8

检查显卡驱动:

lspci -nnk | grep -EA3 "VGA|3D|Display"

希望看到:

Kernel driver in use: nvidia Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia

检查 DKMS:

dkms status | grep -i nvidia

希望看到:

nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed

16. 配置 Franka 需要的实时权限

先看当前用户是否已经在realtime组:

groups

如果已经有:

realtime

则不用再添加。

如果没有,执行:

sudo groupadd realtime sudo usermod -a -G realtime $USER

然后写入实时权限配置:

sudo tee /etc/security/limits.d/99-realtime.conf > /dev/null <<'EOF' @realtime soft rtprio 99 @realtime hard rtprio 99 @realtime soft priority 99 @realtime hard priority 99 @realtime soft memlock unlimited @realtime hard memlock unlimited EOF

检查:

cat /etc/security/limits.d/99-realtime.conf

说明:

rtprio 99:允许实时线程使用较高实时优先级 priority 99:允许进程设置高优先级 memlock unlimited:允许锁内存,减少实时控制时的分页风险

建议使用memlock unlimited,而不是一些教程中的102400,因为 Franka 控制、ROS 节点、驱动程序可能需要更宽松的内存锁定限制。


17. 配置降温策略,避免真机控制时热关机

本机在刚进入 RT 内核时温度曾达到:

Tctl: +85.2°C

关闭 AMD boost 并限制 CPU 频率后下降到:

Tctl: +68.1°C

临时关闭 AMD boost:

cat /sys/devices/system/cpu/cpufreq/boost echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost

临时限制 CPU 最大频率到 2.0GHz:

sudo cpufreq-set -r -u 2.0GHz

查看温度:

sensors watch -n 1 sensors

为了重启后自动生效,创建 systemd 服务:

sudo tee /etc/systemd/system/rt-franka-cpu-limit.service > /dev/null <<'EOF' [Unit] Description=CPU limit for Franka realtime kernel After=multi-user.target [Service] Type=oneshot ExecStart=/bin/bash -c 'if [ -e /sys/devices/system/cpu/cpufreq/boost ]; then echo 0 > /sys/devices/system/cpu/cpufreq/boost; fi' ExecStart=/usr/bin/cpufreq-set -r -u 2.0GHz RemainAfterExit=yes [Install] WantedBy=multi-user.target EOF

启用服务:

sudo systemctl daemon-reload sudo systemctl enable rt-franka-cpu-limit.service sudo systemctl start rt-franka-cpu-limit.service

检查:

cat /sys/devices/system/cpu/cpufreq/boost cpufreq-info | grep -E "current policy|current CPU frequency" | head -n 30 systemctl status rt-franka-cpu-limit.service --no-pager sensors

希望看到:

boost = 0 CPU 最大频率约 2.0GHz rt-franka-cpu-limit.service active/exited 温度稳定,不要快速冲到 85~95°C

18. 重启后最终检查

sudo reboot

重启后仍然选择:

Ubuntu, with Linux 5.15.209-rt96-lenovo

进入系统后执行:

uname -r cat /sys/kernel/realtime groups cat /sys/devices/system/cpu/cpufreq/boost nvidia-smi sensors dkms status | grep -i nvidia systemctl status rt-franka-cpu-limit.service --no-pager

最终希望看到:

uname -r 5.15.209-rt96-lenovo cat /sys/kernel/realtime 1 groups 包含 realtime boost 0 nvidia-smi 正常 dkms status nvidia 在 RT 内核下 installed 温度 稳定

19. Franka 真机测试顺序

不要一上来就运行复杂控制算法。建议按以下顺序测试。

19.1 测试 Franka 网络连通

假设 Franka Control Box 的 FCI IP 是:

172.16.0.2

先 ping:

ping 172.16.0.2

再做高频 ping:

sudo ping 172.16.0.2 -i 0.001 -D -c 10000 -s 1200

如果有明显丢包、延迟很大,先不要跑控制。

19.2 测试 libfranka communication_test

如果使用 libfranka:

cd ~/libfranka/build ./examples/communication_test 172.16.0.2

如果找不到:

find ~ -name communication_test 2>/dev/null

然后运行找到的路径:

/path/to/communication_test 172.16.0.2

19.3 再启动 FrankaPy / franka-interface

如果使用 FrankaPy 或 franka-interface,先确认:

实时内核正常 NVIDIA 正常 温度稳定 网络通信测试通过 用户在 realtime 组 实时权限配置完成

再启动 FrankaPy 相关服务或控制程序。


20. 使用建议

正式控制 Franka 时建议:

1. 尽量关闭浏览器、视频网页、QQ、无关图形程序 2. 不要同时跑大规模点云、RealSense、RViz、仿真和 Franka 真机控制 3. 真机 1kHz 控制程序尽量只做控制,不要在循环里频繁 print、sleep、动态分配内存 4. RealSense / SDF / MoveIt / RViz 可以考虑放到另一台普通内核电脑上 5. RT 控制电脑只负责 libfranka / FrankaPy / franka-interface 低层控制

如果只是调试代码、查资料,可以开浏览器;但真正跑真机控制时,建议只保留必要终端和控制节点。


21. 常见问题总结

问题 1:apt update被 Chrome 源卡住

错误:

E: 仓库 “https://dl.google.com/linux/chrome-stable/deb stable Release” 不再含有 Release 文件。

解决:

sudo sed -i.bak '/dl.google.com\/linux\/chrome/s/^/# /' /etc/apt/sources.list.d/google-chrome.list sudo apt update

问题 2:NFSD 编译失败

错误:

fs/nfsd/nfs4state.c clamp() low limit slotsize greater than high limit

解决:

scripts/config --disable NFSD make olddefconfig

问题 3:版本号变成5.15.209-rt96-rt96-lenovo

原因:

localversion-rt 里有 -rt96 CONFIG_LOCALVERSION 又设置了 -rt96-lenovo

解决:

mv localversion-rt ../localversion-rt.bak scripts/config --set-str LOCALVERSION "-rt96-lenovo" make olddefconfig rm -rf debian make kernelrelease

问题 4:NVIDIA DKMS 在 RT 内核下失败

错误:

The kernel you are installing for is a PREEMPT_RT kernel! The NVIDIA driver does not support real-time kernels. *** Failed PREEMPT_RT sanity check. Bailing out! ***

解决:

sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \ dkms build -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo sudo env IGNORE_PREEMPT_RT_PRESENCE=1 IGNORE_CC_MISMATCH=1 \ dkms install -m nvidia -v 570.133.20 -k 5.15.209-rt96-lenovo

问题 5:RT 内核下温度太高

临时处理:

echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost sudo cpufreq-set -r -u 2.0GHz

永久处理:

sudo systemctl enable rt-franka-cpu-limit.service

22. 最终状态

最终成功状态如下:

uname -a # Linux tinycarcar 5.15.209-rt96-lenovo #1 SMP PREEMPT_RT ... cat /sys/kernel/realtime # 1 groups # 包含 realtime nvidia-smi # NVIDIA-SMI 570.133.20 正常 lspci -nnk | grep -EA3 "VGA|3D|Display" # Kernel driver in use: nvidia dkms status | grep -i nvidia # nvidia, 570.133.20, 5.15.209-rt96-lenovo, x86_64: installed sensors # CPU 温度稳定

至此,Ubuntu 20.04 上的5.15.209-rt96-lenovo实时内核安装完成,并且 NVIDIA 图形环境和 Franka 实时控制前置配置也完成。