在 Linux 上安装

本章介绍如何安装 libfrankafranka_ros,它们既可以作为二进制包安装也可以从源代码构建( 任选一种即可 ),以及如何安装实时Linux内核。franka_ros 仅当想使用 ROS 平台控制机器人时才需要。

注解

虽然 libfranka 这些 franka_ros 软件包应该适用于不同的Linux发行版,但目前仅对下列发行版提供官方支持:

  • Ubuntu 18.04 LTS Bionic Beaver 和 ROS Melodic Morenia (至少需要 libfranka 0.6.0)

  • Ubuntu 20.04 LTS Focal Fossa 和 ROS Noetic Ninjemys (至少需要 libfranka 0.8.0)

以下示例基于 Ubuntu 20.04 LTS 系统和 ROS Noetic Ninjemys 加以说明。它们仅在受支持的环境中工作。

警告

我们不再为 Ubuntu 16.04 LTS Xenial Xerus 和 ROS Kinetic Kame 提供支持,因为它们已结束生命周期。

从 ROS 存储库安装(方法一)

提示

这些包可能并不总是最新的,因为它们仅在特定时间间隔同步到存储库。阅读 https://frankaemika.github.io 上的变更日志,了解特定机器人软件版本所需的 libfranka 版本。如果软件版本与存储库中的 ros-noetic-libfranka 版本不匹配,则需要 从源码构建

可从 ROS 存储库获得 libfrankafranka_ros 的二进制包。在 安装完成 ROS Noetic 之后,执行:

sudo apt install ros-noetic-libfranka ros-noetic-franka-ros

从源代码构建(方法二)

从源代码构建,请先卸载现有的之前(方法一)安装的 libfrankafranka_ros 以避免冲突:

sudo apt remove "*libfranka*"

构建libfranka

要构建 libfranka,请从 Ubuntu 的包管理器安装以下依赖项:

sudo apt install build-essential cmake git libpoco-dev libeigen3-dev

然后,通过 libfrankaGitHub 克隆来下载源代码:

对 Panda 型号需要克隆:

git clone --recursive https://github.com/frankaemika/libfranka # only for panda
cd libfranka

默认情况下,这将检出最新版本的 libfranka. 如果要构建特定版本 libfranka,请查看相应的Git 标签:

git checkout <version>
git submodule update

以上克隆 libfranka 的说明仅适用于型号 Franka Emika Robot。对于 Franka Research 3,则须克隆:

git clone --recursive https://github.com/frankaemika/libfranka --branch 0.10.0 # only for FR3
cd libfranka

在源目录中,创建一个构建目录并运行 CMake:

mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release -DBUILD_TESTS=OFF ..
cmake --build .

可选(但推荐),可以在同一目录中使用以下命令构建 libfranka Debian 软件包:

cpack -G DEB

这将创建 libfranka-<version>-<architecture>.deb。然后可以使用以下方式安装此软件包:

sudo dpkg -i libfranka*.deb

构建ROS包

安装完成 ROS Noetic 之后,在选择的一个目录中的 Catkin 工作区:

cd /path/to/desired/folder
mkdir -p catkin_ws/src
cd catkin_ws
source /opt/ros/noetic/setup.sh
catkin_init_workspace src

然后从 GitHub 克隆 franka_ros 存储库:

git clone --recursive https://github.com/frankaemika/franka_ros src/franka_ros

默认情况下,这将检出最新版本的 franka_ros,如果要构建特定版本 franka_ros,请查看相应的 Git 标签:

git checkout <version>

安装任何缺少的依赖项并构建包:(注意:以下命令中注意将 /path/to/libfranka/build 替换成自己的 libfranka build 构建路径。)

rosdep install --from-paths src --ignore-src --rosdistro noetic -y --skip-keys libfranka
catkin_make -DCMAKE_BUILD_TYPE=Release -DFranka_DIR:PATH=/path/to/libfranka/build
source devel/setup.sh

警告

如果(方法一)安装了的 ros-noetic-libfranka 未卸载,则 libfranka 可能会被从 /opt/ros/noetic 中而不是从自定义的 libfranka 构建中获取!

