【无人水面艇路径跟随控制3】(C++)USV代码阅读: ROS包的构建和管理:包的依赖关系、包含目录、库文件以及链接库

news2024/10/7 0:14:29

【无人水面艇路径跟随控制3】(C++)USV代码阅读: ROS包的构建和管理:包的依赖关系、包含目录、库文件以及链接库

  • 写在最前面
  • ROS是什么
  • CMakeLists.txt
    • 总结
    • 详细解释
      • CMake最低版本和项目名称
      • 编译选项
      • 查找catkin包
      • catkin包配置
      • 包含目录
      • 添加库
      • 链接库
  • package.xml
    • 总结
    • 详细解释
      • XML声明
      • 包格式和基本信息
      • 维护者信息
      • 许可证信息
      • 可选的URL标签
      • 可选的作者标签
      • 依赖关系


请添加图片描述

🌈你好呀!我是 是Yu欸
🌌 2024每日百字篆刻时光,感谢你的陪伴与支持 ~
🚀 欢迎一起踏上探险之旅,挖掘无限可能,共同成长!

写在最前面

阅读代码:https://github.com/USE-jx/USV_path_follow/tree/main

usv path follow:无人水面艇路径跟随
trajectory tracking:轨迹跟踪

请添加图片描述

ROS是什么

ROS(机器人操作系统,Robot Operating System)是一个用于机器人软件开发的开源框架。它提供了一系列工具、库和约定,简化了复杂机器人应用的创建。以下是ROS的一些关键特性:

  1. 消息传递:ROS使用发布/订阅(publish/subscribe)模式进行消息传递,允许不同节点(独立的进程)之间进行通信。
  2. 工具集:ROS提供了丰富的工具集,如rviz(可视化工具)、rosbag(数据记录和回放工具)等,帮助开发者调试和测试机器人应用。
  3. 硬件抽象:ROS提供了硬件抽象层,使得开发者可以在不同的硬件平台上运行相同的代码。
  4. 包管理:ROS使用包(package)来组织代码,每个包可以包含节点、库、配置文件等。
  5. 社区支持:ROS有一个庞大的开发者社区,提供了大量的开源包和文档,帮助开发者快速上手。

ROS主要由以下几个部分组成:

  • ROS核心(roscore):提供名称服务、参数服务器和消息传递等核心功能。
  • ROS客户端库:如roscpp(C++客户端库)、rospy(Python客户端库)等,帮助开发者编写ROS节点。
  • ROS工具:如rvizrqtrosbag等,帮助开发者调试和测试机器人应用。

总之,ROS是一个强大的机器人软件开发框架,广泛应用于学术研究和工业界。

CMakeLists.txt

motion_control\guidance\los_guidance\CMakeLists.txt

这个文件 CMakeLists.txt 是一个CMake构建脚本,定义了如何构建和配置名为 los_guidance 的ROS包。

总结

这个CMake构建脚本配置了一个名为 los_guidance 的ROS包,定义了包的依赖关系、包含目录、库文件以及链接库。通过这些配置,可以确保项目在编译时正确地找到所需的头文件和库文件,并生成所需的目标库。

详细解释

以下是代码的详细解释:

CMake最低版本和项目名称

cmake_minimum_required(VERSION 3.0.2)
project(los_guidance)
  • cmake_minimum_required(VERSION 3.0.2):指定CMake的最低版本要求为3.0.2。
  • project(los_guidance):定义项目名称为 los_guidance

编译选项

add_compile_options(-std=c++11)
  • add_compile_options(-std=c++11):添加编译选项,指定使用C++11标准进行编译。

查找catkin包

find_package(catkin REQUIRED COMPONENTS
  geometry_msgs
  nav_msgs
  roscpp
  std_msgs
  tf2
)
  • find_package(catkin REQUIRED COMPONENTS ...):查找并加载catkin包及其依赖的组件,包括 geometry_msgsnav_msgsroscppstd_msgstf2

catkin包配置

