为了运行universal_robot_driver,我们强烈建议安装一个具有实时功能的ubuntu系统。特别是对于e系列的机器人,如果不使用实时启用的系统,较高的控制频率可能会导致不平滑的轨迹执行。
你可能仍然可以使用非实时系统来控制机器人。但是,不建议这样做。
要在ubuntu系统中获得实时支持,必须执行以下步骤:
获取实时内核的源代码
编译实时内核
设置用户权限以执行实时任务
本指南将帮助您使用实时内核设置系统。
要构建内核,您需要在系统上使用几个工具。您可以使用
$ sudo apt-get install build-essential bc ca-certificates gnupg2 libssl-dev wget gawk flex bison
在下载启用实时功能的内核源代码之前,请检查当前安装的内核版本:
$ uname -r
4.15.0-62-generic
要继续学习本教程,请创建一个临时文件夹并导航到其中。您应该在那里有足够的空间(大约25GB),因为提取的内核源代码占用很多空间。新内核安装完成后,您可以再次删除此文件夹。
在这个例子中,我们将在主文件夹中使用一个临时文件夹:
$ mkdir -p ${HOME}/rt_kernel_build
$ cd ${HOME}/rt_kernel_build
所有未来的命令都应该在这个文件夹中运行。如果文件夹不同,$符号将以相对于上述文件夹的路径作为前缀。
获取实时内核的源代码
为了构建实时内核,我们首先需要获得内核源代码和实时补丁。首先,我们必须决定要使用的内核版本。上面,我们确定我们的系统安装了4.15内核。但是,实时补丁仅适用于选定的内核版本。这些可以在realtime:preempt_rt_versions [Wiki]上找到。
在本例中,我们将选择4.14内核。选择与系统上安装的内核版本相近的内核版本。
继续下载内核源代码、补丁源代码和它们的签名文件:
$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.139-rt66.patch.xz
$ wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.14/patch-4.14.139-rt66.patch.sign
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.139.tar.xz
$ wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.139.tar.sign
要解压缩下载的文件,请执行
$ xz -dk patch-4.14.139-rt66.patch.xz
$ xz -d linux-4.14.139.tar.xz
验证
从技术上讲,您可以跳过本节,但是强烈建议您验证系统中这样一个核心组件的文件完整性!
要验证文件完整性,必须首先由内核开发人员和补丁作者导入公钥。对于内核源代码使用(按照kernel.org上的建议
$ gpg2 --locate-keys torvalds@kernel.org gregkh@kernel.org
对于补丁,搜索realtime:preempt_rt_versions [Wiki]上列出的作者的密钥。
$ gpg2 --keyserver hkp://keys.gnupg.net --search-keys zanussi
gpg: data source: http://51.38.91.189:11371
(1) German Daniel Zanussi <german.zanussi@globant.com>
4096 bit RSA key 0x537F98A9D92CEAC8, created: 2019-07-24, expires: 2023-07-24
(2) Michael Zanussi <mzanussi@gmail.com>
4096 bit RSA key 0x7C7F76A2C1E3D9EB, created: 2019-05-08
(3) Tom Zanussi <tzanussi@gmail.com>
Tom Zanussi <zanussi@kernel.org>
Tom Zanussi <tom.zanussi@linux.intel.com>
4096 bit RSA key 0xDE09826778A38521, created: 2017-12-15
(4) Riccardo Zanussi <riccardo.zanussi@gmail.com>
2048 bit RSA key 0xD299A06261D919C3, created: 2014-08-27, expires: 2018-08-27 (expired)
(5) Zanussi Gianni <g.zanussi@virgilio.it>
1024 bit DSA key 0x78B89CB020D1836C, created: 2004-04-06
(6) Michael Zanussi <zanussi@unm.edu>
Michael Zanussi <mzanussi@gmail.com>
Michael Zanussi <michael_zanussi@yahoo.com>
Michael Zanussi <michael@michaelzanussi.com>
1024 bit DSA key 0xB3E952DCAC653064, created: 2000-09-05
(7) Michael Zanussi <surfpnk@yahoo.com>
1024 bit DSA key 0xEB10BBD9BA749318, created: 1999-05-31
(8) Michael B. Zanussi <surfpnk@yahoo.com>
1024 bit DSA key 0x39EE4EAD7BBB1E43, created: 1998-07-16
Keys 1-8 of 8 for "zanussi". Enter number(s), N)ext, or Q)uit > 3
现在我们可以验证下载的源代码:
$ gpg2 --verify linux-4.14.139.tar.sign
gpg: assuming signed data in 'linux-4.14.139.tar'
gpg: Signature made Fr 16 Aug 2019 10:15:17 CEST
gpg: using RSA key 647F28654894E3BD457199BE38DBBDC86092693E
gpg: Good signature from "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
$ gpg2 --verify patch-4.14.139-rt66.patch.sign
gpg: assuming signed data in 'patch-4.14.139-rt66.patch'
gpg: Signature made Fr 23 Aug 2019 21:09:20 CEST
gpg: using RSA key 0x0129F38552C38DF1
gpg: Good signature from "Tom Zanussi <tom.zanussi@linux.intel.com>" [unknown]
gpg: aka "Tom Zanussi <zanussi@kernel.org>" [unknown]
gpg: aka "Tom Zanussi <tzanussi@gmail.com>" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 5BDF C45C 2ECC 5387 D50C E5EF DE09 8267 78A3 8521
Subkey fingerprint: ACF8 5F98 16A8 D5F0 96AE 1FD2 0129 F385 52C3 8DF1
编译:
在编译源代码之前,我们必须提取tar存档文件并应用补丁
$ tar xf linux-4.14.139.tar
$ cd linux-4.14.139
linux-4.14.139$ xzcat ../patch-4.14.139-rt66.patch.xz | patch -p1
现在要配置内核,只需键入
linux-4.14.139$ make oldconfig
这将询问内核选项。对于其他所有东西,那么抢占模型使用默认值(只需按Enter)或适应您的偏好。对于抢占模型,选择Fully Preemptible Kernel:
Preemption Model
1. No Forced Preemption (Server) (PREEMPT_NONE)
> 2. Voluntary Kernel Preemption (Desktop) (PREEMPT_VOLUNTARY)
3. Preemptible Kernel (Low-Latency Desktop) (PREEMPT__LL) (NEW)
4. Preemptible Kernel (Basic RT) (PREEMPT_RTB) (NEW)
5. Fully Preemptible Kernel (RT) (PREEMPT_RT_FULL) (NEW)
choice[1-5]: 5
现在可以构建内核了。这需要一些时间……
linux-4.14.139$ make -j `getconf _NPROCESSORS_ONLN` deb-pkg
构建完成后,在父文件夹中安装linux-headers和linux-image包(只安装名称中没有-dbg的包)
linux-4.14.139$ sudo apt install ../linux-headers-4.14.139-rt66_*.deb ../linux-image-4.14.139-rt66_*.deb
设置用户权限以使用实时调度
为了能够调度具有用户权限的线程(驱动程序将做什么),您必须通过更改/etc/security/limits.conf来更改用户的限制(详细信息请参阅手册)。
我们建议为实时用户设置一个组,而不是在配置文件中写入一个固定的用户名:
$ 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以始终引导实时内核
要使新内核成为系统每次启动时都会进入的默认内核,您必须更改/etc/default/grub.中的grub配置文件
注意:这适用于ubuntu,但可能不适用于其他linux系统。这里可能需要使用另一个菜单项名称。
但首先,让我们找出我们想要作为默认值的条目的名称。列出所有可用的内核
$ awk -F\' '/menuentry |submenu / {print $1 $2}' /boot/grub/grub.cfg
menuentry Ubuntu
submenu Advanced options for Ubuntu
menuentry Ubuntu, with Linux 4.15.0-62-generic
menuentry Ubuntu, with Linux 4.15.0-62-generic (recovery mode)
menuentry Ubuntu, with Linux 4.15.0-60-generic
menuentry Ubuntu, with Linux 4.15.0-60-generic (recovery mode)
menuentry Ubuntu, with Linux 4.15.0-58-generic
menuentry Ubuntu, with Linux 4.15.0-58-generic (recovery mode)
menuentry Ubuntu, with Linux 4.14.139-rt66
menuentry Ubuntu, with Linux 4.14.139-rt66 (recovery mode)
menuentry Memory test (memtest86+)
menuentry Memory test (memtest86+, serial console 115200)
menuentry Windows 7 (on /dev/sdc2)
menuentry Windows 7 (on /dev/sdc3)
从上面的输出中,我们需要生成一个模式为“submenu_name>entry_name”的字符串。在我们的例子中,这是
"Advanced options for Ubuntu>Ubuntu, with Linux 4.14.139-rt66"
双引号和>周围没有空格是很重要的!
这样,我们就可以设置默认的grub项,然后更新grub菜单项。不要忘记最后一步!
$ sudo sed -i 's/^GRUB_DEFAULT=.*/GRUB_DEFAULT="Advanced options for Ubuntu>Ubuntu, with Linux 4.14.139-rt66"/' /etc/default/grub
$ sudo update-grub
重启pc
执行上述步骤后,重新启动PC。它应该自动引导到正确的内核。
检查优先权力
确保内核确实支持实时调度:
$ uname -v | cut -d" " -f1-4
#1 SMP PREEMPT RT
可选:禁用CPU速度缩放
许多现代cpu支持根据当前请求的计算资源动态更改其时钟频率。在某些情况下,这可能会导致执行中的小中断。虽然实时调度的控制器线程应该不受此影响,但任何外部组件(如视觉伺服系统)可能会在缩放变化时被中断一段时间。
检查和修改省电模式,请安装cpufrequtils:
$ sudo apt install cpufrequtils
执行命令cpufreq-info,查看可用的“governors”和当前“CPU Frequency”(当前CPU频率为XXX MHZ)。在下文中,我们将调控器设置为“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
这将禁用随需应变的CPU扩展守护进程,创建一个cpufrequtils配置文件并重启cpufrequtils服务。查看cpufreq-info。
有关调控器的更多信息,请参阅内核文档。