ROS学习(五):构建系统

2023-05-16

     ROS的构建系统默认使用CMake(Cross Platform Make),其构建环境在功能 包目录中的CMakeLists.txt文件中描述。在ROS中,CMake被修改为适合于ROS的 “catkin” 构建系统。

     在ROS中使用CMake的是为了在多个平台上构建 ROS功能包。因为不同于只支持 Unix系列的Make,CMake支持Unix类的Linux、BSD和OS X以外,还支持Windows 系列。并且,它还支持Microsoft Visual Studio,也还可以轻松应用于Qt开发。此外, catkin 构建系统可以轻松使用与ROS相关的构建、功能包管理和功能包之间的依赖关系。

一.创建功能包

     创建ROS功能包的命令如下。

“catkin_create_pkg”命令在创建用户功能包时会生成catkin 构建系统所需的 CMakeLists.txt和package.xml文件的包目录。让我们来创建一个简单的功能包,以巩 固理解。首先打开一个新的终端窗口(Ctrl + Alt + t)并运行以下命令移至工作目录。 

 

 

要创建的功能包名称是“my_first_ros_pkg”。ROS中的功能包名称全部是小写字 母,不能包含空格。格式规则是将每个单词用下划线(_)而不是短划线( - )连接起 来。有关ROS编程,请参阅相关页面的编码风格47 48和命名约定。那么下面使用以下命令 创建一个名为my_first_ros_pkg的功能包:

     上面用“std_msgs”和“roscpp”作为前面命令格式中的依赖功能包的选项。这 意味着为了使用ROS的标准消息包std_msgs和客户端库roscpp(为了在ROS中使用C/ C++),在创建功能包之前先进行这些选项安装。这些相关的功能包的设置可以在创建功 能包时指定,但是用户也可以在创建之后直接在package.xml中输入。

     如果已经创建了功能包,“~/catkin_ws/src”会创建“my_first_ros_pkg”功能 包目录、ROS功能包应有的内部目录以及CMakeLists.txt和package.xml文件。用户 可以用下面的“ls”命令来检查内容,并使用类似Windows资源管理器的基于GUI的 Nautilus来检查功能包的内部。

 

 

 二.修改功能包配置文件(package.xml)

     必要的ROS配置文件之一的package.xml是一个包含功能包信息的XML文件,包括 功能包名称、作者、许可证和依赖功能包。最初没有做任何修改的原始文件如下:

 

 下面是对每个语句的说明。

 

 

修改了功能包配置文件(package.xml),如下所示。也可以根据自己的 环境进行修改。如果还不熟悉,可以键入以下内容:

 三.修改构建配置文件(CMakeLists.txt)

ROS的构建系统catkin基本上使用CMake,并在功能包目录中的CMakeLists.txt 文件中描述构建环境。在这个文件中设置可执行文件的创建、依赖包优先构建、连接器 (linker)的创建等等。

 

 

 

 

  构建配置文件(CMakeLists.txt)中的每一项如下所示。第一条是操作系统中安 装的cmake的最低版本。由于它目前被指定为版本2.8.3,所以如果使用低于此版本的 cmake,则必须更新版本。

cmake_minimum_required(VERSION 2.8.3)

project项是功能包的名称。只需使用用户在package.xml中输入的功能包名即可。 请注意,如果功能包名称与package.xml中的<name>标记中描述的功能包名称不同,则 在构建时会发生错误,因此需要注意。

project(my_first_ros_pkg)

find_package项是进行构建所需的组件包。目前,roscpp和std_msgs被添加为依赖 包。如果此处没有输入功能包名称,则在构建时会向用户报错。换句话说,这是让用户先 创建依赖包的选项。

find_package(catkin REQUIRED COMPONENTS 

          roscpp 

          std_msgs

)

    以下是使用ROS以外的功能包时使用的方法。例如,使用Boost时,必须安装system 功能包。功能如前面的说明,是让用户先创建依赖功能包的选项。

find_package(Boost REQUIRED COMPONENTS system)

    catkin_python_setup( )选项是在使用Python,也就是使用rospy时的配置选项。其 功能是调用Python安装过程setup.py。 catkin_python_setup()

    add_message_files是添加消息文件的选项。FILES将引用当前功能包目录的msg目 录中的*.msg文件,自动生成一个头文件(*.h)。在这个例子中,我们将使用消息文件 Message1.msg和Message2.msg。