catkin_package(
  INCLUDE_DIRS include
#  LIBRARIES los_guidance
  CATKIN_DEPENDS geometry_msgs nav_msgs roscpp std_msgs tf2
#  DEPENDS system_lib
)
  • catkin_package(...):生成CMake配置文件,并声明该包对其他依赖包的依赖关系。
    • INCLUDE_DIRS include:包含头文件的目录。
    • CATKIN_DEPENDS geometry_msgs nav_msgs roscpp std_msgs tf2:该项目依赖的catkin包。

包含目录

include_directories(
  include
  ${catkin_INCLUDE_DIRS}
)
  • include_directories(...):指定头文件的额外位置,确保项目的头文件目录在其他目录之前。
    • include:当前项目的头文件目录。
    • ${catkin_INCLUDE_DIRS}:catkin包的头文件目录。

添加库

add_library(${PROJECT_NAME}
  src/set_of_los.cpp
)
  • add_library(${PROJECT_NAME} src/set_of_los.cpp):定义并添加一个库,库的源文件是 src/set_of_los.cpp${PROJECT_NAME}los_guidance

链接库

target_link_libraries(${PROJECT_NAME}
  ${catkin_LIBRARIES}
)
  • target_link_libraries(${PROJECT_NAME} ${catkin_LIBRARIES}):指定该库需要链接的其他库,这里是catkin包的库。

package.xml

motion_control\guidance\los_guidance\package.xml

这个文件 package.xml 是一个ROS包的描述文件,定义了包的元数据和依赖关系。

总结

这个 package.xml 文件定义了 los_guidance 包的基本信息、维护者、许可证和依赖关系。需要注意的是,某些占位符(如许可证信息)需要替换为实际内容。这个文件对于ROS包的构建和管理至关重要。

详细解释

以下是代码的详细解释:

XML声明

<?xml version="1.0"?>
  • 声明XML版本为1.0。

包格式和基本信息

<package format="2">
  <name>los_guidance</name>
  <version>0.0.0</version>
  <description>The los_guidance package</description>
  • <package format="2">:指定包的格式版本为2。
  • <name>los_guidance</name>:定义包的名称为 los_guidance
  • <version>0.0.0</version>:定义包的版本为 0.0.0
  • <description>The los_guidance package</description>:提供包的描述信息。

维护者信息

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="jane.doe@example.com">Jane Doe</maintainer> -->
  <maintainer email="jiaxier@todo.todo">jiaxier</maintainer>
  • <maintainer email="jiaxier@todo.todo">jiaxier</maintainer>:定义包的维护者及其电子邮件地址。每个包至少需要一个维护者标签。

许可证信息

  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>
  • <license>TODO</license>:定义包的许可证信息。每个包至少需要一个许可证标签。这里需要替换为实际的许可证类型,如 BSDMIT 等。

可选的URL标签

  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/los_guidance</url> -->
  • <url> 标签是可选的,可以包含包的相关链接,如网站、问题跟踪器或代码仓库。

可选的作者标签

  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="jane.doe@example.com">Jane Doe</author> -->
  • <author> 标签是可选的,可以包含包的作者信息。作者不一定是维护者。

依赖关系

  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  • <depend>:用于指定既是构建依赖又是运行依赖的包。
  • <build_depend>:用于指定编译时需要的包。
  • <build_export_depend>:用于指定构建时需要导出的包。
  • <buildtool_depend>:用于指定构建工具包。
  • <exec_depend>:用于指定运行时需要的包。
  • <test_depend>:用于指定仅在测试时需要的包。

hello,我是 是Yu欸 。如果你喜欢我的文章,欢迎三连给我鼓励和支持:👍点赞 📁 关注 💬评论,我会给大家带来更多有用有趣的文章。
原文链接 👉 ,⚡️更新更及时。

欢迎大家添加好友交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2193242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(刷题记录5)盛最多水的容器

盛最多水的容器 题目信息&#xff1a;题目思路(环境来自力扣OJ的C)&#xff1a;暴力枚举&#xff1a;双指针&#xff1a;移动高度较高的指针移动高度较低的指针 复杂度&#xff1a;代码与注释&#xff1a;暴力枚举&#xff1a;双指针&#xff1a; 题目信息&#xff1a; 给定一…

