ROS cmake常见用法的记录

ROS学习之error解决记录 ROS的版本:Ubuntu20.04对应Noetic版本;Ubuntu18.04对应Melodic对应;Ubuntu16.04对应Kinetic对应 阅读详情

ROS cmake常见用法的记录

首先是最基本的语法,总体就像文本文件一样。不区分大小写,但是还是推荐指令要写大写,变量参数名推荐小写。变量可以通过${变量名}来索引变量的值。判断指令IF可以直接接变量名称,例如if(MVCC) ... endif()。

指令列表

  • find_package 寻找外部库,并记录这些库的路径

  • add_message_files、add_service_files指定自定义话题、服务数据类型文件位置

  • generate_messages指定自定义话题、服务数据类型依赖包

  • catkin_package 指定当前包的依赖、生成库等信息

  • include_directories 设置功能包依赖头文件的路径

  • add_library 生成库文件

  • set_target_properties 设置属性

  • target_link_libraries 链接依赖的库

  • add_dependencies 设置编译顺序

  • add_executable 设置可执行文件名称

  • target_link_libraries 设置可执行文件依赖库

  • catkin_install_python 设置python文件生成位置

find_package

find_package(<库的名字> [REQUIRED] [COMPONENTS <组件1> <组件2> ...])
# eg
find_package(catkin REQUIRED COMPONENTS
  moveit_core
  moveit_ros_planning_interface
  moveit_ros_planning
  geometric_shapes
  roscpp
  std_msgs
  moveit_msgs
  moveit_visual_tools
)

find_package是经常用到一个指令,作用就是去在硬盘里找到这些外部库,并把它们的路径记录下来,供后续编译使用。首先我们需要指定库的名称,例如OpenCV, PCL, Eigen3, 或者 catkin。REQUIRED: 这是一个可选参数,但通常都会加。意思是:“这个库是必须的,如果找不到,请直接报错停止编译,不要继续了。如果不加这个,CMake找不到库时只会警告,然后继续尝试编译。

COMPONENTS: 如果这个库很大(像 catkin 或 Boost),你可以指定只要其中的某几个部分。该指令会在系统路径进行扫描,去找(例如去找OpenCV则会找OpenCVConfig.cmake)配置文件,一旦找到会自动定义以下变量:

  • OpenCV_INCLUDE_DIRS: 告诉编译器头文件在哪里
  • OpenCV_LIBRARIES : 告诉链接器库文件在哪里。例如:/usr/lib/libopencv_core.so; /usr/lib/libopencv_highgui.so
  • OpenCV_FOUND: 一个布尔值(True/False),告诉你到底找没找到。

值得注意的是catkin,在ROS中他是命令行工具,可以创建文件夹、可以调用CMake、可以安排编译顺序。但同时他也是一个宏集合,提供ROS在CMakeList中的一些特殊操作,例如生成msg/srv等头文件(add_message_files、add_service_files、add_action_files)、生成.pc(pkg-config)文件供其他包查找、处理ROS特有的安装路径。

同时catkin可以作为一个代理中介,将各种库当成COMPONENTS,自动将COMPONENTS中的库自动查找,将COMPONENTS中的库的头文件路径加载到${catkin_INCLUDE_DIRS},库文件路径加到 ${catkin_LIBRARIES},减少我们重复的调用find_package。

msg、srv自定义数据配置

主要需要以下指令配置

  • find_package
  • add_message_files\add_service_files\action创建
  • generate_messages
  • catkin_package

对于CMakeList中的消息、服务、动作等自定义数据类型,需要以下内容进行设置:

  • 依赖项:自定义数据类型需要依赖那些包,例如在创建自定义数据类型中除了用到一些像int32这种基本数据类型外,还使用了一些例如Header等数据类型。这时候就要依赖于std_msgs、actionlib_msgs等依赖项。产生这些数据类型需要message_generation生成消息的包。所以在CMakelist中,需要在find_package中设置这些依赖项。package中也应该做一些修改:编译依赖<build_depend>例如message_generation、std_msgs等。运行依赖<exec_depend>例如message_runtime、std_msgs等。
  • 声明要创建的源文件,例如add_message_files、add_service_files
  • 生成消息对应的依赖,generate_messages列出所依赖的包
  • 导出依赖,catkin_package,告诉其他功能包当前包的配置文件
catkin_package(
  INCLUDE_DIRS include
  LIBRARIES my_robot_lib
  CATKIN_DEPENDS roscpp std_msgs message_runtime
  DEPENDS Boost
)

