[ROS官方教程] catkin/CMakeLists.txt的使用

2023-05-16

目录

  • 1 概述
  • 2 整体结构和顺序
  • 3 CMake版本
  • 4 功能包名称(package name)
  • 5 发现CMake Packages
    • 5.1 find_package()做了什么
    • 5.2 为何将catkin packages指定为Components
    • 5.3 Boost
  • 6 catkin_package()
  • 7 指定编译目标
  • 7.1 目标命名
    • 7.2 指定输出目录
    • 7.3 包含路径和库路径
    • 7.4 执行文件 executable
    • 7.5 库 library
    • 7.6 target_link_libraries
  • 8 Messages, Services, Actions
    • 8.1 约束
    • 8.2 例子
  • 9 Python模块支持
  • 10 单元测试

1 概述

CMakeLists.txt文件是CMake编译系统的输入,描述如何编译代码和安装。用于catkin项目的CMakeLists.txt在原始的CMakeLists.txt基础上添加了一点额外约束。

2 整体结构和顺序

CMakeLists.txt文件的格式和顺序十分重要,包括如下:

  1. CMake版本 (cmake_minimum_required())
  2. 功能包名称 (project())
  3. 发现编译需要的CMake/Catkin包 (find_package())
  4. Python模块支持 (catkin_python_setup())
  5. 添加Message/Service/Action (add_message_files(), add_service_files(), add_action_files())
  6. 生成Message/Service/Action (generate_messages())
  7. 功能包编译信息导出 (catkin_package())
  8. 库/可执行文件 (add_library() / add_executable() / target_link_libraries())
  9. 测试 (catkin_add_gtest())
  10. 安装 (install())

3 CMake版本

catkin需要2.8.3+

cmake_minimum_required(VERSION 2.8.3)

4 功能包名称(package name)

通过CMake project指定,

project(robot_brain)

在CMake中,可以通过${PROJECT_NAME}引用这个package name。

5 发现CMake Packages

使用find_package函数,发现编译该项目所依赖的CMake packages。至少有一个catkin依赖:

find_package(catkin REQUIRED)

如果该项目还依赖其他packages, 这些package会自动转变为catkin的components。如果直接指定这些packages作为components,而不是用find_package,会更为简单。比如,使用nodelet

find_package(catkin REQUIRED COMPONENTS nodelet)

注意:此处components只添加build dependencies, 而没有 runtime dependencies

也可以这样做,但是比较麻烦:

find_package(catkin REQURIED)
find_package(nodelet REQUIRED)

5.1 find_package()做了什么

当用find_package找到了一个package,会生成一些反映package信息的CMake环境变量,这些环境变量会在之后用到。这些环境变量描述了这些package的头文件、源文件位置,依赖库及其路径等。环境变量命名规则<PACKAGE_NAME>_<PROPERTY>

  • _FOUND : 发现library,则为true
  • _INCLUDE_DIRS or _INCLUDES : 包含目录
  • _LIBRARY_DIRS or _LIBRARIES: 库目录
  • _DEFINITIONS

5.2 为何将catkin packages指定为Components

Catkin package不是真正的Catkin components。而CMake的components特性被用于catkin的设计,从而节省了大量的打字时间。当find_package将catkin packages作为catkin的components时,会得到一个以catkin_为前缀的环境变量集合。比如,

find_package(catkin REQUIRED COMPONENTS nodelet)

nodelets导出的include paths, libraries等都会被添加到catkin_变量。catkin_INCLUDE_DIRS则不仅包含catkin的包含目录,还包含nodelet的包含目录。这在之后的使用中会非常方便。而直接find_package(nodelet) 会生成nodelet_INCLUDE_DIRS,nodelet_LIBRARIES等。

5.3 Boost

如果使用C++ / Boost, 需要调用find_package, 并指定使用Boost的哪些部分。比如,使用 Boost threads

find_package(Boost REQUIRED COMPONENTS thread)

6 catkin_package()

