从CMakeLists到一键部署:ROS功能包deb化实战全流程解析

张开发
2026/4/21 9:06:45 15 分钟阅读

分享文章

从CMakeLists到一键部署:ROS功能包deb化实战全流程解析
1. 为什么需要将ROS功能包打包成deb在机器人开发中我们经常需要将研究成果或工具分享给团队成员或客户。直接分享源码虽然可行但会遇到各种环境依赖问题——你可能遇到过这样的场景明明在自己电脑上跑得好好的程序同事安装后却报错不断。这时候deb包的优势就显现出来了。deb是Debian系统包括Ubuntu的标准软件包格式。把ROS功能包打包成deb后安装过程就像用apt安装普通软件一样简单。我去年给客户部署SLAM系统时原本需要2天的手动配置环境打包成deb后只需一条安装命令部署时间缩短到5分钟。更重要的是deb包能保持系统整洁。源码安装会在各处留下文件而deb包通过系统包管理器统一管理卸载时也能清理干净。对于需要部署到几十台机器人的集群场景deb包更是唯一可行的方案。2. 改造CMakeLists.txt打包前的必修课2.1 基础安装规则配置CMake的install命令是打包的核心。最近给工业客户做视觉检测包时我总结出这些必备配置# 可执行文件安装比如节点程序 install(TARGETS my_ros_node ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) # 头文件安装供其他包调用 install(DIRECTORY include/ DESTINATION ${CATKIN_GLOBAL_INCLUDE_DESTINATION} FILES_MATCHING PATTERN *.h ) # Python脚本安装 install(PROGRAMS scripts/image_processor.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) # 资源文件安装launch/urdf等 install(DIRECTORY launch urdf rviz DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION} )特别注意如果用到动态参数配置需要确认已添加generate_dynamic_reconfigure_options( cfg/DetectThreshold.cfg )2.2 特殊文件处理技巧上周打包导航包时遇到msg文件丢失的问题后来发现需要确保CMakeLists包含find_package(catkin REQUIRED COMPONENTS message_generation std_msgs ) add_message_files( DIRECTORY msg FILES NavigationStatus.msg ) generate_messages( DEPENDENCIES std_msgs ) catkin_package( CATKIN_DEPENDS message_runtime )对于第三方库有个实用技巧# 将本地编译的库一起打包 set(my_libs ${CMAKE_CURRENT_SOURCE_DIR}/lib/libcustom_planner.so) install(FILES ${my_libs} DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION} )3. 使用bloom生成deb包3.1 环境准备与工具安装推荐使用Ubuntu 20.04/22.04 ROS Noetic/Humble组合这是目前最稳定的打包环境。先安装必备工具sudo apt update sudo apt install python3-bloom fakeroot dpkg-dev如果遇到python-bloom找不到的问题常见于Ubuntu 22.04直接改用python3-bloom即可。3.2 分步打包实战假设我们要打包一个名为robot_vision的功能包cd ~/catkin_ws/src/robot_vision # 生成debian构建规则 bloom-generate rosdebian --os-name ubuntu --ros-distro noetic # 开始构建约5-15分钟 fakeroot debian/rules binary第一次运行时可能会遇到网络超时这是bloom在下载ROS仓库索引。可以多试几次或者换个网络环境。构建成功后会在上层目录生成类似ros-noetic-robot-vision_1.0.0-focal_amd64.deb的文件。我习惯用这个命令快速查找ls ../*.deb | head -14. 安装与测试技巧4.1 安装deb包sudo dpkg -i ../ros-noetic-robot-vision_1.0.0-focal_amd64.deb如果报依赖错误比如缺少v4l-utils先解决依赖sudo apt install -f4.2 验证安装我通常会做三级检查检查文件位置dpkg -L ros-noetic-robot-vision确认节点、资源文件都在/opt/ros/noetic下正确位置运行基础测试roslaunch robot_vision detect.launch检查动态参数rosrun rqt_reconfigure rqt_reconfigure5. 常见问题排坑指南5.1 依赖问题解决方案症状安装时报dpkg-shlibdeps: error通常是缺少库依赖。解决# 方法1忽略缺失的依赖信息适合已知环境一致的情况 dh_shlibdeps --dpkg-shlibdeps-params--ignore-missing-info fakeroot debian/rules binary # 方法2补全依赖推荐 sudo apt install libopencv-dev # 替换为实际缺少的库5.2 路径问题处理症状程序运行时找不到资源文件。预防在代码中永远用相对路径获取资源import rospkg pkg_path rospkg.RosPack().get_path(robot_vision) config_file os.path.join(pkg_path, config, params.yaml)5.3 多包联合打包当项目包含多个互相依赖的包时建议打包顺序基础消息包*.msg核心算法包应用层包可以用脚本批量处理for pkg in msg_base navigation vision; do cd $pkg bloom-generate rosdebian --os-name ubuntu --ros-distro noetic fakeroot debian/rules binary cd .. sudo dpkg -i ros-noetic-${pkg}_*.deb done6. 高级技巧自动化与持续集成对于需要频繁打包的团队我建议配置自动化流程。这是我们在用的Jenkins流水线片段#!/bin/bash source /opt/ros/noetic/setup.bash cd ${WORKSPACE}/src # 检查所有包是否能编译 catkin build --no-status --force-color --make-args -j4 # 逐个打包 for pkg in $(catkin list -u); do cd ${pkg} bloom-generate rosdebian --os-name ubuntu --ros-distro noetic fakeroot debian/rules binary mv ../*.deb ${WORKSPACE}/output/ done配套的版本管理策略主版本号功能重大变更次版本号新增功能修订号bug修复可以通过package.xml控制版本version2.3.1/version最后提醒打包前务必在干净环境中测试。我习惯用Docker快速验证docker run -it --rm ros:noetic-ros-core bash apt update apt install -y ./my-package.deb

更多文章