能否将第三方ROS包嵌入自身ROS包,实现机器人端的免依赖部署?
未发布第三方ROS依赖的部署落地方案
方案适配的前置约束
所有实现路径均匹配当前的环境与需求边界:
- 目标部署环境为Ubuntu 16.04 + ROS Kinetic C++开发生态
- 部署自有ROS包时,无需手动提前检查、单独安装ros_msg_parser依赖
- 不采用黑盒.so库方案,保留源码完全可见性、版本可追溯,便于实验室同事后续维护
- 适配ros_msg_parser本身为标准catkin ROS包的编译逻辑,不生硬套用裸Cmake项目的通用build、make install流程
可落地的实现路径
路径1:以Git子模块形式绑定依赖源码
该方案是和你当前“同工作空间catkin_make编译”临时方案兼容性最高、改造成本最低的选择:
- 操作逻辑:在自有ROS包的仓库根目录,将固定版本的ros_msg_parser源码仓库配置为Git子模块,拉取路径直接指向catkin工作空间的src目录下
- 部署流程:同事克隆自有包仓库时,只需在克隆命令中加入
--recursive参数,即可自动拉取对应绑定版本的ros_msg_parser源码,和自有包共同通过catkin_make完成编译,全程不需要额外检查设备是否预装该依赖 - 适配优势:完全遵循catkin包的原生编译流程,没有流程适配成本;依赖版本和自有包的Git提交记录强绑定,每次代码迭代对应的ros_msg_parser版本可追溯,源码完全开放,不存在黑盒问题
- 优化提示:固定子模块的具体提交版本,不要跟踪上游分支的动态更新,避免上游代码变动导致自有包编译异常
路径2:修正ExternalProject_Add的适配逻辑
你之前尝试该思路失败,本质是没有适配catkin的环境变量逻辑,按照调整方法即可实现自动编译:
- 问题根因:ros_msg_parser是标准catkin包,编译时需要依赖ROS环境下的
CMAKE_PREFIX_PATH、消息搜索路径等环境变量,直接按裸Cmake项目的逻辑调用build、make install流程,会出现环境变量缺失、依赖找不到的问题 - 调整方法:在ExternalProject_Add的配置参数中,显式传递当前catkin工作空间的所有ROS环境变量,将构建命令从默认的裸make流程替换为
catkin_make --pkg ros_msg_parser,指定安装输出路径为当前catkin工作空间的install目录 - 实现效果:当执行自有包的catkin构建时,会自动拉取指定版本的ros_msg_parser源码,完成编译、安装流程,完全不需要用户手动干预;适合需要将依赖代码完全封装在自有包内部、不对外暴露子仓库的场景
- 注意点:该方案的配置成本高于Git子模块方案,需要针对ROS Kinetic的环境变量做专门适配,后续ROS版本升级时需要同步调整配置逻辑
路径3:构建实验室内部apt源实现一键部署
这是和ROS生态官方包部署逻辑一致性最高的长期方案,也匹配你之前提到的“发布为生态通用程序”的思路:
- 操作逻辑:按照ROS官方deb包的打包规范,将固定版本的ros_msg_parser编译为适配Ubuntu16.04 + ROS Kinetic的deb包,同时将自有ROS包也制作成deb包,在deb包的依赖配置中写死ros_msg_parser的对应包名,将两类包统一放到实验室维护的内网apt源中
- 部署流程:机器人提前配置好实验室的内网apt源后,执行
apt install <自有ROS包名>即可自动拉取、安装对应版本的ros_msg_parser依赖,完全不需要手动检查依赖是否存在 - 适配优势:和官方ROS包的升级、管理逻辑完全一致,后续版本迭代只需要更新内网源的包内容即可,不需要逐个设备手动更新;适合长期维护、机器人数量较多的实验室场景
核心逻辑总结
所有能满足需求的方案,本质都是把依赖的获取、编译、安装动作,完全嵌入到自有包的构建/部署链路中,让用户在部署自有包时,不需要为该依赖做任何单独的准备动作。你之前排除的“全局单独安装依赖”“预编译黑盒.so库”方案,本质都是把依赖的准备动作拆到了自有包部署流程之外,所以不符合核心诉求。
内容的提问来源于stack exchange,提问作者Elder Yang
相关产品推荐
相关产品推荐

