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>
  • 1
  • 2
  • 3

废弃信息:

<export><deprecated>This package will be removed in ROS Hydro. Instead, use packageFOO, which provides similar features with a different API.</deprecated>
</export>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

meta package标记:

<export><metapackage/>
</export>
  • 1
  • 2
  • 3

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

以上语句功能不详细叙述。
除此之外,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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • generate_messages()
    用于生成所有定义的message、service、action文件,需要添加本文件需要依赖的message文件包。
    一般情况下需要依赖std_msgs,如果用到了其它类型的msg,也要在这声明。如下:
    generate_messages(DEPENDENCIES std_msgs)
  • 1
  • 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 includeLIBRARIES ${PROJECT_NAME}CATKIN_DEPENDS roscpp nodeletDEPENDS eigen opencv)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 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>
  • 1
  • 2
  • 3

CMakeList.txt里应该只包含:

cmake_minimum_required(VERSION 2.8.3)
project(your_package)
find_package(catkin REQUIRED)
catkin_metapackage()
  • 1
  • 2
  • 3
  • 4

典型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 ...)
  • 1

2. add_message()

添加.msg文件

add_message_files(DIRECTORY msgFILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg
)
  • 1
  • 2
  • 3
  • 4

3. generate_messages()

生成message代码,制定依赖

generate_messages(DEPENDENCIES std_msgs)
  • 1

4. catkin_package()

添加运行时依赖message_runtime

catkin_package(...CATKIN_DEPENDS ... message_runtime ......
)
  • 1
  • 2
  • 3
  • 4
  • 5

5. add_dependencies()

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

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

参考资料

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

关于ROS功能包里package.xml和CMakeList.txt的源码分析相关推荐

  1. 对ROS功能包中package.xml文件的疑问

    在一个ROS功能包中,CMakeList.txt和package.xml是不可缺少的两个文件. 最近听师兄说,如果xml文件出错了,功能包会无法通过 我是比较怀疑这个说法的,毕竟官方原文是这样说的: ...

  2. python词云需要导入什么包_[python] 词云:wordcloud包的安装、使用、原理(源码分析)、中文词云生成、代码重写...

    词云,又称文字云.标签云,是对文本数据中出现频率较高的"关键词"在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客. ...

  3. Linux进程里运行新代码,linux调度器源码分析 - 新进程加入(三)

    中专门描述了copy_process()这个创建函数,而里面有一个函数专门用于进程调度的初始化,就是sched_fork(),其代码如下 int sched_fork(unsigned long cl ...

  4. 创建ROS工作空间,ROS功能包(Package)

    1.创建ROS工作空间 mkdir -p ros_ws/src cd ros_ws/src/ catkin_init_workspace ############################### ...

  5. ROS实现串口GPS数据的解析与通信(这篇文章所用的代码和我买的带有ROS功能包的GPS模块的功能包的代码一样)

    我发现这篇文章所用的代码和我买的带有ROS功能包的GPS模块的功能包的代码一样!!! https://gitee.com/maxibooksiyi/gps_driver 转载自:https://blo ...

  6. ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试

    ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试 gazebo仿真测试 gazebo仿真测试 启动gazebo并加载无人机模型 $ roslaun ...

  7. Ubuntu 16.04安装RealSense ROS功能包

    RealSense ROS安装 安装SDK 二进制安装 源码编译安装 安装ros包 测试 这个包支持D400 系列 SR300 和T265相机. 安装SDK 个人推荐源码编译安装,源码编译安装比较麻烦 ...

  8. DJI 无人机 Onboard SDK ROS 功能包demo运行

    DJI 无人机 Onboard SDK ROS 功能包demo运行 demo功能 准备测试环境 运行 dji sdk 节点 运行 demo 节点 自动飞行任务 航点自动飞行 兴趣点环绕自动飞行 飞行控 ...

  9. 相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法

    相机和livox激光雷达外参标定:ROS功能包---livox_camera_lidar_calibration 使用方法 livox_camera_lidar_calibration 功能包介绍 使 ...

最新文章

  1. mysql 5.7 mts_MySQL:MTS和mysqldump死锁
  2. Atitit 提升效率 界面gui方面的前后端分离与cbb体系建设 规范与推荐标准
  3. 【计算理论】自动机设计 ( 设计自动机 | 确定性自动机设计示例 | 确定性与非确定性 | 自动机中的不确定性 )
  4. 5.3 核函数-机器学习笔记-斯坦福吴恩达教授
  5. Scala学习:Curry化的函数
  6. html循环加载多个图片,两行代码实现图片碎片化加载
  7. JSON处理的Java API(JSR-353)–流API
  8. springboot项目如何不依赖spring-boot-parent
  9. mysql 深胡_数据存储之MySQL
  10. 【PHP面向对象(OOP)编程入门教程】10.__set(),__get(),__isset(),__unset()四个方法的应用...
  11. 注册表删除chrome插件
  12. 解决办法:java.lang.UnsatisfiedLinkError: org.opencv.core.Mat.n_eye(III)J
  13. Python 导入通讯录:将.csv文件转换为.vcf文件
  14. 程序员都在用的电脑小技巧,一遍就学会,每天早下班一小时
  15. 入选司法部案例库,效率源协助的这起网络游戏外挂案到底“优”在何处?
  16. 三星S3 939/9300 android 4.3 如何打开开发者模式
  17. 大一Web课程设计:企业网站——HTML+CSS+JavaScript电子购物商城(37页面)
  18. 一、学海无涯,再出发!【2020.02.14-25】
  19. 《PHASEN:A Phase and Harmonics-Aware Speech Enhancement Network》Pytorch代码学习
  20. Python版打字练习软件源代码,键盘练习软件源代码,含娱乐模式和训练模式

热门文章

  1. CentOS Linux 内核升级
  2. linux(centos7)内核升级
  3. python中PIL的安装参考教程
  4. 【算法基础四】C语言小项目实战---通讯录管理系统(单链表)
  5. scipy Matlab-style IIR 滤波器设计上(Butterworth\Chebyshev type I \Chebyshev type II )
  6. 博友的 编写高质量代码 改善java程序的151个建议
  7. 优盘安装红帽linux系统,从U盘安装 redhat linux 6.0及centos 6.4
  8. 【CSS特效扫盲】精选40种纯CSS特效应用实例,肝了10个晚上整理纯CSS特效(上)(附源码下载)
  9. ArcGIS 图层上点的编辑
  10. HoloCubic-稚晖君开源项目制作心得