在 Linux 上安装
本章介绍如何安装 libfranka 和 franka_ros,它们既可以作为二进制包安装也可以从源代码构建( 两种方法任选一种即可 ),以及如何安装实时Linux内核。franka_ros 仅当想使用 ROS 平台控制机器人时才需要。
备注
虽然 libfranka 这些 franka_ros 软件包应该适用于不同的Linux发行版,但目前仅对下列发行版提供官方支持:
Ubuntu 18.04 LTS Bionic Beaver和 ROSMelodic Morenia(至少需要
libfranka0.6.0)Ubuntu 20.04 LTS Focal Fossa和 ROSNoetic Ninjemys(至少需要
libfranka0.8.0)
以下示例基于 Ubuntu 20.04 LTS 系统和 ROS Noetic Ninjemys加以说明。它们仅在受支持的环境中工作。
警告
我们不再为 Ubuntu 16.04 LTSXenial Xerus和 ROSKinetic Kame提供支持,因为它们已结束生命周期。
从 ROS 存储库安装(方法一)
提示
这些包可能并不总是最新的,因为它们仅在特定时间间隔同步到存储库。阅读 https://frankarobotics.github.io 上的变更日志,了解特定机器人软件版本所需的 libfranka 版本。如果软件版本与存储库中的 ros-noetic-libfranka 版本不匹配,则需要 从源码构建。
可从 ROS 存储库获得 libfranka 和 franka_ros 的二进制包。在 安装完成 ROS Noetic 之后,执行:
sudo apt install ros-noetic-libfranka ros-noetic-franka-ros
从源代码构建(方法二)[推荐]
首先需要构建libfranka ,请参阅libfranka的 README.md 文件操作
构建ROS包
设置实时内核
为了使用 libfranka 控制的机器人,工作站 PC 上的控制器程序必须以实时优先级运行在 PREEMPT_RT 内核下。本节介绍如何给内核打补丁以支持 PREEMPT_RT 和创建安装包的过程。
备注
NVIDIA驱动在 PREEMPT_RT 内核上没有官方支持,但通过将环境变量 IGNORE_PREEMPT_RT_PRESENCE=1 传递给安装命令,安装可能仍然可以正常工作。
首先,安装必要的依赖项:
sudo apt-get install build-essential bc curl debhelper dpkg-dev devscripts fakeroot libssl-dev libelf-dev bison flex cpio kmod rsync libncurses-dev
然后,必须决定使用哪个内核版本。要查找当前使用的那个,请使用命令 uname -r 。实时补丁仅适用于选定的内核版本,请参阅 https://www.kernel.org/pub/linux/kernel/projects/rt/ 。我们建议选择与当前使用的版本匹配(如不能严格匹配则应选择最接近的)的版本。如果选择不同的版本,只需替换数字即可。确定版本后,使用 curl 下载源文件:
备注
对于使用内核版本 4.14.12 测试通过的 Ubuntu 16.04:
curl -LO https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.12-rt10.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.12-rt10.patch.sign
备注
对于使用内核版本 5.4.19 测试通过的 Ubuntu 18.04:
curl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patch-5.4.19-rt10.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patch-5.4.19-rt10.patch.sign
备注
对于使用内核版本 5.9.1 测试通过的 Ubuntu 20.04:
curl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.sign
备注
对于 Ubuntu 22.04,我们建议使用 Ubuntu Pro 实时内核 。启用后,您可以直接跳转到 允许用户为其进程设置实时权限。如果您不想使用 Ubuntu Pro,您可以按照其他版本的方式继续操作(已在内核版本 6.8.0 下测试):
curl -LO https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.xzcurl -LO https://www.kernel.org/pub/linux/kernel/v6.x/linux-6.8.tar.signcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patch-6.8-rt8.patch.xzcurl -LO https://www.kernel.org/pub/linux/kernel/projects/rt/6.8/older/patch-6.8-rt8.patch.sign
并使用以下命令解压缩它们:
xz -d *.xz
验证文件完整性
备注
此步骤是可选的,但推荐! (根据经验,该验证过程容易出错,如果能确保下载过程的文件完整,也可直接跳过本节不做,至下一小节《编译内核》继续)
这些 .sign 文件可用于验证下载的文件没有损坏或篡改。此处显示的步骤改编自 Linux内核存档,有关该过程的更多详细信息,请参阅链接页面。
可以使用 gpg2 来验证 .tar 存档:
gpg2 --verify linux-*.tar.signgpg2 --verify patch-*.patch.sign
如果输出类似于以下内容:
$ gpg2 --verify linux-*.tar.sign gpg: assuming signed data in 'linux-4.14.12.tar' gpg: Signature made Fr 05 Jan 2018 06:49:11 PST using RSA key ID 6092693E gpg: Can't check signature: No public key
必须首先下载签署上述文件的人的公开密钥。从上面的输出中可以看出,它具有 ID 6092693E。可以从密钥服务器获取它:
gpg2 --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 6092693E
对补丁也类似:
gpg2 --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 2872E4CC
请注意,其他内核版本的密钥可能具有不同的 ID,必须相应地进行匹配调整。
下载密钥后,现在可以验证来源。以下是正确输出的示例:
$ gpg2 --verify linux-*.tar.sign gpg: assuming signed data in 'linux-4.14.12.tar' gpg: Signature made Fr 05 Jan 2018 06:49:11 PST using RSA key ID 6092693E gpg: Good signature from "Greg Kroah-Hartman <gregkh@linuxfoundation.org>" [unknown] gpg: aka "Greg Kroah-Hartman <gregkh@kernel.org>" [unknown] gpg: aka "Greg Kroah-Hartman (Linux kernel stable release signing key) <greg@kroah.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: 647F 2865 4894 E3BD 4571 99BE 38DB BDC8 6092 693E
有关警告的更多信息,请参阅 Linux内核存档 。
编译内核
一旦确定文件下载正确,就可以提取源代码并应用补丁:
tar xf linux-*.tarcd linux-*/patch -p1 < ../patch-*.patch
接下来复制当前启动的内核配置作为新实时内核的默认配置:
cp -v /boot/config-$(uname -r) .config
从内核文件中去除调试信息以节省空间:
scripts/config --disable DEBUG_INFOscripts/config --disable DEBUG_INFO_DWARF_TOOLCHAIN_DEFAULTscripts/config --disable DEBUG_KERNEL
禁用系统范围内的受信密钥环(Ring of Trusted Keys):
scripts/config --disable SYSTEM_TRUSTED_KEYSscripts/config --disable SYSTEM_REVOCATION_LIST
激活完全可抢占内核(实时):
scripts/config --disable PREEMPT_NONEscripts/config --disable PREEMPT_VOLUNTARYscripts/config --disable PREEMPTscripts/config --enable PREEMPT_RT
现在可以使用此配置作为默认配置来配置构建:
make olddefconfig
之后,就可以编译内核了。由于这是一个漫长的过程,请将多线程选项 -j 设置为 CPU 核心数量,也可以直接使用下面的命令:
make -j$(nproc) deb-pkg
最后,您准备好安装新创建的包了。确切的包名称取决于您的环境,但要查找的是不带 dbg 后缀的 headers 和 images 包。要安装,请执行:
sudo IGNORE_PREEMPT_RT_PRESENCE=1 dpkg -i ../linux-headers-*.deb ../linux-image-*.deb
验证新内核
重新启动系统。Grub 启动菜单现在应该允许选择新安装的内核。选好启动项登录成功后,如果要查看当前正在使用的是不是前面步骤安装的实时内核,请查看 uname -a 命令的输出。它应该包含选择的 PREEMPT RT 字符串和版本号。此外, /sys/kernel/realtime 应该存在,并包含数字1。
备注
如果遇到无法引导新内核的错误,请参阅 由于 “Invalid Signature(无效签名)” 无法引导实时内核
允许用户为其进程设置实时权限
在安装 PREEMPT_RT 内核并成功运行后,添加一个名为realtime的组 ,并将控制的机器人的用户添加到该组中:
sudo addgroup realtime sudo usermod -a -G realtime $(whoami)
然后,将以下限制添加到在 /etc/security/limits.conf 文件中的realtime组
@realtime soft rtprio 99@realtime soft priority 99@realtime soft memlock 102400@realtime hard rtprio 99@realtime hard priority 99@realtime hard memlock 102400
这些限制将在 注销 并再次 登录 后得以应用。