一个标准的catkin_package包含以上内容:

  • INCLUDE_DIRE:头文件放在哪里
  • LIBRARIES:生成了那些库文件
  • CATKIN_DEPENDS:依赖那些ROS包
  • DEPENDS:依赖的非ROS包(如 Boost, Eigen, OpenCV)

写一个标准的msg配置的CMakelist的配置文件,可以看到需要先在查找编译的包message_generation和依赖的包std_msgs,同时设置源文件,设置消息依赖的包。最后在catkin_package定义执行依赖的包(注意这里是message_runtime)。

# 需要加入 message_generation,必须有 std_msgs
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
  message_generation
)
## 配置 msg 源文件
add_message_files(
  FILES
  Person.msg
)
# 生成消息时依赖于 std_msgs
generate_messages(
  DEPENDENCIES
  std_msgs
)
#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listener
  CATKIN_DEPENDS roscpp rospy std_msgs message_runtime
#  DEPENDS system_lib
)

include_directories 头文件路径声明

include_directories 头文件的路径,主要有两种头文件:一种是自定义的头文件,用include表示在该功能包include文件夹下的头文件;另一种是所依赖的包的头文件,之前提到利用find_package找到所依赖功能包的头文件路径,这里直接使用find_package的查找结果,例如${catkin_INCLUDE_DIRS}。
同时include_directories也提供了一种特殊用法,引入SYSTEM忽略外部库得警告。

# 先包含当前包的头文件 (最高优先级)
include_directories(
  include
)

# 包含系统库和 ROS 库 (使用 SYSTEM 屏蔽外部库的警告)
include_directories(
  SYSTEM
  ${catkin_INCLUDE_DIRS}
  ${Boost_INCLUDE_DIRS}
  ${Eigen3_INCLUDE_DIRS}
)

add_library

将源代码编译成一个库文件(提供一些数据类型、方法的实现),在Linux下会生成一个共享对象文件 (Shared Object),后缀是 .so。值得注意的是系统会自动加上 lib 前缀和 .so 后缀。

add_library(moveit_lerp_planner_plugin
  src/lerp/lerp_planner_manager.cpp
  src/lerp/lerp_interface.cpp
  src/lerp/lerp_planning_context.cpp)

set_target_properties(moveit_lerp_planner_plugin PROPERTIES VERSION "${${PROJECT_NAME}_VERSION}")
target_link_libraries(moveit_lerp_planner_plugin ${catkin_LIBRARIES} ${Boost_LIBRARIES})

例如以上实例会将三个源文件,(在工作空间devel/lib下)打包成一个libmoveit_lerp_planner_plugin.so的共享库文件。而set_target_properties、target_link_libraries的作用分别是设置变量和设置依赖库路径。

set_target_properties设置了版本,利用一个双嵌套的结构获取功能包的版本号作为该库的版本
target_link_libraries则是利用find_package查找到的库路径

同时需要注意的是在caktin_package的LIBRARIES变量中设置该库名字,使得可以被其他包的程序调用。

add_dependencies

解决 ROS 编译中最常见、也最让人头疼的“并行竞争”问题。这个问题确实我也遇到过,例如前面所说的自定义msg\srv,当没有设置该命令的时候,自定义msg\srv会和调用它的源程序同时编译。因为自定义msg\srv还没有编译好,导致源文件编译报错(找不到头文件)。

因此该指令的作用就是指定编译的顺序,强制被依赖项的线程先进行,依赖项的的线程后进行。

add_dependencies(YOUR_TARGET_NAME 
  ${${PROJECT_NAME}_EXPORTED_TARGETS} 
  ${catkin_EXPORTED_TARGETS}
)
  1. YOUR_TARGET_NAME: 依赖于头文件的项目名称
  2. 后面的参数为等待的消息,主要分为两类。一类是当前包内生成的任务,使用的是${${PROJECT_NAME}_EXPORTED_TARGETS}还是一个双嵌套结构,先索引当前包的名称,在索引包里定义的所有 .msg、.srv、.action 以及 dynamic_reconfigure 文件对应的代码生成目标。另一类是外部包的内容,使用的是${catkin_EXPORTED_TARGETS},在find_package中Catkin 会自动收集这些包里“需要优先完成的任务”(通常是生成消息头文件),并把它们打包进这个变量里。

同时也会见一些比较旧的用法,例如${PROJECT_NAME}_generate_messages_cpp 指的是当前包下的.msg

