ros包打包二进制deb C/C++版(ros1)

工具

bloom-generatefakeroot

参考连接

  1. 一定能解决ROS系统 rosdep update超时问题de简单方法
  2. ROS bloom deb打包
  3. 重点可参考这篇博客:将 ros 功能包打包为 deb 安装包并成功安装 (超详细解析)
  4. 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 就能找到了。

posted @ 2025-05-22 15:17  雪夜羽  阅读(274)  评论(0)    收藏  举报