Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程

前言

本文记录如何在 Ubuntu 20.04 + ROS Noetic 环境中,从源码安装:

复制代码
libfranka 0.8.0
franka_ros 0.8.0

本文采用固定版本,而不是直接安装系统软件源中的最新版,适合机械臂系统明确要求使用 0.8.0 的情况。

libfranka 是用于连接和控制 Franka 研究型机械臂的 C++ 库,提供机器人状态读取、关节运动、笛卡尔运动、力矩控制等接口;franka_ros 则在 libfranka 基础上提供 ROS 驱动、硬件接口、控制器、机器人描述和可视化等功能。

本文安装完成后的目录结构为:

复制代码
/home/用户名/catkin_franka/
├── libfranka/              # libfranka 0.8.0 源码及编译结果
├── src/
│   └── franka_ros/         # franka_ros 0.8.0 源码
├── build/                  # catkin 编译目录
└── devel/                  # catkin 开发环境

本文实测环境:

复制代码
操作系统:Ubuntu 20.04
ROS版本:ROS Noetic
libfranka:0.8.0
franka_ros:0.8.0
机械臂:Franka Emika Panda
电脑有线IP:192.168.1.102
Franka IP:192.168.1.110

一、安装前提

开始本文之前,需要已经完成以下工作:

复制代码
1. Ubuntu 20.04 已经安装完成
2. Wi-Fi 或有线网络可以正常联网
3. ROS Noetic 已经安装完成
4. rosdep 已经初始化并可以正常解析依赖
5. GitHub 可以正常访问
6. 机械臂要求使用 libfranka 0.8.0

如果尚未安装 ROS Noetic,应先完成 ROS Noetic 的安装,再继续本文。


二、确认 Ubuntu 和 ROS 环境

2.1 查看 Ubuntu 版本

复制代码
lsb_release -a

应当包含:

复制代码
Release:        20.04
Codename:       focal

2.2 查看 ROS 版本

复制代码
echo "$ROS_DISTRO"

应输出:

复制代码
noetic

继续检查:

复制代码
rosversion -d

应输出:

复制代码
noetic

检查 ROS Core:

复制代码
which roscore

应输出:

复制代码
/opt/ros/noetic/bin/roscore

检查 catkin:

复制代码
which catkin_make

应输出:

复制代码
/opt/ros/noetic/bin/catkin_make

如果 ROS_DISTRO 为空,先加载 ROS 环境:

复制代码
source /opt/ros/noetic/setup.bash

为了以后打开终端时自动加载 ROS,可以写入:

复制代码
grep -qxF \
'source /opt/ros/noetic/setup.bash' \
~/.bashrc \
|| echo \
'source /opt/ros/noetic/setup.bash' \
>> ~/.bashrc

加载:

复制代码
source ~/.bashrc

三、确认 rosdep 可以正常使用

执行:

复制代码
rosdep resolve eigen

正常应输出:

复制代码
#apt
libeigen3-dev

执行:

复制代码
rosdep resolve roscpp

正常应输出:

复制代码
#apt
ros-noetic-roscpp

如果这两个依赖都能解析,说明 rosdep 配置正常。

如果 rosdep 使用的是本地 rosdistro 数据源,不要删除:

复制代码
~/rosdistro_local

因为 rosdep 的配置文件可能仍然引用该目录。


四、确认实时内核和实时权限

编译 libfranka 本身不强制要求实时内核,但真机控制通常建议使用 PREEMPT_RT 实时内核。

查看当前内核:

复制代码
uname -r

查看内核是否启用完整实时抢占:

复制代码
cat /sys/kernel/realtime

输出:

复制代码
1

表示当前运行的是实时内核。

也可以检查:

复制代码
grep CONFIG_PREEMPT_RT "/boot/config-$(uname -r)"

正常输出:

复制代码
CONFIG_PREEMPT_RT=y

查看实时优先级:

复制代码
ulimit -r

推荐输出:

复制代码
99

查看可锁定内存:

复制代码
ulimit -l

推荐输出:

复制代码
unlimited

如果只是编译和查看源码,这一步暂时不满足也不影响安装;但连接真机并执行实时控制之前,建议完成实时内核和用户权限配置。


五、检查是否安装过二进制版本

源码安装前,应检查系统中是否通过 apt 安装过其他版本的 libfranka 或 franka_ros。

执行:

复制代码
dpkg -l | grep -E "ros-noetic-(libfranka|franka-ros)"

如果没有输出,说明没有安装 ROS 二进制版本,可以继续。

如果出现:

复制代码
ros-noetic-libfranka
ros-noetic-franka-ros

建议精确删除:

复制代码
sudo apt remove -y \
ros-noetic-libfranka \
ros-noetic-franka-ros

删除后再次检查:

复制代码
dpkg -l | grep -E "ros-noetic-(libfranka|franka-ros)"

不建议执行范围过大的命令:

复制代码
sudo apt remove "*franka*"

因为它可能删除其他名称中带有 franka 的软件包。


六、安装基础编译依赖

更新软件源:

复制代码
sudo apt update

安装基础编译工具和 libfranka 依赖:

复制代码
sudo apt install -y \
build-essential \
cmake \
git \
pkg-config \
libpoco-dev \
libeigen3-dev \
libssl-dev \
python3-rosdep \
python3-catkin-tools \
python3-catkin-pkg

检查工具版本:

复制代码
gcc --version
g++ --version
cmake --version
git --version

Ubuntu 20.04 默认通常使用:

复制代码
GCC 9
CMake 3.16
Git 2.25

只要命令可以正常运行即可。


七、创建 Franka 专用 Catkin 工作空间

本文将所有 Franka 相关代码放在:

复制代码
~/catkin_franka

创建工作空间:

复制代码
mkdir -p ~/catkin_franka/src

加载 ROS:

复制代码
source /opt/ros/noetic/setup.bash

进入源码目录:

复制代码
cd ~/catkin_franka/src

初始化工作空间:

复制代码
catkin_init_workspace

正常输出类似:

复制代码
Creating symlink "/home/用户名/catkin_franka/src/CMakeLists.txt"
pointing to "/opt/ros/noetic/share/catkin/cmake/toplevel.cmake"

检查:

复制代码
ls -l ~/catkin_franka/src/CMakeLists.txt

应当看到一个符号链接,例如:

复制代码
CMakeLists.txt -> /opt/ros/noetic/share/catkin/cmake/toplevel.cmake

此时目录结构为:

复制代码
~/catkin_franka/
└── src/
    └── CMakeLists.txt

八、下载 libfranka 0.8.0

8.1 进入工作空间根目录

复制代码
cd ~/catkin_franka

查看当前内容:

复制代码
ls -lah

正常情况下只有:

复制代码
src

8.2 下载固定版本

执行:

复制代码
git clone \
--recursive \
--branch 0.8.0 \
--depth 1 \
https://github.com/frankaemika/libfranka.git

这里几个参数的作用是:

复制代码
--recursive      同时下载子模块
--branch 0.8.0   固定检出 0.8.0 标签
--depth 1        只下载当前版本附近的历史,减少下载量

下载过程中会同时获取:

复制代码
libfranka/common

子模块。

8.3 检查版本

进入目录:

复制代码
cd ~/catkin_franka/libfranka

执行:

复制代码
git describe --tags --exact-match

必须输出:

复制代码
0.8.0

检查 Git 状态:

复制代码
git status

可能会显示:

复制代码
当前不在任何分支上。
无文件要提交,干净的工作区

或者英文:

复制代码
HEAD detached at 0.8.0
nothing to commit, working tree clean

这是正常现象。

因为 0.8.0 是固定标签,不是开发分支,所以 Git 会进入 detached HEAD 状态,不影响编译和使用。

8.4 检查子模块

复制代码
git submodule status

应看到:

复制代码
common

以及对应的提交哈希。

为了确保子模块完整,再执行:

复制代码
git submodule sync --recursive
git submodule update --init --recursive

检查 common 目录:

复制代码
ls -lah ~/catkin_franka/libfranka/common

目录中应该有实际文件,不能是空目录。


九、编译 libfranka 0.8.0

9.1 创建独立构建目录

进入源码目录:

复制代码
cd ~/catkin_franka/libfranka

删除可能存在的旧构建结果:

复制代码
rm -rf build

重新创建:

复制代码
mkdir build
cd build

9.2 使用 CMake 配置

执行:

复制代码
cmake \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF \
..

参数含义:

复制代码
CMAKE_BUILD_TYPE=Release
使用发布模式编译,启用优化。

BUILD_TESTS=OFF
不编译 libfranka 自身的单元测试,减少不必要的测试依赖。