add_message_files(

FILES

Message1.msg

Message2.msg

)

add_service_files是添加要使用的服务文件的选项。使用FILES会引用功能包目录 中的srv目录中的*.srv文件。在这个例子中,用户可以选择使用服务文件Service1.srv和 Service2.srv。

add_service_files(

FILES

Service1.srv

Service2.srv )

    generate_messages是设置依赖的消息的选项。此示例是将DEPENDENCIES选项设 置为使用std_msgs消息包。

generate_messages( 

DEPENDENCIES 

std_msgs

)

generate_dynamic_reconfigure_options是使用dynamic_reconfigure时加载要 引用的配置文件的设置。

generate_dynamic_reconfigure_options( 

cfg/DynReconf1.cfg 

cfg/DynReconf2.cfg

)

    以下是catkin 构建选项。INCLUDE_DIRS表示将使用INCLUDE_DIRS后面的内部 目录include的头文件。LIBRARIES表示将使用随后而来的功能包的库。

   CATKIN_DEPENDS后面指定如roscpp或std_msgs等依赖包。目前的设置是表示依 赖于roscpp和std_msgs。DEPENDS是一个描述系统依赖包的设置。

catkin_package(

INCLUDE_DIRS include

LIBRARIES my_first_ros_pkg

CATKIN_DEPENDS roscpp std_msgs

DEPENDS system_lib

)

    include_directories是可以指定包含目录的选项。目前设定为${catkin_INCLUDE_ DIRS},这意味着将引用每个功能包中的include目录中的头文件。当用户想指定一个额 外的include目录时,写在${catkin_INCLUDE_DIRS}的下一行即可。

include_directories( 

${catkin_INCLUDE_DIRS}

)

    add_library声明构建之后需要创建的库。以下是引用位于my_first_ros_pkg功能包 的src目录中的my_first_ros_pkg.cpp文件来创建my_first_ros_pkg库的命令。

add_library(my_first_ros_pkg 

     src/${PROJECT_NAME}/my_first_ros_pkg.cpp )

    add_dependencies是在构建该库和可执行文件之前,如果有需要预先生成的有依赖 性的消息或dynamic_reconfigure,则要先执行。以下内容是优先生成my_first_ros_ pkg库依赖的消息及dynamic reconfigure的设置。

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

     add_executable是对于构建之后要创建的可执行文件的选项。以下内容是引用src/ my_first_ros_pkg_node.cpp文件生成my_first_ros_pkg_node可执行文件。如果有多 个要引用的*.cpp文件,将其写入my_first_ros_pkg_node.cpp之后。如果要创建两个以 上的可执行文件,需追加add_executable项目。

add_executable(my_first_ros_pkg_node src/my_first_ros_pkg_node.cpp)

    如前面描述的add_dependencies一样,add_dependencies是一个首选项,是在构 建库和可执行文件之前创建依赖消息和dynamic reconfigure的设置。下面介绍名为my_ first_ros_pkg_node的可执行文件的依赖关系,而不是上面提到的库。在建立可执行文 件之前,先创建消息文件的情况下会经常用到。

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

    target_link_libraries是在创建特定的可执行文件之前将库和可执行文件进行链接的 选项。

target_link_libraries(my_first_ros_pkg_node

    ${catkin_LIBRARIES}

)

    此外,还提供了创建官方发行版ROS功能包时使用的Install项目和用于单元测试的 Testing项目。 笔者如下修改了构建配置文件(CMakeLists.txt)。可以根据情况进行修 改。有关如何使用它的更多信息,请参阅https://github.com/ROBOTIS-GIT上发布的 TurtleBot3和OP3功能包,相信会对大家有用。
 

 四.编写源代码

    在上述CMakelists.txt文件的可执行文件创建部分(add_executable)中,进行了以 下设置。

 add_executable(hello_world_node src/hello_world_node.cpp)

 换句话说,是引用功能包的src目录中的hello_world_node.cpp源代码来生成hello_ world_node可执行文件。由于这里没有hello_world_node.cpp源代码,我们来写一个 简单的例子。