catkin_package是catkin提供的CMake macro,用来向编译系统指定catkin-specific的信息,编译系统会生成pkg-config和CMake文件。catkin_package需要在add_executable和add_library之前。该函数有五个optional arguments:

  • INCLUDE_DIRS : the exported include paths (i.e. cflags) for the package
  • LIBRARIES : The exported libraries from the project
  • CATKIN_DEPENDS : Other catkin projects that this project depends on
  • DEPENDS : Non-catkin CMake projects that this project depends on
  • CFG_EXTRAS : Additional configuration options

An example:

catkin_package(
	INCLUDE_DIRS include
	LIBRARIES ${PROJECT_NAME}
	CATKIN_DEPENDS roscpp nodelet
	DEPENDS eigen opencv
)

7 指定编译目标

包含executable target和library target。

7.1 目标命名

编译目标的名称需要是唯一的。重命名:

set_target_properties(rviz_image_view
									PROPERTIES OUTPUT_NAME image_view
									PREFIX "")								

7.2 指定输出目录

set_target_properties(python_module_library
	PROPERTIES LIBRARY_OUTPUT_DIRECTORY &{CATKIN_DEVEL_PREFIX}/{CATKIN_PACKAGE_PYTHON_DESTINATION})

7.3 包含路径和库路径

include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
link_directory(~/my_lib) # 不常用

7.4 执行文件 executable

add_executable(myProgram src/main.cpp)

7.5 库 library

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

7.6 target_link_libraries

target_link_libraries(<executableTargetName> , <lib1>, <lib2>)

example:

add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)  -- This links foo against libmoo.so

8 Messages, Services, Actions

在被ROS包编译使用前,message(.msg), service(.srv),actions(.action)需要一个预处理编译步骤,生成不同编程语言对应的文件。

# 添加
add_message_files
add_service_files()
add_action_files()
# 生成
generate_messages()
  • 这些macros需要在catkin_package()之前。
  • 在catkin_package()中添加CATKIN_DEPENDS依赖message_runtime
catkin_package(
...
CATKIN_DEPENDS message_runtime ...
...)

8.1 约束

  • 在find_package()中添加message_generation
  • package.xml中添加build dependency (message_generation),runtime dependency (message_runtime)
  • 如果该package依赖的package需要编译messages/services/actions,则需要添加一个显式的依赖catkin_EXPORTED_TARGETS
add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
  • 如果某个package编译了message和executable,且executable需要使用message,需要添加以下依赖:
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})

如果package满足以上两个条件,则
添加以上两个依赖

add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

8.2 例子

在/msg文件夹下有“MyMessage1.msg”和“MyMessage2.msg”,依赖std_msgs和sensor_msgs。/srv中包含“MyService.srv”。message_program使用这些message,does_not_use_local_message_program使用ROS一部分,但是不使用package中的message/service。CMakeLists.txt如下:

# Get the information about this package's buildtime dependencies
  find_package(catkin REQUIRED
    COMPONENTS message_generation std_msgs sensor_msgs)

  # Declare the message files to be built
  add_message_files(FILES
    MyMessage1.msg
    MyMessage2.msg
  )

  # Declare the service files to be built
  add_service_files(FILES
    MyService.srv
  )

  # Actually generate the language-specific message and service files
  generate_messages(DEPENDENCIES std_msgs sensor_msgs)

  # Declare that this catkin package's runtime dependencies
  catkin_package(
   CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
  )

  # define executable using MyMessage1 etc.
  add_executable(message_program src/main.cpp)
  add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

  # define executable not using any messages/services provided by this package
  add_executable(does_not_use_local_messages_program src/main.cpp)
  add_dependencies(does_not_use_local_messages_program ${catkin_EXPORTED_TARGETS})

9 Python模块支持

catkin_python_setup()

10 单元测试

Unit Test: catkin_add_gtest()

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