正常结束时应看到:

复制代码
Configuring done
Generating done
Build files have been written to: /home/用户名/catkin_franka/libfranka/build

如果出现:

复制代码
CMake Error
Configuring incomplete

不要继续执行编译,应先处理报错。

9.3 开始编译

执行:

复制代码
cmake --build . -j8

其中:

复制代码
-j8

表示同时使用 8 个编译任务。

如果电脑 CPU 和内存充足,也可以使用:

复制代码
cmake --build . -j16

如果内存较小,可以改为:

复制代码
cmake --build . -j4

编译成功后,进度会达到:

复制代码
[100%]

十、验证 libfranka 编译结果

10.1 检查动态库

执行:

复制代码
find ~/catkin_franka/libfranka/build \
-name "libfranka.so*" \
-print

正常应找到:

复制代码
build/libfranka.so
build/libfranka.so.0.8
build/libfranka.so.0.8.0

实际路径类似:

复制代码
/home/用户名/catkin_franka/libfranka/build/libfranka.so

10.2 检查 CMake 配置文件

执行:

复制代码
find ~/catkin_franka/libfranka/build \
-name "FrankaConfig.cmake" \
-print

正常应找到:

复制代码
/home/用户名/catkin_franka/libfranka/build/FrankaConfig.cmake

这个文件非常重要。

后续编译 franka_ros 时,将通过:

复制代码
Franka_DIR

指向它所在的目录。

10.3 检查 communication_test

执行:

复制代码
find ~/catkin_franka/libfranka/build \
-type f \
-name "communication_test" \
-print

正常应找到:

复制代码
/home/用户名/catkin_franka/libfranka/build/examples/communication_test

communication_test 用于测试电脑与 Franka 控制器之间的实时通信质量。

10.4 再次确认版本

复制代码
cd ~/catkin_franka/libfranka
git describe --tags --exact-match

必须仍然输出:

复制代码
0.8.0

十一、是否需要执行 sudo make install

本文不执行:

复制代码
sudo make install

原因是本文希望将 libfranka 0.8.0 保留在:

复制代码
~/catkin_franka/libfranka/build

后续编译 franka_ros 时,直接通过:

复制代码
-DFranka_DIR:PATH="$HOME/catkin_franka/libfranka/build"

指定本地版本。

这样做的优点是:

复制代码
1. 不会把文件写入 /usr/local
2. 不容易与系统中的其他 libfranka 版本混淆
3. 后续切换或删除版本更方便
4. 可以明确确认 franka_ros 使用的是 0.8.0

十二、下载 franka_ros 0.8.0

12.1 进入 Catkin 源码目录

复制代码
cd ~/catkin_franka/src

检查目录:

复制代码
ls -lah

此时应该至少有:

复制代码
CMakeLists.txt

12.2 下载固定版本

执行:

复制代码
git clone \
--recursive \
--branch 0.8.0 \
--depth 1 \
https://github.com/frankaemika/franka_ros.git

下载完成后进入目录:

复制代码
cd ~/catkin_franka/src/franka_ros

12.3 检查版本

复制代码
git describe --tags --exact-match

必须输出:

复制代码
0.8.0

检查状态:

复制代码
git status

显示分离头指针状态是正常的。

12.4 检查子模块

执行:

复制代码
git submodule sync --recursive
git submodule update --init --recursive

然后查看:

复制代码
git submodule status

十三、不要删除 franka_ros 中的同名文件夹

下载完成后,可能会看到类似目录结构:

复制代码
~/catkin_franka/src/franka_ros/
├── franka_control/
├── franka_description/
├── franka_example_controllers/
├── franka_gripper/
├── franka_hw/
├── franka_msgs/
├── franka_ros/
└── franka_visualization/

这里:

复制代码
外层 franka_ros

是整个 Git 仓库。

里面的:

复制代码
franka_ros/

可能是 ROS 元功能包。

不要因为外层和内层名字相同就删除内层目录。

可以用下面命令查看所有 ROS 包:

复制代码
find ~/catkin_franka/src/franka_ros \
-maxdepth 2 \
-name package.xml \
-print

正常会看到多个 package.xml。


十四、使用 rosdep 安装 franka_ros 依赖

加载 ROS:

复制代码
source /opt/ros/noetic/setup.bash

进入工作空间:

复制代码
cd ~/catkin_franka

安装依赖:

复制代码
rosdep install \
--from-paths src \
--ignore-src \
--rosdistro noetic \
-y \
--skip-keys libfranka

各参数含义:

复制代码
--from-paths src
扫描 src 目录中的所有 ROS 功能包。

--ignore-src
如果依赖已经存在于当前源码工作空间中,不再从系统软件源安装。

--rosdistro noetic
按照 ROS Noetic 解析依赖。

-y
自动确认 apt 安装。

--skip-keys libfranka
跳过二进制 libfranka,使用本文手动编译的 libfranka 0.8.0。

其中最重要的是:

复制代码
--skip-keys libfranka

否则 rosdep 可能尝试通过 apt 安装系统仓库中的另一个 libfranka 版本。

正常结束时应看到:

复制代码
All required rosdeps installed successfully

十五、检查是否意外安装了二进制版本

执行:

复制代码
dpkg -l | grep -E "ros-noetic-(libfranka|franka-ros)"

理想情况下没有输出。

如果意外安装了:

复制代码
ros-noetic-libfranka
ros-noetic-franka-ros

可以删除:

复制代码
sudo apt remove -y \
ros-noetic-libfranka \
ros-noetic-franka-ros

然后重新执行 rosdep,确保保留:

复制代码
--skip-keys libfranka

十六、编译 franka_ros 0.8.0

16.1 检查 FrankaConfig.cmake

执行:

复制代码
test -f \
~/catkin_franka/libfranka/build/FrankaConfig.cmake \
&& echo "FrankaConfig OK" \
|| find ~/catkin_franka/libfranka/build \
-name "FrankaConfig.cmake"

正常应输出:

复制代码
FrankaConfig OK

或者显示实际文件路径。

16.2 清理旧的 Catkin 编译目录

进入工作空间:

复制代码
cd ~/catkin_franka

如果以前编译失败过,建议清理:

复制代码
rm -rf build devel

注意,这里删除的是:

复制代码
~/catkin_franka/build
~/catkin_franka/devel

不要删除:

复制代码
~/catkin_franka/libfranka/build

因为后者是刚刚编译好的 libfranka。

16.3 加载 ROS 环境

复制代码
source /opt/ros/noetic/setup.bash

16.4 编译 franka_ros

执行:

复制代码
catkin_make \
-j8 \
-DCMAKE_BUILD_TYPE=Release \
-DFranka_DIR:PATH="$HOME/catkin_franka/libfranka/build"

注意参数名称:

复制代码
Franka_DIR

大小写必须正确。

路径必须指向:

复制代码
~/catkin_franka/libfranka/build

不能写成:

复制代码
~/catkin_franka/libfranka

因为 FrankaConfig.cmake 位于 build 目录中。

编译过程中会依次构建:

复制代码
franka_msgs
franka_description
franka_hw
franka_control
franka_gripper
franka_example_controllers
franka_visualization

具体顺序可能有所不同。

成功时应看到:

复制代码
[100%] Built target ...

并生成:

复制代码
~/catkin_franka/build
~/catkin_franka/devel

检查:

复制代码
ls -ld \
~/catkin_franka/build \
~/catkin_franka/devel

两个目录都应存在。


十七、配置 franka_ros 环境变量

将工作空间加入 ~/.bashrc:

复制代码
grep -qxF \
'source ~/catkin_franka/devel/setup.bash' \
~/.bashrc \
|| echo \
'source ~/catkin_franka/devel/setup.bash' \
>> ~/.bashrc

加载:

复制代码
source ~/.bashrc

检查:

复制代码
echo "$ROS_DISTRO"

应输出:

复制代码
noetic

查看 ROS 包路径:

复制代码
echo "$ROS_PACKAGE_PATH"

应包含:

复制代码
/home/用户名/catkin_franka/src

十八、验证 franka_ros 是否编译成功

18.1 检查核心功能包

复制代码
rospack find franka_control

应返回:

复制代码
/home/用户名/catkin_franka/src/franka_ros/franka_control

继续检查:

复制代码
rospack find franka_hw
rospack find franka_description
rospack find franka_gripper
rospack find franka_example_controllers

都应返回对应目录。

18.2 查看全部 Franka ROS 包

复制代码
rospack list | grep franka

应看到多个 Franka 相关包。

18.3 检查两个版本

检查 libfranka:

复制代码
cd ~/catkin_franka/libfranka
git describe --tags --exact-match