add_executable、target_link_libraries 源文件编译和依赖

add_executable就是告诉编译器,请把指定目录下的源文件进行编译生成一个可执行文件,指定可执行文件的名称。
target_link_libraries为可执行文件链接到所依赖的库,可以用前面所提到的find_package所找到的库路径(例如${catkin_LIBRARIES})

eg:

add_executable(robot_model_and_robot_state_tutorial src/robot_model_and_robot_state_tutorial.cpp)
target_link_libraries(robot_model_and_robot_state_tutorial ${catkin_LIBRARIES} ${Boost_LIBRARIES})
add_executable(planning_scene_tutorial src/planning_scene_tutorial.cpp)
target_link_libraries(planning_scene_tutorial ${catkin_LIBRARIES} ${Boost_LIBRARIES})
add_executable(planning_scene_ros_api_tutorial src/planning_scene_ros_api_tutorial.cpp)

catkin_install_python Python文件配置

catkin_install_python(PROGRAMS
  scripts/talker_p.py
  scripts/listener_p.py
  DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

这个指令就是将指定的Python文件安装到指定路径,方便ROS指令运行。因此主要有两个参数:Python文件列表和安装路径。分别对应PROGRAMS和DESTINATION。默认使用路径都是${CATKIN_PACKAGE_BIN_DESTINATION} 通常对应系统路径 lib/你的包名/.

ROS中catkin_make install的用法 ROS中Catkin_Make install的用法 首先catkin_make install 的作用是:创建一个可以运行,但不含源码的工程包,以便于给客户等其他人使用,但同时不至于泄露源码的这么一个作用。参考这篇。 同时提一嘴,个人感觉,catkin_make install 和 cmake install 不是一个作用。关于cmake install 在这篇博客中说到:cmake install 是将 make 生成的文件安装到系统的对应目录中,比如从github上下载下来一个依赖库的安装包,解压后经 阅读详情

相关推荐

clion ros debug clion配置ros环境及调试

本文主要记录在clion配置ros的开发环境,以及调试ros程序 1. 下载并安装clion 到clion官网下载clion软件并自己注册账号登陆。 2. 创建ubuntu左侧快速启动图标 (add to favorites) 在clion的菜单栏中点击 Tools -> Create Desktop Entry , 然后再重新启动clion在左侧clion的图标点击右键选择 add to favorites 就可以创建左侧图标快速启动。 3. 安装ros插件 在clion软件的 File -

ABC_ORANGE的博客 5331

Unbuntu安装Ros后Cmake变成3.10

文章目录前言一、安装Ros二、检查Cmake版本三、解释四、解决方法总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、安装Ros 安装Ros的教程可以查阅博主的另一篇博客 非常详细清楚,帮你避开很多坑。Ros安装 二、检查Cmake版本 在终端输入cmake --version 查看版本:如果版本和安装Ros前一样则万事大吉..

向日葵骑士的博客 3797

【ros/ros2】ros1迁移到ros2的修改记录

ros1迁移到ros2,cmakelists.txt修改,package.xml修改,launch文件,代码修改

shuaixio的博客 4314

Ubuntu22.04及ROS2复现Fast_livo2,包含ROS2的安装、cmake的版本选择等等

网上对于ROS2复现Fast_livo2的教程很少,本人也是历尽挫折才成功,特此记录下复现过程以及一些关键细节。系统环境:Ubuntu22.04、ROS2 humble、cmake 3.27。

LPKPLPK的博客 7574

ROS Noetic下realsense2_camera编译踩坑实录:从CMake报错到完美解决

本文详细记录了在ROS Noetic环境下编译realsense2_camera功能包时遇到的典型CMake报错问题及其系统性解决方案。文章深入剖析了SDK寻址机制,提供了从源码编译librealsense2到配置环境变量的完整步骤,并针对realsense2Targets.cmake缺失等疑难杂症给出了深度修复方法,帮助开发者彻底解决编译障碍。

docker8compose的博客 695

ROS入门之CmakeList.txt详讲

本文为进来学习的总结,记录了学习CmakeList.txt文档的各个步骤,适合从零开始理解CmakeList.txt,可能存在错误之处,望批评指正。 0 Cmake的起源 为什么有CmakeList.txt文档,这就要从C++说起了。在完成C++的代码之后想要把程序运行起来就需要把C++转换成可执行文件,具体来说,编译分为以下四个步骤: (1)预处理;(2)编译;(3)汇编;(4)链接。 具体来讲,我们可以把前三部看成一个黑盒,调用相应的指令就可以帮助...

qq_42823342的博客 2445

运行ROS包时cmake报错及解决方法汇总(持续更新)

最近在跑一个ros代码,在编译时就碰到了很多cmake报错,于是这几天都在改cmake报错。本文对这次编译过程中碰到的所有cmake报错进行汇总,并提供了相应的解决方法。这篇文章会持续更新,后续碰到的报错也会不断纳入进来。

2301_79970562的博客 2万+

C#程序突然崩溃怎么办?5分钟学会分析Dump文件(Visual Studio 2022实战)

本文详细介绍了在C#程序崩溃或无响应时,如何捕获并分析Dump文件以快速定位问题。通过Visual Studio 2022实战演示,重点讲解了配置符号服务器、解读调用堆栈与内存状态,以及针对CPU飙高、内存泄漏等典型场景的分析方法,帮助开发者高效进行故障诊断。

docker8compose的博客 476

使用CLion调试ROS节点的正确方式/Clion如何调试ROS/调试ROS的方法

网上看了好多CLion调试ROS的教程,但是没一个能用的,自己摸索了好久才找到方法,所以记录了下来,原本这个是我记在Notion上的,但是感觉没人能看得到,所以搬运到优快云上。 👉原文见此处 调试步骤 从命令行终端启动clion 之所以要在命令行启动而不是从图标启动,是因为如果点击图标的话,在 .bashrc 或 .zshrc 中source的ROS环境无法生效,进而导致某些依赖库找不到 在打开项目中选择 <工作空间根目录的绝对路径>/src/CMakeLists.txt 以项目方式打

weixin_42699538的博客 4839

5.FxBlue跟单常见问题

fxblue喊单ea和fxblue跟单会在mt4/mt5客户端ea栏目里记录fxblue在跟单复制订单过程中的全面记录。在遇到问题时,我们首先要恢复默认参数尝试,然后再到ea栏找报错提示。 ​ 需要注意的是,是EA选项卡,而不是日志选项卡。 此外,您可以在 MT4/5 软件终端面板的"EA"选项卡中查看跟单记录,您可以通过右键单击 Experts 日志并从 MT4/5 的弹出菜单中选择“打开”来打开每日日志文件以及历史文件。 5.1 No “heartbeat” received 没有收到“心跳” 接收方

weixin_44406393的博客 1874

FileZilla Server目录显示失败的处理方法

这两天河南大暴雨挺严重导致多处停电,我远在郑州机房的服务器也断网连不上了。一直到今天下午才恢复,影响较大,有些客户要数据,可是数据因为断网拿不到。于是我想,要是能把服务器的数据备份到其他地方,比如我的本机或者另外一台电脑该多好。 于是今天一整天我都在找远程备份数据的方法,把一台服务器上的数据实时同步到另外一台上。或者两台服务器互相同步。 找了半天发现了FreeFileSync这个宝藏软件,它的原理很简单是通过ftp传输数据。 我得先在服务器上安装个ftp服务,首选filezilla server,安..

两天打鱼三天晒网 4453

CMake CPP和ROS笔记

cmake笔记

m0_47989004的博客 455

STM实战开发(13):STM32开发:使用光敏电阻检测光照强度

光敏电阻(LDR)是一种电阻值受光照强度影响的半导体材料。当光照强度增大时,光敏电阻的电阻值降低;而当光照强度减小时,电阻值则增大。光敏电阻的电阻变化与入射光的强度之间并不是线性关系,而是呈对数型的变化。LDR通常由硫化镉(CdS)或其他半导体材料构成,材料对不同波长的光有不同的响应特性。一般而言,光照强度越强,光敏电阻的电阻值越低,反之则越高。本文介绍了如何使用STM32与光敏电阻(LDR)结合,进行光照强度检测的实现方法。通过配置STM32的ADC模块,读取光敏电阻的电压信号,并根据电压计算光照强度。

2201_76125393的博客 3019

catkin_make编译过程中出现的问题: “/opt/ros/melodic/share/catkin/cmake/toplevel.cmake“.

ros学习资料

linadeede的博客 9323

基于Proximal Policy Optimization的无人机姿态控制系统的研究及Matlab实现

本文简要介绍了基于Proximal Policy Optimization算法的无人机姿态控制系统,并使用Matlab实现了一个简化版的代码。PPO算法的特点在于能够解决强化学习中的部分可观察性问题,同时还能保持策略网络更新的稳定性。本文将介绍基于Proximal Policy Optimization(PPO)算法的无人机姿态控制系统,并使用Matlab进行简化版实现。无人机姿态控制是指通过调整飞行器各部件的参数,使其保持特定角度、方向和位置的状态。本文将实现无人机的横滚姿态控制,并将其作为实现的示例。

m0_47037246的博客 716

适航文章汇总:知识体系全面梳理

无论您是行业新手还是经验丰富的专业人士,都可以通过本篇文章快速查找相关资料,提高对适航认证、机载系统、软件及硬件等领域的理解。本部分详细解析ARP 4754A、ARP 4761、DO-178C、DO-254等核心标准,并介绍其在机载系统开发中的应用。介绍FAA、EASA、CCAR等主要航空管理机构的适航规章体系,并说明各类飞行器(如固定翼、旋翼机、无人机等)的适航要求。本部分还探讨硬件设计、验证与确认过程中的挑战。从系统架构设计到机载设备的集成与管理,本部分介绍机载系统的研发体系及适航管理的最佳实践。

qq_41854911的博客 1454

ROS1代码向ROS2移植

由于ros2的种种优点,特别是通信和节点去中心化的优点,我们团队决定将我们的代码从ros1移植到ros2,我们选择的ros2版本为foxy,ubuntu环境为20.04,现在记录以下移植大概过程。

weixin_44001261的博客 8306

Allegro如何进行四层板板层设计

板层的设计

weixin_42499230的博客 3194

ROS 开发环境简介

ROS 开发环境简介首先考虑几个问题? 1. 做实验的时候,如果想要把图像数据和处理之后的图像的数据保存下来,怎么办?imwrite("xx",xx); 如果同时想记录传感器的数据,GPS的数据怎么办, ofstream fps("xx.txt") 如果想要同时记录他们的采集的时间呢? 如果想要从机器人上实时传输图像到PC上要查看,怎么办? socket(TCP/IP) Remote Deskt

何必浓墨重彩 8379

小梅哥Xilinx FPGA学习笔记11——亚稳态

亚稳态就是D触发器输入信号在其数据窗口期内发生变化,导致D触发器的输出进入一段时间的不稳定状态,有可能发生振荡,并最终随机稳定在高电平或者低电平。

m0_51430584的博客 631

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ROS1学习记录

个人学习记录,仅供参考,欢迎友好讨论!

2401_84390994的博客 1980

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ROS学习记录

1 ROS工具使用 1、运行ROS: roscore 2、数据play: rosbag play -l <name>.bag #改写rosbag文件名 3、显示bag包的详细信息: rosbag info <name>.bag 4、显示所有当前发布的topic: rostopic list -v 5、记录包(bag)数据 rosbag record -a rosba...

weixin_33566282的博客 2147

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

ROS报错记录

RLException: Invalid roslaunch XML syntax Resource not found Unable to launch The kinematics plugin (arm) failed to load Invalid roslaunch XML syntax ROSInitException: time is not initialized CMake Error // Invoking "make cmake_check_build_system" failed E

抗魔斗篷 8962

软件环境基础(ROS、CMake)

点对点设计(比如一个结点读取相机数据,传送给相应的处理程序。优点:可以分散实时计算的压力分布式设计(节点可以放在多个设备上面)多语言(官方支持C++、python)轻量级免费且开源社区完善1)消息一种publish/subscribe的方式传递2)节点可以在给定的主题中发布/订阅消息3)一个节点可以订阅/发布多个不同的主题4)允许多个节点订阅/发布同一个主题5)订阅节点和发布节点并不知道相互之间的存在。

BigDavid123的博客 388

pycharm安装ROS各种问题记录

问题小记录1.PyCharm调试Python工程1.1PyCharm里添加工程2.各种问题小记录2.1 命令cmak_make错误信息 1.PyCharm调试Python工程 新建catkin工作空间 mkdir -p ~/catkin_ws/src #建立源目录 cd ~/catkin_ws/src catkin_init_workspace #初始化空间 cd ~/catkin_ws/ catkin_make #首次编译 echo “

qq_34928047的博客 3149

ros2学习记录(创建节点)

depend>先者包名</depend>修改:后者package.xml。

2401_84390994的博客 1700
上一篇: c++ STL 之 string
searcon
博客等级 码龄5年 4粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值