设置实时内核

为了使用 libfranka 控制的机器人,工作站 PC 上的控制器程序必须以 实时优先级 运行在 PREEMPT_RT 内核下。本节介绍如何给内核打补丁以支持 PREEMPT_RT 和创建安装包的过程。

注解

PREEMPT_RT 内核不支持 NVIDIA 二进制驱动程序。

首先,安装必要的依赖项:

sudo apt-get install build-essential bc curl ca-certificates gnupg2 libssl-dev lsb-release libelf-dev bison flex dwarves zstd libncurses-dev

然后,必须决定使用哪个内核版本。要查找当前使用的那个,请使用命令 uname -r 。实时补丁仅适用于选定的内核版本,请参阅 https://www.kernel.org/pub/linux/kernel/projects/rt/ 。我们建议选择与当前使用的版本匹配(如不能严格匹配则应选择最接近的)的版本。如果选择不同的版本,只需替换数字即可。确定版本后,使用 curl 下载源文件:

注解

对于使用内核版本 4.14.12 测试通过的 Ubuntu 16.04:

curl -SLO https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.14.12.tar.sign
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/4.14/older/patch-4.14.12-rt10.patch.xz
curl -SLO 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 -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.4.19.tar.sign
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/5.4/older/patch-5.4.19-rt10.patch.xz
curl -SLO 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 -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.9.1.tar.sign
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.xz
curl -SLO https://www.kernel.org/pub/linux/kernel/projects/rt/5.9/patch-5.9.1-rt20.patch.sign

并使用以下命令解压缩它们:

xz -d *.xz

验证文件完整性

注解

此步骤是可选的,但推荐! (根据经验,该验证过程容易出错,如果能确保下载过程的文件完整,也可直接跳过本节不做,至下一小节《编译内核》继续)

这些 .sign 文件可用于验证下载的文件没有损坏或篡改。此处显示的步骤改编自 Linux内核存档,有关该过程的更多详细信息,请参阅链接页面。

可以使用 gpg2 来验证 .tar 存档:

gpg2 --verify linux-*.tar.sign
gpg2 --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-*.tar
cd linux-*/
patch -p1 < ../patch-*.patch

接下来复制当前启动的内核配置作为新实时内核的默认配置:

cp -v /boot/config-$(uname -r) .config

现在可以使用此配置作为默认配置来配置构建:

make olddefconfig
make menuconfig

第二个命令会打开一个终端界面,可以在其中配置抢占模型。使用箭头键导航到 General Setup > Preemption Model 并选择 Fully Preemptible Kernel (Real-Time)

之后导航到 Cryptographic API > Certificates for signature checking (在列表的最底部)> Provide system-wide ring of trusted keys > Additional X.509 keys for default system keyring

从提示符中移除 “debian/canonical-certs.pem”,然后按OK。将此配置保存到 .config 并退出 TUI。我们建议将其他选项保留为默认值。

注解

如果更喜欢 GUI 而不是 TUI ,请使用 make xconfig 替换 make menuconfig

之后,就可以编译内核了。由于这是一个漫长的过程,请将多线程选项 -j 设置为 CPU 核心数量,也可以直接使用下面的命令:

make -j$(nproc) deb-pkg

最后,已准备好安装新创建的包。确切的名称取决于环境,但要查找的是不带 dbg 后缀的 headersimages 包。然后安装:(提示:如果编译结束后,给内核打 deb 格式包的时候报错:recipe for traget 'deb-pkg' failed. 则去到现在编译这个目录下 ctrl+h 显示隐藏文件,找到并且修改 .config 文件,把 CONFIG_MODULE_SIG_ALLCONFIG_MODULE_SIG_KEYCONFIG_SYSTEM_TRUSTED_KEYS 三项注释掉,编译时系统会自动生成一次性密钥来加密,把 CONFIG_DEBUG_INFO=y 去掉,不然新内核带巨量 debug 信息占用硬盘磁盘空间。然后重新运行 make -j$(nproc) deb-pkg 。)

sudo 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

这些限制将在 注销 并再次 登录 后得以应用。