应输出:

复制代码
0.8.0

检查 franka_ros:

复制代码
cd ~/catkin_franka/src/franka_ros
git describe --tags --exact-match

也应输出:

复制代码
0.8.0

十九、最终目录结构

安装完成后,目录大致如下:

复制代码
/home/用户名/catkin_franka/
├── build/
│   ├── franka_control/
│   ├── franka_description/
│   ├── franka_example_controllers/
│   ├── franka_gripper/
│   ├── franka_hw/
│   └── franka_msgs/
├── devel/
│   ├── include/
│   ├── lib/
│   ├── share/
│   └── setup.bash
├── libfranka/
│   ├── build/
│   │   ├── examples/
│   │   │   └── communication_test
│   │   ├── FrankaConfig.cmake
│   │   ├── libfranka.so
│   │   ├── libfranka.so.0.8
│   │   └── libfranka.so.0.8.0
│   ├── common/
│   ├── examples/
│   ├── include/
│   └── src/
└── src/
    ├── CMakeLists.txt
    └── franka_ros/
        ├── franka_control/
        ├── franka_description/
        ├── franka_example_controllers/
        ├── franka_gripper/
        ├── franka_hw/
        ├── franka_msgs/
        ├── franka_ros/
        └── franka_visualization/

二十、连接 Franka 机械臂

本文示例使用:

复制代码
电脑有线网卡:192.168.1.102/24
Franka:192.168.1.110

电脑和 Franka 必须位于同一网段,但 IP 不能相同。

例如:

复制代码
电脑:   192.168.1.102
Franka:192.168.1.110

20.1 查看网卡名称

复制代码
nmcli device status

假设有线网卡名称为:

复制代码
enp4s0

20.2 设置静态 IP

删除可能存在的旧连接:

复制代码
sudo nmcli connection delete franka 2>/dev/null || true

创建 Franka 专用连接:

复制代码
sudo nmcli connection add \
type ethernet \
ifname enp4s0 \
con-name franka \
ipv4.method manual \
ipv4.addresses 192.168.1.102/24 \
ipv4.gateway "" \
ipv4.dns "" \
ipv6.method disabled

启用:

复制代码
sudo nmcli connection up franka

检查:

复制代码
ip -br addr show enp4s0

应看到:

复制代码
enp4s0  UP  192.168.1.102/24

20.3 检查路由

复制代码
ip route get 192.168.1.110

正常应看到:

复制代码
192.168.1.110 dev enp4s0 src 192.168.1.102

20.4 测试通信

复制代码
ping -c 5 192.168.1.110

理想结果:

复制代码
0% packet loss

局域网直连延迟通常在毫秒以下。


二十一、打开 Franka Desk

浏览器输入:

复制代码
https://192.168.1.110

如果浏览器提示证书不安全,可以选择:

复制代码
高级
继续访问

这是因为 Franka Desk 使用局域网中的自签名证书。

在运行控制程序前,应确认:

复制代码
1. Franka Control 已开机
2. 急停已经释放
3. 机械臂没有错误
4. 机械臂已经解锁
5. FCI 功能可用
6. 机械臂周围没有人员和障碍物

二十二、运行 communication_test

安全提醒

communication_test 可能控制机械臂运动。

运行前必须:

复制代码
1. 清空机械臂工作空间
2. 确认末端工具安装牢固
3. 确认急停可用
4. 保持人员远离机械臂
5. 在 Franka Desk 中解除错误并解锁机器人

22.1 进入示例目录

复制代码
cd ~/catkin_franka/libfranka/build/examples

检查程序:

复制代码
ls -lh communication_test

22.2 检查实时权限

复制代码
groups
ulimit -r
ulimit -l

推荐看到:

复制代码
用户属于 realtime 组
ulimit -r = 99
ulimit -l = unlimited

22.3 运行测试

复制代码
./communication_test 192.168.1.110 \
2>&1 | tee ~/communication_test_080.log

测试结束后查看:

复制代码
tail -n 30 ~/communication_test_080.log

重点关注:

复制代码
Control command success rate
lost robot states

网络测试不能只看普通 ping。真正能否稳定控制,还需要结合:

复制代码
实时内核调度延迟
有线网卡性能
丢包情况
communication_test 结果

综合判断。


二十三、测试 franka_ros 是否可以连接真机

先加载环境:

复制代码
source /opt/ros/noetic/setup.bash
source ~/catkin_franka/devel/setup.bash

查看 franka_control 的启动文件:

复制代码
roscd franka_control
find launch -maxdepth 1 -type f -name "*.launch" -print

查看启动参数:

复制代码
grep -n "<arg" \
~/catkin_franka/src/franka_ros/franka_control/launch/franka_control.launch

通常可以使用:

复制代码
roslaunch franka_control franka_control.launch \
robot_ip:=192.168.1.110

不同版本的启动文件参数可能不同,因此建议先查看:

复制代码
roslaunch franka_control franka_control.launch --args

如果该版本支持 load_gripper 参数,并且暂时不需要夹爪,可以根据实际启动文件设置:

复制代码
roslaunch franka_control franka_control.launch \
robot_ip:=192.168.1.110 \
load_gripper:=false

不要直接添加启动文件中不存在的参数。


二十四、查看 Franka ROS 话题

启动 franka_control 后,打开另一个终端:

复制代码
source ~/.bashrc

查看 Franka 相关话题:

复制代码
rostopic list | grep franka

查看一次机器人状态:

复制代码
rostopic echo -n 1 \
/franka_state_controller/franka_states

如果能够输出关节位置、速度、力矩、末端位姿等状态信息,说明 ROS 已经成功读取机械臂状态。

查看控制器:

复制代码
rosservice call /controller_manager/list_controllers

也可以使用:

复制代码
rostopic hz \
/franka_state_controller/franka_states

查看状态发布频率。


二十五、测试 ROS Master

单独验证 ROS 时,可以打开一个终端:

复制代码
source ~/.bashrc
roscore

看到:

复制代码
started core service [/rosout]

表示 ROS Master 正常。

再打开第二个终端:

复制代码
source ~/.bashrc
rosnode list

应看到:

复制代码
/rosout

测试完成后,在运行 roscore 的终端按:

复制代码
Ctrl + C

退出。


二十六、常见问题

26.1 找不到 libfranka 标签 0.8.0

如果执行:

复制代码
git describe --tags --exact-match

没有输出 0.8.0,检查:

复制代码
cd ~/catkin_franka/libfranka
git tag -l | grep '^0\.8\.0$'

如果仓库不是使用 --branch 0.8.0 下载的,可以执行:

复制代码
git fetch --all --tags
git checkout 0.8.0
git submodule update --init --recursive

然后重新创建 build 目录编译。


26.2 common 子模块为空

如果:

复制代码
ls ~/catkin_franka/libfranka/common

发现目录为空,执行:

复制代码
cd ~/catkin_franka/libfranka

git submodule sync --recursive
git submodule update --init --recursive

再次检查:

复制代码
git submodule status

26.3 CMake 找不到 Eigen

如果出现与 Eigen3 有关的错误,执行:

复制代码
sudo apt install -y libeigen3-dev

然后重新配置:

复制代码
cd ~/catkin_franka/libfranka
rm -rf build
mkdir build
cd build

cmake \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF \
..

26.4 CMake 找不到 Poco

如果出现与 Poco 有关的错误,执行:

复制代码
sudo apt install -y libpoco-dev

然后重新运行 CMake。


26.5 franka_ros 找不到 FrankaConfig.cmake

如果编译 franka_ros 时出现:

复制代码
Could not find a package configuration file provided by "Franka"

先查找:

复制代码
find ~/catkin_franka/libfranka/build \
-name "FrankaConfig.cmake" \
-print

如果文件存在,重新编译时明确指定:

复制代码
cd ~/catkin_franka

catkin_make \
-j8 \
-DCMAKE_BUILD_TYPE=Release \
-DFranka_DIR:PATH="$HOME/catkin_franka/libfranka/build"

如果文件不存在,说明 libfranka 的 CMake 配置或编译没有成功,应先重新编译 libfranka。


26.6 rosdep 尝试安装其他版本的 libfranka

安装 franka_ros 依赖时必须使用:

复制代码
--skip-keys libfranka

完整命令:

复制代码
rosdep install \
--from-paths src \
--ignore-src \
--rosdistro noetic \
-y \
--skip-keys libfranka

26.7 rospack 找不到 franka_control

如果出现:

复制代码
package 'franka_control' not found

先加载环境:

复制代码
source /opt/ros/noetic/setup.bash
source ~/catkin_franka/devel/setup.bash

