ROS下CmakeLists.txt模板

本文详细介绍了CMakeLists.txt文件的结构和用途,特别是在ROS项目中的应用。主要内容包括设置CMake最小版本、项目信息、依赖包管理、目标构建以及消息、服务和动作的生成。通过实例解析了如何配置可执行文件和库文件,以及如何处理依赖关系。同时强调了使用find_package、catkin_package和target_link_libraries等关键指令的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CmakeLists.txt模板

#Catkin需要3.0.2或更高版本的camke
cmake_minimum_required(VERSION 3.0.2)

#以包名作为cmake的项目工程名
project(robot_brain)

#添加构建项目时所用的依赖包,ROS项目中catkin是必须的
#注意:这里添加的依赖是用于构建项目的,而不是项目构建完成后运行时的依赖
find_package(catkin REQUIRED)
#如果使用了COMPONENTS(如下所示),则意味着将将后面的包以catkin组件的形式使用
find_package(catkin REQUIRED COMPONENTS nodelet)
#也可以这样写
find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)
#还是建议以组件形式使用,这是因为如果 CMake 通过 find_package 找到一个包,
#就会创建该包的CMake 环境变量,提供有关找到的包的信息。
# 环境变量描述了包导出头文件的位置、源文件的位置、包依赖的库以及这些库的路径,
#通常以 <PACKAGE NAME>_<PROPERTY>的形式命名,具体包括:
		#<NAME>_FOUND - 若库被找到则为true
		#<NAME>_INCLUDE_DIRS or <NAME>_INCLUDES - 包所用到的头文件的路径
		#<NAME>_LIBRARIES or <NAME>_LIBS - 包所依赖的库
		#<NAME>_DEFINITIONS - ?
#每找到一个包都会有各自对应的环境变量,
#而如果以组件形式使用,则作为组件的包的信息都会放到前面的包的环境变量里,不单独生成,
#如nodelet的相关信息都在catkin_<PROPERTY>中。
#如果使用C++和Boost,则需要用find_package()来找Boost库,
#并指定Boost中的组件。如果想使用Boost线程,就可以写成:
find_package(Boost REQUIRED COMPONENTS thread)

#为包生成cmake配置文件用,包含四项
catkin_package(
   INCLUDE_DIRS include			#项目中头文件的路径
   LIBRARIES ${PROJECT_NAME}	#项目所创建的库
   CATKIN_DEPENDS roscpp nodelet#项目所依赖的其他catkin项目(构建/运行这个包需要存在的包)
   DEPENDS eigen opencv)		#项目所依赖的非catkin cmake项目(构建/运行这个包需要存在的系统依赖项)

#指定构建目标,主要有两种可构建目标形式:
#可执行文件(可运行的程序)、库文件(可供其他可执行文件在构建或运行期间使用的库)
#修改目标名称,如下将在构建和安装输出中将目标 rviz_image_view 的名称更改为 image_view。
set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")
#自定义目标输出目录,如下将目标放到bin文件夹下
set_target_properties(python_module_library
  PROPERTIES LIBRARY_OUTPUT_DIRECTORY bin)
#在生成目标之前,要先写好包含路径和库路径,不然编译链接会失败
#include_directories 的参数应该是由 find_package 调用生成的 *_INCLUDE_DIRS 变量
#以及需要包含的任何其他目录。
# 如果您使用 catkin 和 Boost,则您的 include_directories() 调用应如下所示:
include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
#CMake link_directories() 函数可用于添加额外的库路径,但不建议这样做。 
#所有 catkin 和 CMake 包在 find_packaged 时都会自动添加链接信息。 
#只需链接到 target_link_libraries() 中的库
link_directories(~/my_libs)

#编译链接生成可执行文件
add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)
#编译链接生成库文件
add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

#使用 target_link_libraries() 函数指定可执行目标需要链接到哪些库。 
#这通常在 add_executable() 调用之后完成。 例如:
add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)
#使用ros的话,一定要链接这个库
target_link_libraries(${PROJECT_NAME}
  ${catkin_LIBRARIES}
)

#使用自定义的messages、services或者actions
#注意:1.需要在find_package中添加包message_generation
#     2.这几个项必须放在catkin_package之前
#	  3.需要在catkin_package中添加依赖message_runtime
find_package(catkin REQUIRED COMPONENTS message_generation)
add_message_files(...)
add_service_files(...)
add_action_files(...)
generate_messages(...)
catkin_package(
 ...
 CATKIN_DEPENDS message_runtime ...
 ...)
#此外,需要在package.xml中添加构建依赖和运行依赖(如果这俩依赖能从别的包传递过来,则可不用添加)
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
#如果所构建的目标依赖于需要构建messages/services/actions的其他目标,
#则需要添加显式依赖关系以便它们能以正确的次序构建,
#如下some_target为add_executable()中所设定的构建目标名称
add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
#如果有一个构建messages and/or services并且使用它们的包,
#则也需要添加显式依赖关系以便能够先构建messages它们,再构建包的其他块
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
#如果所构建的包同时满足上述两个条件,则需要添加两个依赖项,即:
add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

#例子
#如果在包中的msg目录下包含两个名为“MyMessage1.msg”和“MyMessage2.msg”的自定义消息,
#并且这些消息依赖于std_msgs 和 sensor_msgs;
#srv目录下包含一个名为“MyService.srv”的自定义服务;
#想要构建一个使用这些消息和服务的可执行文件message_program,
#和一个不使用这些消息和服务的可执行文件dos_not_use_local_messages_program,
#则需要在 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})
#------

内容概要:本书《Deep Reinforcement Learning with Guaranteed Performance》探讨了基于李雅普诺夫方法的深度强化学习及其在非线性系统最优控制中的应用。书中提出了一种近似最优自适应控制方法,结合泰勒展开、神经网络、估计器设计及滑模控制思想,解决了不同场景下的跟踪控制问题。该方法不仅保证了性能指标的渐近收敛,还确保了跟踪误差的渐近收敛至零。此外,书中还涉及了执行器饱和、冗余解析等问题,并提出了新的冗余解析方法,验证了所提方法的有效性和优越性。 适合人群:研究生及以上学历的研究人员,特别是从事自适应/最优控制、机器人学和动态神经网络领域的学术界和工业界研究人员。 使用场景及目标:①研究非线性系统的最优控制问题,特别是在存在输入约束和系统动力学的情况下;②解决带有参数不确定性的线性和非线性系统的跟踪控制问题;③探索基于李雅普诺夫方法的深度强化学习在非线性系统控制中的应用;④设计和验证针对冗余机械臂的新型冗余解析方法。 其他说明:本书分为七章,每章内容相对独立,便于读者理解。书中不仅提供了理论分析,还通过实际应用(如欠驱动船舶、冗余机械臂)验证了所提方法的有效性。此外,作者鼓励读者通过仿真和实验进一步验证书中提出的理论和技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值