侧边栏壁纸
  • 累计撰写 125 篇文章
  • 累计创建 16 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录
ROS   

ROS CmakeList

用于构建软件包的 CMake 构建系统的输入,描述了如何构建代码以及将代码安装到哪里。

结构顺序

CMakeLists.txt 文件必须遵循格式,否则包将无法正确构建。且配置顺序也非常重要。

CMakeLists.txtcmake_minimum_required Cmake版本project 包名find_package 查找其他的Cmake/Catkin包catkin_python_setup 启用 Python 模块支持add_message_files 消息生成器add_service_files 服务生成器add_action_files 动作生成器generate_messages 调用消息/服务/动作生成catkin_package 指定包构建信息导出add_library/add_executable/target_link_libraries 要构建的库/可执行文件install 安装规则

CMake 版本

catkin CMakeLists.txt 文件必须以所需的 CMake 版本开头,需要 2.8.3 或更高版本。

cmake_minimum_required(VERSION 2.8.3)

包名

在 CMake 中,可以后面在脚本中的任何位置引用项目名称,方法是在需要的地方使用变量 ${PROJECT_NAME}。

project(Test_ros)

查找依赖

使用 find_package 引入依赖包,先来看基础的 Module 模式

find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
             [REQUIRED] [[COMPONENTS] [components...]]
             [OPTIONAL_COMPONENTS components...])
  • PackageName:必填参数,需要查找的包名
  • version:可选参数,指定版本,如果指定就必须检查找到的包的版本是否和version兼容
  • EXACT:可选参数,如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以
  • QUIET:可选参数,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)
  • MODULE:可选字段,Module 模式下查找失败并不切换到 Config 模式继续查找
  • REQUIRED:可选字段。表示一定要找到包,找不到的话就立即停掉整个CMake
  • COMPONENTS:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败
  • OPTIONAL_COMPONENTS:可选字段,不一定找到,只要满足所有必需的组件,仍然可以认为整个包都找到了

当 Cmake 通过 find_package 找到了某个包,则会创建几个 Cmake 环境变量,环境变量描述了包导出的头文件在哪里源文件在哪里包依赖的库以及这些库的路径

  • <NAME>_FOUND 如果找到库,则设置为 true,否则设置为 false
  • <NAME>_INCLUDE_DIRS<NAME>_INCLUDES 包导出的包含路径
  • <NAME>_LIBRARIES<NAME>_LIBS 包导出的库
  • <NAME>_DEFINITIONS 包中含有的预处理指令

对于 ROS 自带的依赖建议添加为 catkin 包,因为可以使用 catkin_ 前缀创建统一环境变量

find_package(catkin REQUIRED COMPONENTS nodelet roscpp rospy sensor_msgs std_msgs std_srvs)

对于外部依赖,则直接为查找的包名。则会创建 OpenCV_INCLUDE_DIRS、OpenCV_LIBRARIES 等环境变量

find_package(OpenCV REQUIRED QUIET COMPONENTS core calib3d imgproc photo video OPTIONAL_COMPONENTS aruco xfeatures2d nonfree)

Python支持

catkin_python_setup()

消息/服务/动作生成器

加载自定义的 msg、svr、action,该指令必须出现在 catkin_package() 之前,以便生成正常工作。

## 加载在msg文件夹中的自定义msg
add_message_files(
   FILES
   Info.msg
   KeyPoint.msg
)

## 加载在svr文件夹中的自定义svr
 add_service_files(
   FILES
   GetMap.srv
   GetMap2.srv
 )
 
## 加载在action文件夹中的自定义action
add_action_files()
(
   FILES
   Myaction.action
 )

调用消息/服务/动作生成

generate_messages(
   DEPENDENCIES
   std_msgs
   geometry_msgs
   sensor_msgs
)

catkin 配置

指定包构建中的信息,用于 catkin 的构建、生成配置文件与 cmake 文件,必须在使用 add_library()add_executable() 之前调用此函数。

catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)
  • INCLUDE_DIRS 包导出头文件的位置
  • LIBRARIES 从项目中导出的库
  • CATKIN_DEPENDS 本项目依赖的其他 catkin 项目
  • DEPENDS - 此项目所依赖的非 catkin 项目

指定构建目标

构建目标可以采用多种形式,通常有以下两种可能性之一:

  • 可执行目标 - 我们可以运行的程序
  • 库目标 - 可执行目标在构建和/或运行时可以调用的库

头文件目录

指定在哪里可以找到正在构建的代码的头文件

include_directories(
  ${CMAKE_CURRENT_SOURCE_DIR}/include
  ${OpenCV_INCLUDE_DIRS}
  ${PCL_INCLUDE_DIRS}
  ${catkin_INCLUDE_DIRS}
)

链接目录

link_directories()函数可用于添加额外的库路径,但包在 find_packaged 时都会自动添加它们的链接信息,一般用不到

link_directories(~/my_libs)

可执行目标

构建一个名为myProgram的目标可执行文件,它由 3 个源文件构建:src/main.cpp、src/some_file.cpp 和 src/another_file.cpp。

add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

库目标

用于指定要构建的库。默认情况下,catkin 构建共享库

add_library(test_ros	
   test1.cpp
   test2.cpp
   test3.cpp
)

以上例子将输出:librtest_ros.so

链接库

指定可执行目标链接

add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo) -- 将 foo 链接到 libmoo.so

目标重命名

在 catkin 中构建目标的名称必须是唯一的,但是仅在** catkin 内部**。

set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")

这将在构建和安装输出中将目标 rviz_image_view 的名称重命名为 image_view 。

指定可安装目标

在构建时间之后,目标被放置到 catkin 工作空间开发空间中。但是,通常我们希望将目标安装到系统

install(TARGETS ${PROJECT_NAME}
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
)
  • TARGETS - 要安装的目标
  • ARCHIVE DESTINATION - 静态库和 DLL (Windows) .lib 存根
  • LIBRARY DESTINATION - 非 DLL 共享库和模块
  • RUNTIME DESTINATION - 可执行目标和 DLL (Windows) 风格的共享库

例如:

install(TARGETS 
	test_ros
   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

安装 Python 可执行脚本

catkin_install_python(PROGRAMS
  scripts/patrol.py
  scripts/objects_to_tags.py
  scripts/point_to_tf.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

安装头文件

install(DIRECTORY include/${PROJECT_NAME}/
   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
   FILES_MATCHING PATTERN "*.h"
   PATTERN ".svn" EXCLUDE
)

安装 nodelet 插件库

install(FILES
   nodelet_plugins.xml
   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
)
0

评论区