[ROS官方教程] catkin/CMakeLists.txt的使用 的相关文章

  • 阿木社区pixhawk二次开发无人机参数测量报告

    为了更好的给无人机建模 xff0c 更好的给无人机建立数学模型 xff0c 用于算法开发 xff0c 我们测量了数据如下 xff1a 1 无人机绕三轴转动惯量的测量 在此我们利用双线摆来测量三个转动惯量 xff0c 其示意图和原理如下 xf
  • 千寻高精度定位系统能在pixhawk系统上使用成功吗?

    如何在不使用基站的情况下 xff0c 得到精确的位置数据 xff1f 如何给在无人车的开发提供全国范围的厘米级精确定位数据 xff1f 如何在基于pixhawk上的无人车 xff0c 无人船 xff0c 无人机上解决以上问题 xff1f 为
  • 在ubuntu server上安装raspi-config并开启CSI摄像头

    我的树莓派安装了ubuntu server18 04 xff0c 由于不是树莓派官方系统raspian xff0c 因此不自带raspi config 启动摄像头需要用到官方的raspi config配置程序 xff0c 进入官网地址 xf
  • 【测试】QGC地面站开发课程完结篇--一站多机控制测试说明

    阿木实验室去年推出的QGC地面站开发实战课程 xff0c 随着地面站控制多架飞机的测试的成功 xff0c 课程全部完结 xff0c 以下是我们户外测试最终版地面站的测试视频 xff1a 视频地址 xff1a https v qq com x
  • sdf文件使用plugin

  • VGG16训练RAF-DB

    使用VGG16对本地数据集RAF DB中的basic图片进行训练 xff0c 官方已经在图片命名时分好了train与test xff0c train和test的label在同一个txt文件里 xff0c 方便起见 xff0c 把这两种lab
  • CMake编译opencv(测试)

    WORKIGN FOR THE WOLF 单编译OpenCV来测试项目 项目名称 span class token operator span 自定义 span class token function project span span
  • 从零开始学习SLAM:openCV

    继续跟随 视觉SLAM十四讲 学习SLAM问题 xff0c 由于理论方面已经有一些研究 xff0c 主要缺乏的是在LINUX下的实战开发能力 xff0c 因而从代码开始分析入手 xff0c 同时对C 43 43 11进行回顾 1 openC
  • 对博士学位说永别

    来自王垠 xff1a http blog sina com cn s blog 5d90e82f0101atzr html 经过深思熟虑之后 xff0c 我决定再次 抛弃 我的博士学位 这是我第三次决定离开博士学位 xff0c 也应该是最后
  • python web开发——Django基于类的视图

    简介 视图是一个可调用对象 xff0c 可以接收一个请求然后返回一个响应 这个可调用对象不仅仅限于函数 xff0c Django 同时提供一些可以用作视图的类 它们允许你结构化你的视图并且利用继承和混合重用代码 后面我们将介绍一些用于简单任
  • 使用docker安装ubuntu镜像

    使用docker安装ubuntu镜像 查找Ubuntu镜像 docker search ubuntu 安装Ubuntu镜像 docker pull ubuntu 查看docker镜像 docker images 运行docker镜像 doc
  • Ubuntu安装kalibr

    Ubuntu安装kalibr错误集锦 一 安装过程 ros参考 xff1a https blog csdn net Mua111 article details 107513509 kalibr安装参考 xff1a https blog c
  • 树莓派4b ubuntu系统开启串口

    树莓派4b安装ubuntu server18后如何开启串口 xff1f 树莓派4b的引脚图如下 xff1a 其中GPIO14和GPIO15是硬件串口 因为我安装的不是Raspian系统 xff0c 因此无法用raspi config打开该串
  • 惯性导航原理(1):导航坐标系及相互转换

    一 导航坐标系转换 坐标系介绍1 惯性坐标系 xff08 地心惯性坐标系 xff09 i系2 地球坐标系 xff08 地心地固坐标系 xff09 e系3 WGS 84坐标系 xff08 常用 xff09 blh坐标系4 当地水平地理坐标系g
  • win7系统下安装Ubuntu20.04.5系统保姆级教程

    一 制作u盘启动盘 准备工作 xff1a 一个空的8G大小的u盘 43 ultraISO软件 43 ubuntu系统的镜像文件 1 下载并安装ultraISO软件 下载地址 xff1a 百度网盘 请输入提取码 提取码 xff1a jv6a
  • 手把手带你免费打嘉立创pcb板

    手把手带你免费打嘉立创pcb板 前言一 熟悉规则二 下单1 下载安装下单助手2 领劵 注意 前言 嘉立创的新规则 xff1a 上个月消费没有满20的话只支持立创EDA画的板子 一 熟悉规则 嘉立创的免费规则和板子工艺要求如下 xff0c 大
  • ADRC学习与参数整定心得

    ADRC xff0c 中文名是自抗扰控制技术 继承了经典PID控制器的精华 xff0c 对被控对象的数学模型几乎没有任何要求 xff0c 又在其基础上引入了基于现代控制理论的状态观测器技术 xff0c 将抗干扰技术融入到了传统PID控制当中
  • ArUco相关

    ArUco相关 ArUco xff0c 一个开源的微型的现实增强库 https blog csdn net bashendixie5 article details 113769010 Aruco码估计相机位姿初步 xff01 xff01
  • ArUco

    文章目录 一 ArUco简介二 Marker和字典三 步骤1 创建Marker xff08 Marker Creation xff09 2 检测Marker xff08 Marker Detection xff09 3 姿态估计 xff08
  • Python PIP升级后执行命令报错: sys.stderr.write(f“ERROR: {exc}“)解决方法

    近日在使用pip时终端始终提示 You are using pip version 8 1 1 however version 21 0 1 is available You should consider upgrading via th

