实时 Ubuntu(可选)
重要
并非所有用例都需要实时操作系统,请阅读下文以确定您是否需要它。
我需要实时操作系统吗?
是的
如果您需要 硬实时 性能,建议使用Linux实时内核,这意味着:
没有错过周期。
最小且稳定的全循环延迟(从发送命令到接收反馈:~2ms)。
具有稳定循环时间的确定性程序执行。
但请注意:
修补过程非常繁琐,可能需要几个小时。
由于某些计算机可能与实时内核不兼容,因此无法保证修补成功。
备注
Ubuntu 22.04 用户可以利用其本机实时内核支持并跳过以下手动修补过程。要激活本机实时内核,请遵循 此教程。
不
如果您只需要 软实时 性能,则可以跳过修补并使用 Linux 安装本机附带的通用内核,这意味着:
少量的错过周期是可以容忍的。
全环延迟相对较大且不太稳定(从发出命令到收到反馈:4~10ms)。
程序执行的确定性较差,周期时间稳定性较差。
或者,您只需要 非实时 访问机器人。
Ubuntu 22.04/24.04 - 通过 Pro 订阅启用
此页面 中列出的 Ubuntu 版本具有本机实时内核支持,并且可以通过一些命令轻松启用,请参阅 完整教程。
备注
需要订阅 Ubuntu Pro 才能启用实时内核。订阅免费供个人使用。
Ubuntu 20.04 - 手动修补实时内核
准备文件
安装依赖项:
sudo apt install -y git build-essential cmake ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison curl gnupg2
标准 Ubuntu 安装附带通用内核,您可以使用 uname -r 检查内核版本。它应显示为 x.y.z,其中 x、y 和 z 是主要数字、次要数字和补丁数字。下面我们以带有 5.11.4 内核的 Ubuntu 20.04 机器为例。
实时内核补丁仅适用于选定的版本。请访问 此页面 以确保名为 linux-5.11.4.tar.xz 的内核源可用。然后访问 此页面 以确保您要使用的内核源对应的实时补丁也可用。内核源码的版本应与补丁上标明的版本相同。例如,我们需要确保 patch-5.11.4-rt11.patch.xz 可用。
当决定使用哪个版本时,请使用以下命令下载源文件和补丁文件:
curl -LO https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.11.4.tar.xz
curl -LO https://mirrors.edge.kernel.org/pub/linux/kernel/v5.x/linux-5.11.4.tar.sign
curl -LO https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.11/patch-5.11.4-rt11.patch.xz
curl -LO https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/5.11/patch-5.11.4-rt11.patch.sign
解压xz包:
xz -dk linux-5.11.4.tar.xz
xz -dk patch-5.11.4-rt11.patch.xz
验证下载的文件(可选)
要验证内核源的签名,请运行以下命令:
gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
gpg2 --verify linux-5.11.4.tar.sign
要验证补丁,请访问 the Linux Foundation Wiki 搜索作者的密钥,然后运行以下命令:
gpg2 --verify patch-5.11.4-rt11.patch.sign
编译并安装实时内核
在编译源代码之前,我们必须应用补丁:
tar xf linux-5.11.4.tar
cd linux-5.11.4
patch -p1 < ../patch-5.11.4-rt11.patch
接下来,我们配置我们的内核:
make oldconfig
会弹出一系列问题,你可以选择默认选项。当询问抢占模型时,选择 Fully Preemptible Kernel:
Preemption Model
1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
2. Preemptible Kernel (Low-Latency Desktop) (PREEMPT)
3. Fully Preemptible Kernel (Real-Time) (PREEMPT_RT) (NEW)
choice[1-4?]: 4
对于所有其他问题,请按 Enter 键选择默认选项。请注意,您可以长按 Enter 键以使用默认选项快进所有问题。完成后,将生成一个名为“.config”的文件。在我们编译内核之前,打开“.config”文件,找到并设置以下配置参数:
CONFIG_SYSTEM_TRUSTED_KEYS = ""
CONFIG_SYSTEM_REVOCATION_KEYS = ""
现在,我们准备编译新内核:
make -j `getconf _NPROCESSORS_ONLN` deb-pkg
构建完成后检查 debian 软件包:
ls ../*deb
然后我们安装所有已编译的内核 debian 软件包:
sudo dpkg -i ../*.deb
设置用户权限以使用实时调度
为了能够使用用户权限调度线程,我们需要通过修改 /etc/security/limits.conf 来更改用户的限制。为此,我们创建一个名为 realtime 的组,并将操作机器人的用户添加到该组中:
sudo groupadd realtime
sudo usermod -aG realtime $(whoami)
接下来,确保 /etc/security/limits.conf 包含以下内容:
@realtime soft rtprio 99
@realtime soft priority 99
@realtime soft memlock 102400
@realtime hard rtprio 99
@realtime hard priority 99
@realtime hard memlock 102400
将 GRUB 设置为使用实时内核启动
我们将使用 grub-customizer 来配置 grub。安装 Ubuntu 20.04:
sudo apt install grub-customizer -y
安装 Ubuntu 18.04:
sudo add-apt-repository ppa:danielrichter2007/grub-customizer -y
sudo apt update -y
sudo apt install grub-customizer -y
只需按照此 It's FOSS tutorial 中的说明即可更新您的 grub 设置。
现在重新启动系统并选择 PREEMPT_RT 内核。启动后,在终端中运行 uname -a 命令。如果一切都正确完成,该命令将返回带有 PREEMPT_RT 关键字的字符串。
禁用 CPU 速度缩放(可选)
现代 CPU 能够根据运行条件动态调整频率。在某些情况下,这可能会导致处理速度不均匀,进而中断执行。处理速度的这些波动会影响实时进程的整体性能。
要禁用速度缩放,我们将使用 cpufrequtils 来禁用省电模式:
sudo apt install cpufrequtils
运行 cpufreq-info 会显示可用的 cpufreq 调节器。标准设置为 performance, powersave。我们将把所有调控器切换到 performance:
sudo systemctl disable ondemand
sudo systemctl enable cpufrequtils
sudo sh -c 'echo "GOVERNOR=performance" > /etc/default/cpufrequtils'
sudo systemctl daemon-reload && sudo systemctl restart cpufrequtils