windows 找不到文件 Microsoft Net Framework 3.5 windows Driver Foundation(WDF).exe

问题 正常更新windows 11的时候发现这个问题。 重启也无法完成下面的更新&#xff0c;重启之后还是显然要更新&#xff1a; 解决方法 中文网站没有找到解决方案。微软官网总是给不靠谱的解决方案。 从有关上看到一个印度语音的视频&#xff0c;用的方法可行。借鉴过来。 …

【机器学习】机器学习框架

机器学习框架是支持开发、训练、和部署机器学习模型的工具集和库&#xff0c;以下是一些主流的机器学习框架及其特点&#xff1a; 1. TensorFlow 特点: 由 Google 开发&#xff0c;支持从研究到生产的大规模部署&#xff0c;广泛应用于深度学习模型。优势: 强大的可扩展性&am…

golang gin入门

gin是个小而精的web开发框架 官方文档 安装 go get -u github.com/gin-gonic/gin最简单的起手代码 package mainimport ("net/http""github.com/gin-gonic/gin" )func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON…

【自用】王道文件管理强化笔记

文章目录 操作系统引导:磁盘初始化文件打开过程角度1文件的打开过程角度2 内存映射的文件访问 操作系统引导: ①CPU从一个特定主存地址开始&#xff0c;取指令&#xff0c;执行ROM中的引导程序(先进行硬件自检&#xff0c;再开机) ②)将磁盘的第一块–主引导记录读入内存&…

【机器学习】深度学习、强化学习和深度强化学习?

深度学习、强化学习和深度强化学习是机器学习的三个重要子领域。它们有着各自独特的应用场景和研究目标&#xff0c;虽然都属于机器学习的范畴&#xff0c;但各自的实现方式和侧重点有所不同。 1. 深度学习&#xff08;Deep Learning&#xff09; 深度学习是一种基于神经网络的…

2024 年在线翻译谁称霸?论文翻译场景大揭秘!

现在这世界&#xff0c;语言就是把我们连在一起的绳子&#xff0c;挺关键的。不管搞研究、做生意还是传文化&#xff0c;翻译得又快又准。2024年&#xff0c;翻译这行竞争挺猛的&#xff0c;各种在线翻译工具都挺拼的。咱们今天就聊聊论文翻译&#xff0c;瞅瞅谁能在这场翻译比…

Meta 发布 Quest 3S 头显及 AR 眼镜原型:开启未来交互新视界

简介 在科技的浪潮中&#xff0c;Meta 始终站在创新的前沿&#xff0c;不断为我们带来令人惊叹的虚拟现实和增强现实体验。2024 年 10 月 6 日&#xff0c;让我们一同聚焦 Meta 最新发布的 Quest 3S 头显及 AR 眼镜原型&#xff08;Orion&#xff09;&#xff0c;探索这两款产品…

【Blender Python】5.Blender场景中的集合

概述 这里的“集合”是指Blender场景中的集合。你可以在“大纲视图”面板中看到 图标的&#xff0c;就是集合&#xff0c;可以看做是文件夹&#xff0c;用于分类和整理场景中的对象。 获取场景的集合 >>> C.scene bpy.data.scenes[Scene]>>> C.scene.coll…

nodejs 构建高性能服务器的关键技术

nodejs 构建高性能服务器的关键技术 演示地址 演示地址 源码地址 源码地址 获取更多 获取更多 在现代 Web 开发中&#xff0c;Node.js 已成为构建高性能、可扩展网络应用的首选平台之一。它的非阻塞 I/O 模型与事件驱动架构使其能够在处理大量并发请求时表现出色&#xff0…

环形缓冲区(Ring Buffer)在STM32 HAL库中的应用:防止按键丢失

环形缓冲区&#xff08;Ring Buffer&#xff09;又称为循环缓冲区或圆形队列&#xff0c;是一种数据结构&#xff0c;它用于管理固定大小的数据存储空间。环形缓冲区本质是一个一维数组&#xff0c;不过是收尾相连的&#xff0c;类比一条蛇咬自己尾巴。 环形缓冲区重要性&…

