ROS源码分析--子话题-catkin

2023-05-16

catkin简介

  • catkin简介
    • packagexml
      • 格式1
      • 格式2
    • CMakeListtxt
    • meta package
    • 典型ROS应用添加自定义message文件
      • 修改packagexml
      • 修改CMakeListtxt
        • find_package
        • add_message
        • generate_messages
        • catkin_package
        • add_dependencies
  • 参考资料

catkin是当前ROS的官方编译工具,每天都要接触到,因此有必要单独说说。
catkin编译基于CMake,源代码以package为单位组织,每个package必须包含package.xmlCMakeList.txt两个文件。

package.xml

catkin支持两种package.xml标签格式,格式1标准说明是REP-0127,格式2标准说明是REP-0140。后者是针对前者的一些缺点进行改进后的版本,因此更加被推荐使用。
在package.xml中主要包含以下信息:

  • 描述信息(比如package的功能描述、维护者等)
  • 依赖信息
  • 元信息(比如作者、网页)
  • package信息(比如版本)

每个package.xml文件必须包含的标签包括:

  • <package> : 最高级tag,属性:format,用于指定格式
    • <name> :package名称
    • <version> :当前版本
    • <description>:package的基本描述
    • <maintainer>(至少一个):维护者
    • <license>(至少一个):协议
    • <buildtool_depend>(至少一个):一般情况下只需要指定catkin作为编译工具,在需要交叉编译的情况下需要增加目标机器的编译工具。

可选标签包括:

  • <package>
    • <url> (多个):指定package的网址
    • <author> (多个):作者
    • <build_depend> (多个):编译时需要依赖的其它package,适用于静态库
    • <conflict> (多个):声明本package与其它ROS package有冲突,不能同时部署
    • <replace> (多个):声明本package是其它package的替换版本
    • <export>:用于添加额外的信息,比如需要嵌入的其它package的插件,或者一些说明信息。

插件:

<export>
  <rviz plugin="${prefix}/plugin_description.xml"/>
</export>

废弃信息:

<export>
  <deprecated>
    This package will be removed in ROS Hydro. Instead, use package
    FOO, which provides similar features with a different API.
  </deprecated>
</export>

meta package标记:

<export>
  <metapackage/>
</export>

以及在格式1和格式2有区别的标签:

格式1

  • <package>
    • <run_depend> (多个):运行时需要依赖的其它package,如动态链接库、可执行文件、Python模块、脚本文件等。
    • <test_depend> (多个):进行单元测试时的依赖项,如前两个标签中已出现过,则不必再出现

格式2

  • <package>
    • <build_export_depend>:用于帮助使用本package的其它包传递依赖声明
    • <buildtool_export_depend>:构建工具的依赖传递声明
    • <exec_depend>:相当于格式1的run_depend标签。
    • <depend>: 相当于build_depend + buildtool_depend + exec_depend,避免重复写三个声明。不建议对系统依赖使用,因为会强行依赖development级package。
    • <doc_depend>:构建文档所需要的依赖,当前没什么用,以后可能会有需要
    • <test_depend>:进行单元测试时的依赖项,此标签中的package 可以 在其它标签中出现

上述是对package.xml的基本说明,对于用户而言,如果通过catkin_create_package命令生成的包,往往已经自动生成了需要的全部标签,只需要在依赖有所变化的情况下更改(格式1):

  • <build_depend>
  • <run_depend>

或者(格式2):

  • <depend>

CMakeList.txt