随机推荐

  • 戴尔Optiplex-7080装ubuntu16.04双系统时遇到的一些坑

    目录 ubuntu16 04安装过程中遇到的坑安装教程安装类型为空 xff08 读取不到磁盘 xff09 ubuntu16 04安装完成后无法启动windows ubuntu16 04无法连接无线网络 ubuntu16 04安装过程中遇到的
  • Ubuntu 16.04无法检测双屏/nvidia-smi显示no running processing found/nvidia-settings读取不到显卡信息

    问题 xff1a 1 笔记本ubuntu 16 04系统无法检测双屏 xff0c xrandr不显示hdmi接口或hdmi disconnectted 2 nvidia smi的最下方显示No running processes found
  • C++中的智能指针:shared_ptr

    本文主要参考 std shared ptr C 43 43 shared ptr共享型智能指针详解 std shared ptr 是一种智能指针 xff0c 它能够记录多少个 shared ptr 共同指向一个对象 xff0c 从而消除显式
  • pixhawk4 mini重启后死机

    pixhawk4 mini通过供电口供电 xff0c telement1口连接数传 xff0c usb口连接树莓派 xff08 机载计算机 xff09 此时如果用QGC地面站数传发送reboot指令 xff0c pixhawk4 mini关
  • C++利用auto对std::vector进行遍历时auto的类型

    先把结论摆在最前面 xff0c 当使用for auto amp node nodes 对std vector lt xxx gt nodes进行遍历时 xff0c auto定义的node其实是一个对nodes中对应元素的引用 具体的探究过程
  • 使用roslaunch为Gazebo加载自定义模型时黑屏、报错问题

    今天自己弄了一个dae类型的模型文件 xff0c 想要导入gazebo xff0c 按照gazebo world文件中导入dae模型的问题文章操作了一番 xff0c 编写如下 world文件 span class token operato
  • 点云地图导入gazebo思路

    参考这篇帖子下曹超大神的回答 xff0c 思路如下 xff1a 曹超CMU xff1a 如果不需要用地图渲染rgb图像的话 xff0c 我们通常的做法是把纯激光雷达点云地图导入CloudCompare进行downsample和计算每个点的n
  • Git删除历史commit记录中的大文件

    在使用Git的过程中 xff0c 常常会出现不小心commit了没用作用的大文件 xff0c 导致无法push到远程的情况 xff0c 并且即使删除了该文件重新commit xff0c 该文件也已经保存在历史commit中 xff0c 仍然
  • realsense d435 刷固件后连接失败问题

    刷固件后提示 Backend in rs2 create device info list 000001B00E9DF470 index 0 source gt QueryInterface uuidof IKsTopologyInfo r
  • 用Stm32CubeMX在STM32F107上移植LWIP(PHY:DM9161A)

    背景 有一块吃灰7年的神州IV号开发板 xff0c 主控芯片STM32F107VCT6 xff0c PHY芯片DM9161A xff0c 配套的资料都是当年ST的标准库 这个开发板应该是因为当年上市太匆忙 xff0c 资料和代码的细节部分做
  • ROS_Python编程 之 案例代码核心解析(第一版)

    ROS Python编程 之 案例代码核心解析 xff08 第一版 xff09 通过Handsfree mini机器人平台配套的中级教程 xff0c 我对ros python编程实现 传感器数据读取 运动控制 的知识做以下归纳 xff1a
  • 一个结束,又是一个开始

    随着大一期终考试的结束 xff0c 我的C语言学习之旅算是暂告一段落 xff0c 盘点下来我最多就只是学习了一些最皮毛的语法之类的东西 xff01 我同时从各种渠道了解到C语言的特殊地位 是许多计算机语言的根本 xff0c 我也体会到其中的
  • 如何使用 Ubuntu 配置可视化桌面环境?

    https developer aliyun com article 727585 如何使用 Ubuntu 配置可视化桌面环境 xff1f 迪科斯彻 2019 11 20 1340浏览量 简介 xff1a Ubuntu 是一个世界领先的开源
  • 如何将电脑的代理网络以WIFI热点的方式共享

    文章目录 写在前面如何设置PC端连接代理设置共享1 打开win10自带的 移动热点 2 选择 更改适配器选项 3 连接代理4 右键连接 xff0c 打开属性页面 5 重新连接代理 xff0c 重启移动热点注意共享给有线网络 测试 由于各地甲
  • mavros坐标系转换与方向

    2021 05 04更新 xff1a 本文中提到的kinetic版本的mavros中body系的坐标系问题已经被修复为FLU坐标系 xff0c 只需要更新kinetic版本的mavros即可 xff01 sudo apt install r
  • qsort快速排序用法--完整版(解释了cmp)【转】

    原文地址 xff1a http hi baidu com xuhanqiu item 99505e41aeef4eae61d7b916 用qsort快两年的时候了 却一直没有真正弄懂cmp函数的返回值1 1 0的函数 今天在做凸包时 郁闷了
  • 通过 docker 镜像 vcs 进行仿真

    学习空白的贝塔 摸鱼范式公众号 安装docker 并拉取镜像 远程 进行 vcs 与 verdi 的联合仿真 我踩得的坑一一列举 1 直接按照教程安装docker wsl 但是出现问题 安装失败 首先我的账户是中文名字 可能直接导致我安装失
  • FreeRTOS卡在SVC_Handler

    FreeRTOS已经实现了SVC Handler 和PendSV Handler 两个函数的功能 xff0c 对应port c中的vPortSVCHandler 和xPortPendSVHandler 为了使用FreeRTOS的这两个函数
  • 【Git】实现Gitee和Github仓库的同步操作

    本篇博客的设置方法同样可以适用于gitlab等其他平台 不多bb xff0c 直入主题 实现两个仓库的同步 1 准备两个仓库 分别在两个平台创建一个相同名字的仓库 xff0c 当然 xff0c 你也可以在a平台上导入b平台已有的仓库 xff
  • [ROS官方教程] catkin/CMakeLists.txt的使用

    目录 1 概述2 整体结构和顺序3 CMake版本4 功能包名称 package name 5 发现CMake Packages5 1 find package 做了什么5 2 为何将catkin packages指定为Components