危机四伏|盘点紧盯我国的五大APT组织

毒云藤&#xff08;APT-C-01&#xff09; 命名&#xff1a;该组织是 360 独立发现的&#xff0c;并率先披露了该组织的部分相关信息符合 360 对 APT 组织就行独立命名的条件。 360 威胁情报中心将 APT-C-01 组织命名为“毒云藤”&#xff0c;主要是考虑了以下几方面的因素&…

L1415 【哈工大_操作系统】CPU调度策略一个实际的schedule函数

L2.7 CPU调度策略 1、调度的策略 周转时间&#xff1a;任务进入到任务结束&#xff08;后台任务更关注&#xff09;响应时间&#xff1a;操作发生到响应时&#xff08;前台任务更关注&#xff09;吞吐量&#xff1a;CPU完成的任务量 响应时间小 -> 切换次数多 -> 系统…

curses函数库简介及使用

curses函数库简介及使用 导语curses简介屏幕输出读取清除移动字符 键盘键盘模式输入 窗口WINDOW常用函数屏幕刷新优化 子窗口keypad彩色显示pad总结参考文献 导语 curses函数库主要用来实现对屏幕和光标的操作&#xff0c;它的功能定位处于简单文本行程序和完全图形化界面之间…

【重学 MySQL】五十八、文本字符串(包括 enum set)类型

【重学 MySQL】五十八、文本字符串&#xff08;包括 enum set&#xff09;类型 CHAR 和 VARCHARTEXT 系列ENUMSET示例注意事项 在 MySQL 中&#xff0c;文本字符串类型用于存储字符数据。这些类型包括 CHAR、VARCHAR、TEXT 系列&#xff08;如 TINYTEXT、TEXT、MEDIUMTEXT 和 L…

鸿蒙开发(NEXT/API 12)【管理应用与Wear Engine服务的连接状态】手机侧应用开发

监测应用与Wear Engine服务的连接状态 华为运动健康App在后台停止服务&#xff08;如功耗过高&#xff09;&#xff0c;从而导致应用与Wear Engine服务的连接状态发生变化。对于类似这种不确定的断开情况&#xff0c;开发者可以通过本功能特性了解当前应用和Wear Engine的连接…

NatGo我的世界联机篇

书接上回 这里的TCP是JAVA&#xff0c;UDP是BE&#xff0c;选自适合你的映射类型 内网端口就填下面图片在你游戏同一个地方的数字!!! 就是我填12345的地方&#xff0c;mod-自定义局域网联机 默认 25565&#xff0c;如果出现无法创建本地游戏&#xff0c;那可能是端口被占用或…

卷积层是如何学习到图像特征的?

你好啊&#xff0c;我是董董灿。 想搞懂这个问题&#xff0c;需要先了解我们所说的特征指的是什么&#xff1f;然后再了解卷积核是如何学到的特征。 我们一步步来。 1、我们先来理解图像的特征 对于一张原始图像而言&#xff0c;说原始图像是相对于经过卷积处理而言的。 对…

【文心智能体】旅游攻略版,手把手教你调用插件实现智能体,绝对的干货满满!

1.灵感来源 需要创建一个智能体&#xff0c;首先当然是需要一个创作灵感啦&#xff0c;那么恰逢国庆假期&#xff0c;但是网上各种各样的旅游资料使我头晕目眩&#xff0c;刚好呢百度的文心智能体平台给我们提供了各种各样的插件以及知识库&#xff0c;可以供我们随心所欲地调…

嵌入式硬件设计中EDA布局与布线实现

大家好,今天主要给大家分享一下,如何使用立创EDA进行布局和布线,具体实现过程如下: 第一:PCB概念介绍 在介绍PCB的时候,先来说明一下,电子管的发明史。 贝尔在1876年发明了电话,爱迪生1879年发明了白炽灯、特斯拉于1888年发明了电动机,所有这些,都为电子学的诞生准…