再执行:

复制代码
rospack profile
rospack find franka_control

确认 ~/.bashrc 中存在:

复制代码
source /opt/ros/noetic/setup.bash
source ~/catkin_franka/devel/setup.bash

检查:

复制代码
grep -n \
"noetic/setup.bash\|catkin_franka/devel/setup.bash" \
~/.bashrc

26.8 找不到 libfranka.so

如果运行程序时出现:

复制代码
error while loading shared libraries: libfranka.so

先执行:

复制代码
export LD_LIBRARY_PATH="$HOME/catkin_franka/libfranka/build:$LD_LIBRARY_PATH"

重新运行程序。

如果确认这样可以解决,再写入 ~/.bashrc:

复制代码
grep -qxF \
'export LD_LIBRARY_PATH=$HOME/catkin_franka/libfranka/build:$LD_LIBRARY_PATH' \
~/.bashrc \
|| echo \
'export LD_LIBRARY_PATH=$HOME/catkin_franka/libfranka/build:$LD_LIBRARY_PATH' \
>> ~/.bashrc

加载:

复制代码
source ~/.bashrc

没有出现动态库错误时,不必主动添加这一项。


26.9 编译失败后如何重新编译 libfranka

只删除 libfranka 自己的构建目录:

复制代码
cd ~/catkin_franka/libfranka

rm -rf build
mkdir build
cd build

cmake \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_TESTS=OFF \
..

cmake --build . -j8

26.10 编译失败后如何重新编译 franka_ros

删除 Catkin 构建结果:

复制代码
cd ~/catkin_franka
rm -rf build devel

不要删除:

复制代码
~/catkin_franka/libfranka/build

然后重新编译:

复制代码
source /opt/ros/noetic/setup.bash

catkin_make \
-j8 \
-DCMAKE_BUILD_TYPE=Release \
-DFranka_DIR:PATH="$HOME/catkin_franka/libfranka/build"

26.11 无法打开 Franka Desk

先检查物理链路:

复制代码
sudo ethtool enp4s0 | grep -E \
"Speed|Duplex|Link detected"

应看到:

复制代码
Speed: 1000Mb/s
Duplex: Full
Link detected: yes

检查电脑 IP:

复制代码
ip -br addr show enp4s0

检查路由:

复制代码
ip route get 192.168.1.110

检查通信:

复制代码
ping -c 5 192.168.1.110

能 ping 通后,在浏览器输入:

复制代码
https://192.168.1.110

26.12 可以 ping 通,但控制程序无法连接

依次检查:

复制代码
1. Franka Desk 中是否已解锁
2. 急停是否释放
3. 是否存在 Reflex 或其他错误
4. FCI 是否启用
5. 是否有其他程序占用了机器人控制连接
6. libfranka 版本是否与机械臂系统要求一致
7. 当前程序中的机器人 IP 是否正确

同一时间通常只能有一个程序占用机器人实时控制接口。

退出之前的控制程序后,再重新尝试。


二十七、完整检查命令

安装完成后,可以执行以下检查:

复制代码
echo "===== 实时系统 ====="
uname -r
cat /sys/kernel/realtime 2>/dev/null || true
ulimit -r
ulimit -l

echo "===== ROS ====="
echo "$ROS_DISTRO"
rosversion -d
which roscore
which catkin_make

echo "===== libfranka ====="
cd ~/catkin_franka/libfranka
git describe --tags --exact-match
find build -name "libfranka.so*" -print
find build -name "FrankaConfig.cmake" -print
find build -name "communication_test" -print

echo "===== franka_ros ====="
cd ~/catkin_franka/src/franka_ros
git describe --tags --exact-match

echo "===== ROS packages ====="
source /opt/ros/noetic/setup.bash
source ~/catkin_franka/devel/setup.bash
rospack find franka_control
rospack find franka_hw
rospack find franka_description

echo "===== Franka 网络 ====="
ip route get 192.168.1.110
ping -c 3 192.168.1.110

理想结果:

复制代码
ROS:Noetic
libfranka:0.8.0
franka_ros:0.8.0
libfranka.so:存在
FrankaConfig.cmake:存在
communication_test:存在
franka_control:ROS 可以找到
franka_hw:ROS 可以找到
Franka IP:可以 ping 通

二十八、安装完成后的备份建议

建议备份以下信息:

