在 Linux 上安装
本章介绍如何安装 libfranka
和 franka_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 存储库获得 libfranka
和 franka_ros
的二进制包。在 安装完成 ROS Noetic 之后,执行:
sudo apt install ros-noetic-libfranka ros-noetic-franka-ros
从源代码构建(方法二)[推荐]
首先需要构建libfranka ,请参阅libfranka的 README.md 文件操作
构建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
备注
对于 Ubuntu 22.04,我们建议使用 Ubuntu Pro 实时内核。启用后,您可以直接跳转到 允许用户为其进程设置实时权限。
并使用以下命令解压缩它们:
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。
备注
如果遇到无法引导新内核的错误,请参阅 由于 “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
这些限制将在 注销 并再次 登录 后得以应用。