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 libfranka0.8.0 franka_ros0.8.0 机械臂Franka Emika Panda 电脑有线IP192.168.1.102 Franka IP192.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: focal2.2 查看 ROS 版本echo $ROS_DISTRO应输出noetic继续检查rosversion -d应输出noetic检查 ROS Corewhich roscore应输出/opt/ros/noetic/bin/roscore检查 catkinwhich 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_RTy查看实时优先级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 --versionUbuntu 20.04 默认通常使用GCC 9 CMake 3.16 Git 2.25只要命令可以正常运行即可。七、创建 Franka 专用 Catkin 工作空间本文将所有 Franka 相关代码放在~/catkin_franka创建工作空间mkdir -p ~/catkin_franka/src加载 ROSsource /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.08.1 进入工作空间根目录cd ~/catkin_franka查看当前内容ls -lah正常情况下只有src8.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.09.1 创建独立构建目录进入源码目录cd ~/catkin_franka/libfranka删除可能存在的旧构建结果rm -rf build重新创建mkdir build cd build9.2 使用 CMake 配置执行cmake \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_TESTSOFF \ ..参数含义CMAKE_BUILD_TYPERelease 使用发布模式编译启用优化。 BUILD_TESTSOFF 不编译 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.so10.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_testcommunication_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.012.1 进入 Catkin 源码目录cd ~/catkin_franka/src检查目录ls -lah此时应该至少有CMakeLists.txt12.2 下载固定版本执行git clone \ --recursive \ --branch 0.8.0 \ --depth 1 \ https://github.com/frankaemika/franka_ros.git下载完成后进入目录cd ~/catkin_franka/src/franka_ros12.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 依赖加载 ROSsource /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.016.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.bash16.4 编译 franka_ros执行catkin_make \ -j8 \ -DCMAKE_BUILD_TYPERelease \ -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 环境变量将工作空间加入~/.bashrcgrep -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 检查两个版本检查libfrankacd ~/catkin_franka/libfranka git describe --tags --exact-match应输出0.8.0检查franka_roscd ~/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 Franka192.168.1.110电脑和 Franka 必须位于同一网段但 IP 不能相同。例如电脑 192.168.1.102 Franka192.168.1.11020.1 查看网卡名称nmcli device status假设有线网卡名称为enp4s020.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/2420.3 检查路由ip route get 192.168.1.110正常应看到192.168.1.110 dev enp4s0 src 192.168.1.10220.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_test22.2 检查实时权限groups ulimit -r ulimit -l推荐看到用户属于 realtime 组 ulimit -r 99 ulimit -l unlimited22.3 运行测试./communication_test 192.168.1.110 \ 21 | 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 status26.3 CMake 找不到 Eigen如果出现与Eigen3有关的错误执行sudo apt install -y libeigen3-dev然后重新配置cd ~/catkin_franka/libfranka rm -rf build mkdir build cd build cmake \ -DCMAKE_BUILD_TYPERelease \ -DBUILD_TESTSOFF \ ..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_TYPERelease \ -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 libfranka26.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 \ ~/.bashrc26.8 找不到 libfranka.so如果运行程序时出现error while loading shared libraries: libfranka.so先执行export LD_LIBRARY_PATH$HOME/catkin_franka/libfranka/build:$LD_LIBRARY_PATH重新运行程序。如果确认这样可以解决再写入~/.bashrcgrep -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_TYPERelease \ -DBUILD_TESTSOFF \ .. cmake --build . -j826.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_TYPERelease \ -DFranka_DIR:PATH$HOME/catkin_franka/libfranka/build26.11 无法打开 Franka Desk先检查物理链路sudo ethtool enp4s0 | grep -E \ Speed|Duplex|Link detected应看到Speed: 1000Mb/s Duplex: Full Link detected: yes检查电脑 IPip -br addr show enp4s0检查路由ip route get 192.168.1.110检查通信ping -c 5 192.168.1.110能 ping 通后在浏览器输入https://192.168.1.11026.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理想结果ROSNoetic libfranka0.8.0 franka_ros0.8.0 libfranka.so存在 FrankaConfig.cmake存在 communication_test存在 franka_controlROS 可以找到 franka_hwROS 可以找到 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已经完成源码安装。