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: installed2. 安装前注意事项
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-lenovo3. 先确认当前内核
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 update5. 安装编译依赖
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 cpufrequtils6. 下载 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=y8. 处理 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-lenovo9. 禁用 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 upload12. 安装新实时内核
查看生成的 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-grub14. 重启进入新实时内核
sudo reboot重启时进入 GRUB:
Advanced options for Ubuntu Ubuntu, with Linux 5.15.209-rt96-lenovo如果 GRUB 菜单不显示,可以开机时连续按Esc或Shift。
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: installed16. 配置 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°C18. 重启后最终检查
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.219.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.service22. 最终状态
最终成功状态如下:
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 实时控制前置配置也完成。
