ros包打包二进制deb C/C++版(ros1)
工具
bloom-generate 和 fakeroot
参考连接
- 一定能解决ROS系统 rosdep update超时问题de简单方法
- ROS bloom deb打包
- 重点可参考这篇博客:将 ros 功能包打包为 deb 安装包并成功安装 (超详细解析)
- Generate deb from dependent res package locally
修改文件
如果ros包中有可执行文件的,需要在 CMakeLists.txt 中末尾添加 install 部分。
参考示例。
# -- install --
install(TARGETS xxx1 xxx2
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
其中 xxx1 xxx2 分别是 CMakeLists.txt 中 add_library 、add_executable、target_link_libraries 等生成的可执行文件名称。
如果需要拷贝文件夹,如头文件,或者是 launch config 等文件夹,需要在后面添加 install 部分。
参考示例。
install(DIRECTORY launch/ config/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch_ROS1
)
这里会将 launch 文件夹和 config 文件夹都一起复制和打包。
这里贴一段 livox-ros-driver2 的代码示例。
网址 https://github.com/Livox-SDK/livox_ros_driver2/blob/master/CMakeLists.txt
#---------------------------------------------------------------------------------------
# link libraries
#---------------------------------------------------------------------------------------
target_link_libraries(${PROJECT_NAME}_node
${LIVOX_LIDAR_SDK_LIBRARY}
${Boost_LIBRARY}
${catkin_LIBRARIES}
${PCL_LIBRARIES}
${APR_LIBRARIES}
)
#---------------------------------------------------------------------------------------
# Install
#---------------------------------------------------------------------------------------
install(TARGETS ${PROJECT_NAME}_node
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(DIRECTORY launch_ROS1/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch_ROS1
)
注意,一个 ros 包如果有多个 CMakeLists.txt 文件,需要在最外层/包所在的 CMakeLists.txt 添加。
判断是不是个 ros 包,通过目录中是否有 package.xml 文件。
参考连接:
ROS入门(一) 文件结构篇
或 官方教程 Creating a ROS Package
示例(引用自官方教程 [Creating a ROS Package])
workspace_folder/ -- WORKSPACE
src/ -- SOURCE SPACE
CMakeLists.txt -- 'Toplevel' CMake file, provided by catkin
package_1/
CMakeLists.txt -- CMakeLists.txt file for package_1
package.xml -- Package manifest for package_1
...
package_n/
CMakeLists.txt -- CMakeLists.txt file for package_n
package.xml -- Package manifest for package_n
如果需要打包其他文件夹,可 参考连接3 。
msg srv 等打包不需要做额外的更改(可 参考连接3) 。
安装python包bloom
安装bloom,这个是 python 包,用 pip 或者 apt 都可。
sudo apt install python3-bloom
处理依赖
bloom 的处理依赖方式是根据 ros 包的 package.xml 。
一般的,官方依赖可以自动解决,手动写的依赖包需要手动解决。
自动更新依赖方式
建立 rosdep 数据
sudo rosdep init
更新 rosdep 数据
rosdep update
如果遇到网络不好的情况,可参考链接1 配置离线 一定能解决ROS系统 rosdep update超时问题de简单方法
简单来说,
git clone https://github.com/ros/rosdistro.git ,
然后检查并重命名为 rosdistro 文件夹。
然后 更改 /etc/ros/rosdep/sources.list.d/20-default.list 文件,
将 yaml 到本地的 rosdistro 文件夹 如 yaml file:///xxx/xx/xxx.yaml ,
对于 index-v4.yaml 文件,找到 python 包 rosdistro 的安装路径,更改 python 包 rosdistro 的源码
更改 xxxxx/lib/python3.x/site-packages/rosdistro/init.py 文件,
更改 DEFAULT_INDEX_URL 变量到本地的 rosdistro 文件夹
示例 DEFAULT_INDEX_URL = "file:///xxx/xxx/rosdistro/index-v4.yaml" ,
然后执行 rosdep 文件夹即可。
然后在 ros 包 目录下 执行
bloom-generate rosdebian --os-name ubuntu --ros-distro noetic
和
fakeroot debian/rules binary
即可
手动添加 rosdep 规则和编译
可 参考链接4
所有的包都在一个工作空间里验证过可以。
如果 A 依赖 B
首先 进入 B 包目录下(有 package.xml) 执行
bloom-generate rosdebian --os-name ubuntu --ros-distro noetic
如果成功,会生成 debian 文件夹。
然后执行
fakeroot debian/rules binary
会自动生成 .obj 开头的文件夹,在这个文件夹进行编译。
编译完成后会在上一级目录下生成 形如 ros-xx-B-xxx.deb 的文件。
如果到这里没问题,说明 B 的包处理好了。然后
需要添加 B 的 rosdep 规则
首先建立 yaml 规则文件。如 xxxx/xxxx/xxx.yaml
B:
ubuntu: [ros-xxx-B]
或
B:
ubuntu:
apt:
packages: [ros-xxx-B]
以 livox_ros_driver2 和 ros 版本 noetic 为例,yaml 文件内容为,如果有多个,可以一直添加。
livox_ros_driver2:
ubuntu:
apt:
packages: [ros-noetic-livox-ros-driver2]
其中 livox_ros_driver2 为 ros 包的 package.xml 里的包名
ros-noetic-livox-ros-driver2 是打包好的 deb 包名。
然后将这个 yaml 添加到 /etc/ros/rosdep/sources.list.d/20-default.list 文件中。
在 /etc/ros/rosdep/sources.list.d/20-default.list 文件中 追加 一行
yaml xxxx/xxxx/xxx.yaml
然后,执行
rosdep update
更新 rosdep 数据。
再进入 A包 目录 执行
bloom-generate rosdebian --os-name ubuntu --ros-distro noetic
就能自动找到依赖。
如果报错 Could not resolve rosdep key 就是 yaml 有问题。仔细检查 yaml 文件内容(例如区分 - _ ),以及是否将 yaml 增加到 /etc/ros/rosdep/sources.list.d/20-default.list 文件中。
当 A 的 bloom-generate 通过后。可以执行 fakeroot 操作
在 A 包目录执行
fakeroot debian/rules binary
注意事项
- 如果 fakeroot 编译的时候报错,请根据提示报错的命令在终端执行,此命令执行的报错为真正报错!!!。
当 fakeroot 编译报错的时候,我这里显示
undefined reference to pthread_create' undefined reference to pthread_detach'
undefined reference to `pthread_join'
Determining if the function pthread_create exists in the pthreads failed with the following output:
/usr/bin/ld: 找不到 -lpthreads
dh_auto_configure: error: cd .obj-xxxxxxx && cmake xxx此处为命令xxxxx .. returned exit code 1
但是当执行 dh_auto_configure: error: 后面的命令时,包找不到 cmake 文件的错误,实际错误应为 找不到 cmake 文件错误。不用理会 -lpthreads 错误!!!跟lpthreads没关系。
- 如果 fakeroot 编译的时候报错,找不到 cmake 文件时,需要安装依赖。
例如,A 包依赖 B 包,先处理 B 包的 bloom-generate 和 fakeroot ,然后 fakeroot A 包的时候根据实际错误,说找不到 B 包的 .cmake 文件,这时候,需要先 apt install 安装 打包好的 B deb 包(里面含有.cmake),安装后再 fakeroot A 就能找到了。

浙公网安备 33010602011771号