在 Linux 上安装

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

注解

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

  • Ubuntu 16.04 LTS Xenial Xerus 和 ROS Kinetic Kame
  • 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 16.04 LTS 系统和 ROS Kinetic Kame 加以说明。它们仅在受支持的环境中工作。

从 ROS 存储库安装

提示

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

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

sudo apt install ros-kinetic-libfranka ros-kinetic-franka-ros

从源代码构建

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

sudo apt remove "*libfranka*"

构建libfranka

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

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

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

git clone --recursive https://github.com/frankaemika/libfranka
cd libfranka

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

git checkout <version>
git submodule update

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

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

或者,libfranka 可以使用以下命令构建 Debian 软件包:

cpack -G DEB

这将创建 libfranka-<version>-<architecture>.deb

构建ROS包

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

cd /path/to/desired/folder
mkdir -p catkin_ws/src
cd catkin_ws
source /opt/ros/kinetic/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 kinetic -y --skip-keys libfranka
catkin_make -DCMAKE_BUILD_TYPE=Release -DFranka_DIR:PATH=/path/to/libfranka/build
source devel/setup.sh

警告

如果你还安装了 ros-kinetic-libfranka,则 libfranka 可能会被从 /opt/ros/kinetic 中选取而不是从你的自定义的 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

允许用户为其进程设置实时权限

在安装 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

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