首先,用cd命令转到功能包目录中包含源代码的目录(src),并创建hello_world_ node.cpp文件。这个例子使用gedit编辑器,但是您可以使用自己的编辑器,比如vi、 gedit、qtcreator、vim或者emacs。

$ cd ~/catkin_ws/src/my_first_ros_pkg/src/

$ gedit hello_world_node.cpp

之后如下修改代码。

 五.构建功能包

    所有构建功能包的准备工作都已完成。在构建之前,使用以下命令更新ROS功能包的 配置文件。这是一个将之前创建的功能包反映在ROS功能包列表的命令,这并不是必选操 作,但在创建新功能包后更新的话使用时会比较方便。

$ rospack profile

下面是catkin构建。移动到catkin工作目录后进行catkin构建。

$ cd ~/catkin_ws && catkin_make

 六.运行节点

    如果构建无误,那么将在“~/catkin_ws/devel/lib/my_first_ros_pkg”中生成 “hello_world_node”文件。

    下一步是运行该节点,打开一个终端窗口(Ctrl + Alt + t)并在运行该节点之前先运 行roscore。请注意,运行roscore后,ROS中的所有节点都可用,除非退出了roscore, 否则只需运行一次。

$ roscore

    最后,打开一个新的终端窗口(Ctrl + Alt + t)并使用以下命令运行节点。这是在名 为my_first_ros_pkg的功能包中运行名为hello_world_node的节点的命令。

$ rosrun my_first_ros_pkg hello_world_node

   运行这个节点的时候,可以在终端窗口中看到以hello world!0,1,2,3 ... 作为 字符串发送的消息。这不是一个实际的消息传递,但可以看作是讨论的构建系统的结 果。由于旨在说明ROS的构建系统,因此对于消息和节点的源代码将在后面的博客中 将更详细地讨论。

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

ROS学习(五):构建系统 的相关文章

