在 Linux 上安装¶
本章介绍如何安装 libfranka
和 franka_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 存储库获得 libfranka
和 franka_ros
的二进制包。在 安装完成 ROS Kinetic 之后,执行:
sudo apt install ros-kinetic-libfranka ros-kinetic-franka-ros
从源代码构建¶
从源代码构建,请先卸载现有的之前安装的 libfranka
和 franka_ros
以避免冲突:
sudo apt remove "*libfranka*"
构建libfranka¶
要构建 libfranka
,请从 Ubuntu 的包管理器安装以下依赖项:
sudo apt install build-essential cmake git libpoco-dev libeigen3-dev
然后,通过 libfranka
从 GitHub 克隆来下载源代码:
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
后缀的 headers
和 images
包。然后安装:(提示:如果编译结束后,给内核打deb格式包的时候报错:recipe for traget 'deb-pkg' failed.
则去到你现在编译这个目录下 ctrl+h
显示隐藏文件,找到并且修改 .config
文件,把 CONFIG_MODULE_SIG_ALL、CONFIG_MODULE_SIG_KEY、CONFIG_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
这些限制将在你注销并再次登录后得以应用。