catkin基于CMake实现,CMakeList的语句与基本CMake一致,常用的包括:

  • cmake_minimum_required():CMake版本
    cmake_minimum_required(VERSION 2.8.3)
  • project():工程名
    project(your_package)
  • find_package():加载外部变量
    # 加载catkin中的变量,同时添加angles、roscpp、std_msgs的依赖
    find_package(catkin REQUIRED COMPONENTS angles roscpp std_msgs)
    # 加载Boost中的变量
    find_package(Boost REQUIRED COMPONENTS thread)
  • include_directories():添加头文件路径
    # 添加./include、${catkin_INCLUDE_DIRS}为头文件路径,如果有其它外部路径也在这里添加
    include_directories(include ${catkin_INCLUDE_DIRS})
    # Boost_INCLUDE_DIRS环境变量在上面find_package中加载
    include_directories(${Boost_INCLUDE_DIRS})
  • add_library():生成库
    # 生成库文件,可传入多个源文件
    add_library(your_library 
        libsrc1.cpp 
        libsrc2.cpp 
        libsrc_etc.cpp
    )
  • add_executable():生成可执行文件
    # 生成可执行文件,可以传入多个源文件
    add_executable(my_node 
        src0.cpp 
        src1.cpp 
        src2.cpp
    )
  • add_dependencies():添加依赖项,在使用ROS的message、service、action时注意添加,如下:
    # 添加对其它package消息的依赖,前提是已经通过find_package()引入了这个package
    add_dependencies(my_target ${catkin_EXPORTED_TARGETS})
    # 添加对本package消息的依赖
    add_dependencies(my_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
  • target_link_libraries():链接库
    # 为可执行文件或库添加链接库
    target_link_libraries(my_node
        ${catkin_LIBRARIES}        # ROS基本库
        ${Boost_LIBRARIES}         # Boost库
    )
  • install():安装
    # 默认情况catkin会为每个package在./devel中建立目录,存放目标文件
    # 目标文件可以直接通过rosrun和roslaunch访问
    # 如需制定其它安装位置,则需通过install()命令
    install(TARGETS my_node0 my_node1
      ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
      LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
      RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
    )

以上语句功能不详细叙述。
除此之外,catkin还为ROS设计了一些独有语句,包括:

  • add_message_files(), add_service_files(), add_action_files()
    用于添加自定义的message、service和action文件。基本语法为:
    # 以message为例,service、action类似
    add_message_files(
        # 目录名
        DIRECTORY msg
        # 文件名
        FILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg
    )
  • generate_messages()
    用于生成所有定义的message、service、action文件,需要添加本文件需要依赖的message文件包。
    一般情况下需要依赖std_msgs,如果用到了其它类型的msg,也要在这声明。如下:
    generate_messages(DEPENDENCIES std_msgs)
  • catkin_package()

    catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
    必须在声明add_library()或add_executable()前调用
    有5个可选参数:

    • INCLUDE_DIRS - 声明给其它package的include路径
    • LIBRARIES - 声明给其它package的库
    • CATKIN_DEPENDS - 本包依赖的catkin package
    • DEPENDS - 本包依赖的非catkin package
    • CFG_EXTRAS - 其它配置参数

    比如:

    catkin_package(
       INCLUDE_DIRS include
       LIBRARIES ${PROJECT_NAME}
       CATKIN_DEPENDS roscpp nodelet
       DEPENDS eigen opencv)
  • catkin_add_gtest(), catkin_add_nosetests(), add_rostest(), add_rostest_gtest()

meta package

Metapackages are specialized Packages in ROS (and catkin). They do not install files (other than their package.xml manifest) and they do not contain any tests, code, files, or other items usually found in packages.

A metapackage is used in a similar fashion as virtual packages are used in the debian packaging world. A metapackage simply references one or more related packages which are loosely grouped together.

Most of the metapackages in ROS are backwards compatible placeholders for converted rosbuild Stacks.

说白了,meta package就是ros为了兼容之前的编译工具rosbuild和stack的概念,硬造出来的空package。后面基于catkin构建的package是不需要meta package的。

meta package的package.xml里包含metapackage标签:

 <export>
   <metapackage />
 </export>

CMakeList.txt里应该只包含:

cmake_minimum_required(VERSION 2.8.3)
project(your_package)
find_package(catkin REQUIRED)
catkin_metapackage()

典型ROS应用:添加自定义message文件

在ROS中,为package添加自定义message(service、action)文件,或者构建纯message的package,主要需要进行以下几个工作:

修改package.xml

添加:
<build_depend>:message_generation
<run_depend>/<exec_depend>:message_runtime

修改CMakeList.txt

包括:

1. find_package()

添加构建时依赖message_generation

find_package(catkin REQUIRED COMPONENTS ... message_generation ...)

2. add_message()

添加.msg文件

add_message_files(
  DIRECTORY msg
  FILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg
)

3. generate_messages()

生成message代码,制定依赖

generate_messages(DEPENDENCIES std_msgs)

4. catkin_package()

添加运行时依赖message_runtime

catkin_package(
  ...
  CATKIN_DEPENDS ... message_runtime ...
  ...
)

5. add_dependencies()

为目标文件(add_executable(), add_library()中生成的)指定依赖

# 指定依赖本package
add_dependencies(my_target ${${PROJECT_NAME}_EXPORTED_TARGETS})

参考资料

1. rep-0127
2. rep-0140
3. package官方介绍
4. catkin官方教程

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS源码分析--子话题-catkin 的相关文章

  • 深度学习样本归一化到[0,1]还是[-1,1]

    一般 xff0c 我们需要对神经网络的输入样本进行归一化 xff0c 通常有多种选择 xff0c 比如归一化到 0 1 xff0c 或归一化到 1 1 这两种方法 xff0c 哪种归一化方法更好呢 xff1f 还是没有区别 现在的实验经验
  • ubuntu装机并设置远程连接

    step1 ubuntu16装系统的过程略过 step2 联网 step3 apt get更新 sudo apt get update step4 安装ssh 安装 openssh 服务 sudo apt get install opens
  • ros学习之串口通信(数据读取),并进行发布

    串口参数 波特率 9600 起始位 1 数据位 8 停止位 1 奇偶校验 无 例如超声波模组地址为0X01 则主机发送 0X55 0XAA 0X01 0X01 checksum checksum 61 帧头 43 用户地址 43 指令 am
  • 在Ubuntu上使用LVM对ROOT进行在线扩容

    前提 xff1a 在安装ubuntu的时候 xff0c 是使用LVM进行分区管理的 背景 xff1a 我在安装的时候 xff0c 选择了500G大小 xff0c 磁盘总大小1T xff0c 现在想扩成1T 扩容前 xff1a yang 64
  • realsense D435i双目IMU 数据集

    realsense D435i 双目IMU数据集 使用双目 43 IMU的数据双目内参双目IMU外参 使用双目 43 IMU的数据 双目内参 model type PINHOLE camera name camera image width
  • MobaXterm 登录出现 Network error :Connection timed out

    本来用SSH连接正在操作 xff0c 突然连接不好Linux xff0c 无法登陆 xff0c 出现Network error Connection timed out错误 还以为是自己哪里操作出错了 xff0c 打开本机 cmd命令窗口
  • 消息队列总结

    一 为什么需要无锁队列 xff1f 二 无锁队列是什么 xff1f 三 无锁队列是如何实现的 xff1f span class token keyword inline span span class token class name yq
  • 姿态传感器—MPU6050

    姿态传感器 MPU6050 简介寄存器数字运动处理器 DMP遇到的问题1 初始化是要水平放置 且 按照上电时的方位为基准 xff08 正点原子提供的例程 xff09 简介 MPU6050是一款六轴 xff08 三轴加速度 43 三轴角速度
  • 卡尔曼滤波的优点总结

    卡尔曼滤波的优点不在于它的估计的偏差小多少 xff0c 而在于它巧妙的融合了观测数据与估计数据 xff0c 对误差进行闭环管理 xff0c 将误差限定在一定范围 xff0c 试想 xff0c 如果没有两者的信息融合 xff0c 只有估计数据
  • 个人简历2021

    标题 个人简历 日期 2021 09 27 23 42 57 标签 简历 分类 工作 职业发展 说下我的个人简历吧 xff0c 希望大家能够了解我 xff0c 一起在技术这条路上一直走下去 个人信息 姓名性别年龄现居地址邮箱陈作立男29上海
  • 深入理解图优化与g2o:图优化篇 - 半闲居士 - 博客园 转

    深入理解图优化与g2o xff1a 图优化篇 半闲居士 博客园
  • 二次型优化问题矩阵求导解法

    二次型求导 风之舞555 博客园 https www csdn net tags MtTaEgzsOTU2NzAxLWJsb2cO0O0O html
  • SQL2000 好书 《SQL Server 2000数据库管理与开发技术大全》----求是科技 人民邮电出版社

    SQL2000 好书 SQL Server 2000数据库管理与开发技术大全 求是科技 人民邮电出版社
  • grub启动

    grub启动 如何修复引导 现象 开机直接进入grub rescue模式 解决方案 第一步 xff1a 退出rescue模式 一般只需要设置prefix变量 span class token comment 通过ls 命令查看所有的磁盘 s
  • aruco安装 配合realsense 使用

    使用github安装 网址 xff1a http www uco es investiga grupos ava node 26 git clone到本地之后 xff0c catkin make即可开始使用 使用apt安装 span cla
  • VS连接realsense D435i摄像头(4)——使用PCL绘制点云图

    本篇主要是在使用PCL绘制点云过程中遇到的问题 xff0c 初始化参照该博客 电脑系统 xff1a win10 x64Visual Studio 2019Realsense D435i摄像头使用语言 xff1a C xff0c C 43 4
  • MobaXterm 无法显示弹框或界面

    MobaXterm 无法显示弹框或界面的解决方案之一 xff1a Settings gt Configuration gt X11 gt Xorg version xff1a 选择Mobox 1 20 4 版本越新越好 亲测可用
  • VINS_FUSION的global融合思想

    VINS FUSION的global融合思想 文章目录 VINS FUSION的global融合思想 使用全局融合的原因 GPS的缺点 融合的目的 算法架构 观测和状态约束关系 GPS 融合思路 GPS残差计算 代码段 參考文献 使用全局融
  • ROS下使用 Realsense D435i 运行ORBSLAM2_with_pointcloud_map

    首先clone高博的代码 git clone https span class token operator span span class token operator span span class token operator spa
  • windows 下构建 Eclipse gdb 调试平台调试arm程序

    xfeff xfeff 安装yargarto 版本eabi编译链 http www yagarto de 安装JAVA虚拟机 JRE 就足够了 下载 eclipse 的 C C 43 43 版本 下载 zylin 插件 xff0c 在 ec

随机推荐