随机推荐

  • Protobuf生成Go代码指南

    这个教程中将会描述protocol buffer编译器通过给定的 proto会编译生成什么Go代码 教程针对的是proto3版本的protobuf 在阅读之前确保你已经阅读过Protobuf语言指南 编译器调用 Protobuf核心的工具集
  • ROS sensor_msgs/LaserScan Message简单说明

    std msgs Header header float32 angle min 开始扫描角度 float32 angle max 结束扫描角度 float32 angle increment 每次扫描增加的角度 xff08 角度分辨率 x
  • 双系统Ubuntu分区

    假设整个空闲空间有200G xff0c 主要分4个区 xff1a 1 给系统分区EFI xff1a 在唯一的一个空闲分区上添加 xff0c 大小200M xff0c 逻辑分区 xff0c 空间起始位置 xff0c 用于efi xff1b 这
  • 2 用D435i运行VINS-fusion

    文章目录 1 VINS fusion的安装1 1 环境和依赖的安装1 2 编译VINS Fusion1 3 编译错误解决方法 2 VINS Fusion跑数据集3 用相机运行VINS Fusion 环境 xff1a Ubuntu20 04
  • Python每日一个小程序

    前几天上网 xff0c 收集了20多道Python练习题 这些练习题还是很有价值的 xff0c 正好最近忙着复习准备校招 xff0c 可以用来练手 我会把每道题都写一篇博客详细阐述解题思路和源代码 xff0c 在每道题目后面附上博客地址 希
  • 数分下(第1讲):一阶微分方程的三类模型求解

    第1 1讲 xff1a 一阶微分方程的解法 第一周第一讲将用3个小时时间 xff0c 完整讲解一阶微分方程y 61 f x y 的三种典型模型求解方法 掌握以下知识点 xff0c 并熟练做题训练 对应同济高数教材第七章1 4节 知识点脑图如
  • 非常详细的 Linux C/C++ 学习路线总结!助我拿下腾讯offer

    点击关注上方 五分钟学算法 xff0c 设为 置顶或星标 xff0c 第一时间送达干货 转自后端技术学堂 正文 我的另一篇文章 腾讯 C 43 43 后台开发面试笔试知识点参考笔记 整理了 C 43 43 后台开发知识点 xff0c 本文尝
  • 一线互联网公司程序员技术面试的流程以及注意事项

    先来了解面试的流程是什么 xff0c 然后再一一做准备 xff01 企业一般通过几轮技术面试来考察大家的各项能力 xff0c 一般流程如下 xff1a 一面机试 xff1a 一般会考选择题和编程题 二面基础算法面 xff1a 就是基础的算法
  • 为什么C++永不过时?

    Linus曾说过 xff1a C 43 43 是一门很恐怖的语言 xff0c 而比它更恐怖的是很多不合格的程序员在使用着它 xff01 这足以说明C 43 43 有多难 xff01 不过 xff0c 你也要明白 难度越高意味着含金量与竞争力
  • STM32 USB学习笔记6

    主机环境 xff1a Windows 7 SP1 开发环境 xff1a MDK5 14 目标板 xff1a STM32F103C8T6 开发库 xff1a STM32F1Cube库和STM32 USB Device Library 现在来分
  • Invalid bound statement (not found)

    目录 一 遇到的问题 二 分析思路 1 映射文件 2 测试类 三 解决方案 一 遇到的问题 前几日 xff0c 有个工作不久的同事找我帮他解决一个 Mybatis 的问题 他写了一个增删改查 xff0c 但是在启动程序的时候报错 xff1a
  • ThinkPHP6 解决小程序调用接口返回错误是网页的尴尬

    背景 早在开始了解ThinkPHP时就一直记得一段话 xff1a 在一开始无知的我以为出现错误后能在调试阶段优雅的了解错误信息 xff0c 但结果大家试一下便知道 xff0c 十分尴尬 尤其是当在小程序里请求api xff0c 在过程中发生
  • 大数据技术Canal总结和详细案例

    0 Canal介绍 Canal 是用 Java 开发的基于数据库增量日志解析 xff0c 提供增量数据订阅 amp 消费的中间件 目前Canal 主要支持了 MySQL 的 Binlog 解析 xff0c 解析完成后才利用 Canal Cl
  • T507 Ubuntu18.04 LXDE桌面汉化

    本文硬件平台采用飞凌T507开发板 xff0c 主要讲解Ubuntu图形桌面LXDE如何修改为中文界面 xff0c 本文使用的思路和方法仅供参考使用 xff0c 其它arm开发板虽然芯片不同 xff0c 但思路和方法有很多的共性 xff0c
  • 工作站和台式机的区别

    转自 xff1a 微点阅读 xff08 www weidianyuedu com xff09 微点阅读 范文大全 免费学习网站 工作站电脑非常高配 xff0c 那么它和台式机有什么区别呢 下面由小编给你做出详细的工作站和台式机区别介绍 希望
  • 分布式锁-简单入门

    状态不是很好 xff0c 记一下以前学过的分布式锁吧 样例简介 不谈大概念 xff0c 就是简单入门以及使用 为什么要用分布式锁呢 xff1f 假设我需要一个定时操作 xff0c 每天在某个点 xff0c 我要处理一批数据 xff0c 要先
  • 深度神经网络的成功应用,深度神经网络发展历程

    深度学习与神经网络有什么区别 深度学习与神经网络关系2017 01 10最近开始学习深度学习 xff0c 基本上都是zouxy09博主的文章 xff0c 写的蛮好 xff0c 很全面 xff0c 也会根据自己的思路 xff0c 做下删减 x
  • Ubuntu22.04启用root账户 2208120941

    Ubuntu22 04启用root账户 2208120941 Ubuntu是有root账户的 只是没有密码 所以无法切换 所以启用的方法是 管理员账户用 sudo passwd root 给 root 设置密码 span class tok
  • WARNING: CLOCK SKEW DETECTED. YOUR BUILD MAY BE INCOMPLETE

    make时遇到这个问题几次了 xff0c 就记录一下吧 WARNING CLOCK SKEW DETECTED YOUR BUILD MAY BE INCOMPLETE 警告 xff1a 检测到时钟偏移 您的构建可能不完整 xff08 来自
  • ROS学习(五):构建系统

    ROS的构建系统默认使用CMake xff08 Cross Platform Make xff09 xff0c 其构建环境在功能 包目录中的CMakeLists txt文件中描述 在ROS中 xff0c CMake被修改为适合于ROS的 c