复制代码
cd ~/catkin_franka/libfranka
git rev-parse HEAD
git describe --tags --exact-match

cd ~/catkin_franka/src/franka_ros
git rev-parse HEAD
git describe --tags --exact-match

可以保存到文本文件:

复制代码
{
    echo "===== libfranka ====="
    cd ~/catkin_franka/libfranka
    git describe --tags --exact-match
    git rev-parse HEAD

    echo "===== franka_ros ====="
    cd ~/catkin_franka/src/franka_ros
    git describe --tags --exact-match
    git rev-parse HEAD
} > ~/franka_versions.txt

查看:

复制代码
cat ~/franka_versions.txt

建议同时备份:

复制代码
~/.bashrc
~/catkin_franka
实时内核安装包
网卡静态 IP 配置
机械臂 IP 地址

二十九、卸载方法

如果只想删除源码版本,先关闭所有 ROS 和 Franka 程序,然后执行:

复制代码
rm -rf ~/catkin_franka

再从 ~/.bashrc 中删除:

复制代码
source ~/catkin_franka/devel/setup.bash

如果曾经添加过动态库路径,也删除:

复制代码
export LD_LIBRARY_PATH=$HOME/catkin_franka/libfranka/build:$LD_LIBRARY_PATH

然后重新加载:

复制代码
source ~/.bashrc

如果没有执行过 sudo make install,删除工作空间即可,不需要清理 /usr/local。


三十、总结

本文完成了:

复制代码
1. 检查 Ubuntu 20.04 和 ROS Noetic 环境
2. 创建 ~/catkin_franka 工作空间
3. 下载 libfranka 0.8.0
4. 初始化 common 子模块
5. 编译 libfranka 0.8.0
6. 检查 libfranka.so 和 FrankaConfig.cmake
7. 生成 communication_test
8. 下载 franka_ros 0.8.0
9. 使用 rosdep 安装 ROS 依赖
10. 跳过系统二进制 libfranka
11. 指定本地 Franka_DIR 编译 franka_ros
12. 配置 Catkin 环境变量
13. 检查 franka_control 和 franka_hw
14. 配置电脑与 Franka 的直连网络
15. 测试 communication_test
16. 使用 franka_ros 读取真机状态

最终目录:

复制代码
~/catkin_franka/libfranka
~/catkin_franka/libfranka/build
~/catkin_franka/src/franka_ros
~/catkin_franka/build
~/catkin_franka/devel

最终版本:

复制代码
libfranka 0.8.0
franka_ros 0.8.0
ROS Noetic
Ubuntu 20.04

最终验证:

复制代码
cd ~/catkin_franka/libfranka
git describe --tags --exact-match

输出:

复制代码
0.8.0

执行:

复制代码
cd ~/catkin_franka/src/franka_ros
git describe --tags --exact-match

输出:

复制代码
0.8.0

执行:

复制代码
source ~/catkin_franka/devel/setup.bash
rospack find franka_control

能够返回 franka_control 的源码路径。

至此,Ubuntu 20.04 + ROS Noetic 环境下的 libfranka 0.8.0 和 franka_ros 0.8.0 已经完成源码安装。

相关推荐
墨家前任巨子8 分钟前
定时关机脚本
运维
云计算练习生9 分钟前
什么是上下文切换?进程切换时 CPU 到底在保存什么
linux·服务器·操作系统·进程切换
用户0510122572969 分钟前
RGA(二)——RK3588 的核拓扑与能力差异
linux·嵌入式
ESDWAN10 分钟前
企业组网后网络频繁掉线,常见故障排查指南
运维·网络·架构
用户05101225729611 分钟前
RGA(一)——基础知识
linux·嵌入式
qetfw15 分钟前
Debian 综合服务实训:Apache2、Samba、LDAP、vsftpd 与 OpenVPN
linux·服务器·debian
用户05101225729616 分钟前
RGA(三)——实宽高、虚宽高与对齐约束
linux·嵌入式
fastjson_25 分钟前
帆软看板 - 问题收集
linux·前端·javascript
jianpeng的工程笔记28 分钟前
EL8 / EL9 安装 Slurm 26.05.4:主备控制器、MariaDB 记账与作业验收
linux·数据库·mariadb·高性能计算·slurm
程序员-Benothing32 分钟前
Linux系统时间管理:date、timedatectl、NTP、Chrony配置
linux·运维·服务器