ROS 2边学边练(13)-- 创建一个功能包

前言

功能包是啥

        简单理解,功能包就是一个文件夹,一个具备一定功能的文件夹,一个有组织有结构的文件夹,一个能方便分享给其他人使用的文件夹,比如我们的小海龟功能包,它就是一个文件夹,名字叫turtlesim,在turtlesim文件夹下包含了其他几个子文件夹(src、msg、srv、action、include等等),这几个子文件夹里面又包含了一些配置文件、源文件等等内容,它们总体组织成了具备海龟仿真功能的一份功能包,我们可以使用它来订阅cmd_vel主题、发布消息等等。

        在ROS 2的功能包开发环境中,ament充当其元编译系统(编译系统+构建工具,编译系统主要负责配置、编译和安装独立的功能包,而构建工具则负责将多个独立的功能包按照一定的拓扑结构进行链接),而colcon为其构建工具(用于构建、测试和分发功能包),官方支持通过CMake(跨平台编译工具,可以用简单的语句来描述所有平台的编译过程,能够产生makefile文件和project文件)或python创建一个功能包(当然,其他类型也是支持的)。

包里面都有啥

        上图为小海龟仿真功能包内况,由于其是官方为了演示ROS的诸项知识点而写的,所以文件内容较为齐全,它涵盖了功能包(C/C++类型)的几个基本必须项:

include/<package_name>:功能包所需的公共头文件;

src:功能包源代码文件;

CMakeLists.txt:构建功能包规则文件;

package.xml:包的一些原始信息文件。

而在python类型的包中(比C/C++类型啰嗦些):

package.xml:包的一些原始信息文件;

resource/<package_name>:包的标记文件;

setup.cfg:包被启动运行(ros2 run)时需要这个启动配置文件;

setup.py:包进行安装时的指导脚本文件;

<package_name>:与包同名的文件夹(包含了__init__.py,上一篇我们有通过修改它来解决rosdep update超时问题),ROS 2工具利用它来找到我们的包。

工作空间中的功能包

        一个工作空间中可以包含很多的包,这些包都有属于各自独立的文件夹(一个工作空间中包的类型不局限于某一个,而是可以百花齐放共存),这样组织架构就很简单明了,方便管理。我们可以在工作空间根src路径下创建这些功能包,包1、包2、包3...,这些包都处于同一级,也就是包之间不能相互嵌套(比如包2在包1内,这是不允许的)。

        常见的一个工作空间中包的的情况如下:

workspace_folder/src/cpp_package_1/CMakeLists.txtinclude/cpp_package_1/package.xmlsrc/py_package_1/package.xmlresource/py_package_1setup.cfgsetup.pypy_package_1/...cpp_package_n/CMakeLists.txtinclude/cpp_package_n/package.xmlsrc/

动动手

创建一个功能包

        我们打开一个终端,第一步要做的事情就是激活下基础层(underlay)的环境变量,因为我们的包都会依赖于一些基础层提供的支持,还记得命令不:

$source /opt/ros/iron/setup.bash

第二步,我们需要进入到ros2_ws/src路径下,因为这里是创建功能包的地方:

$cd ~/ros2_ws/src

第三步,使用下面的命令创建我们的新包:

$ros2 pkg create --build-type ament_cmake --license Apache-2.0 <package_name>

在官方提供的教程当中,我们会添加--node-name选项创建一个简单的Hello World类型的功能包,如下(--license为版本声明):

$ros2 pkg create --build-type ament_cmake --license Apache-2.0 --node-name my_node my_package

通过上面的命令它为我们在src路径下创建了一个名字为my_package的功能包文件夹,该文件夹下又生成了包的几个基本组成项,看下面:

 my_package/src下面也已经生成了一个名为my_node.cpp的源代码文件,里面的内容如下:

只是会打印一句“hello world my_package package”。

构建一个功能包

        现在我们需要退出到工作空间根路径下(cd ~/ros2_ws)进行功能包的构建工作:

$colcon build

上面这个命令会将src路径下的所有可用的功能包都会构建一遍,这样构建的时间与资源会与包的数量成正比关系,如果我们在src下有很多其他的功能包,我们只是想构建我们关心的包,那我们可用通过之前的colcon build --packages-up-to <package_name>命令以及下面的命令进行单独构建(我们可以在终端输入colcon build --hep进行查看更多的参数使用方法):

$colcon build --packages-select <package_name>

 我们来单独构建my_package包:

$colcon build --packages-select my_package

激活环境变量 

我们再打开一个新终端(运行和构建的环境最好分开,以免蹦出一些令人懵逼尴尬的东西),先source ROS 2安装环境(underlay)的工作变量(source /opt/ros/iron/setup.bash)再进入我们的ros2_ws路径source 工作空间的环境变量(overlay),这可以让我们的工作空间能够添加到路径当中,我们就能正常使用功能包了。

$source install/local_setup.bash

使用功能包

$ros2 run <package_name> <node_name>

        通过上面的命令使用我们的功能包,<package_name>是功能包的名字,<node_name>是这个功能包支持的节点的名字(如果不清楚有哪些节点,我们可以在输入完包名字后连续两次按tab键,它会罗列出可用的节点,就像下图所演示的那样),我们试试:

$ros2 run my_package my_node

这个节点打印出了“hello world my_package package”,同my_node.cpp里面写的那样。

自定义package.xml

         在前言里面我们曾提到过package.xml这个文件,它描述了这个功能包的一些基本信息,如作者信息、版本信息、构建类型、依赖信息等等,同时在创建我们的my_package包时,它有打印出下图的信息内容:

其中你能看到“description: TODO: Package description ”及“maintainer:['mike <mike@todo.todo>']”,这个TODO意思是需要我们手动重新编辑填充的,并不是由相关工具进行自动填充设置。下图是my_package包里面的package.xml文件内容:

我们来完善这个包信息文件,修改后的内容如下(别忘了编辑完保存):

本篇完。 

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

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

相关文章

【每日刷题】Day2

1. 26. 删除有序数组中的重复项 - 力扣&#xff08;LeetCode&#xff09; int removeDuplicates(int* nums, int numsSize) { int* newnums (int*)malloc(numsSize*sizeof(int)); int k 0; int i 0; int pf1 0; int pf2 1; if(numsSize1) { newnums[k] nums[0]; } if(nu…

Swagger2配置

Swagger2 Swagger2简介 Swagger 是一个规范和完整的框架&#xff0c;用于生成、描述、功能调用测试和可视化 RESTful 风格的在线的接口文档工具。 Swagger 是一套基于 OpenAPI 规范&#xff08;OpenAPI Specification&#xff0c;OAS&#xff09;构建的开源工具。 Swagger 提…

WPS 不登录无法使用基本功能的解决办法

使用wps时&#xff0c;常常有个比较让人烦恼的事&#xff0c;在不登录的情况下&#xff0c;新建或者打开文档时&#xff0c;wps不让你使用其基本的功能&#xff0c;如设置字体等&#xff0c;相关界面变成灰色&#xff0c;这时Wps提示用户登录注册或登录&#xff0c;但我又不想登…

均值滤波算法与SSE2指令集并行优化

均值滤波是经典的机器视觉方法,本篇将讨论如何对该算法进行优化,使得其比OpenCV的实现更快。 为量化运行速度,先实现遍历求和的均值滤波算法,看看其运行效率究竟有多慢,代码如下: 遍历求和均值滤波算法 #include <opencv2/opencv.hpp> #include <iostream>…

【QT入门】 无边框窗口设计之综合运用,实现WPS的tab页面

往期回顾&#xff1a; 【QT入门】 无边框窗口设计之实现窗口阴影-CSDN博客 【QT入门】 无边框窗口设计之实现圆角窗口-CSDN博客 【QT入门】 无边框窗口设计综合运用之自定义标题栏带圆角阴影的窗口-CSDN博客 【QT入门】 无边框窗口设计之综合运用&#xff0c;实现WPS的tab页面 …

Nexus的docker安装,maven私服

文章目录 前言安装创建文件夹设置文件夹权限docker创建指令制作docker-compose.yaml文件 查看网站访问网页查看密码 前言 nexus作为私服的maven仓库&#xff0c;在企业级应用中&#xff0c;提供了依赖来源的稳定性&#xff0c;为构建庞大的微服务体系&#xff0c;打下基础 安…

如何实现在不给定长度的情况下进行输入?

在输入一串数字时&#xff0c;不管是使用for循环还while循环&#xff0c;我们都必须知道要输入的具体长度。 可是如果题目没有给定输入长度&#xff0c;也没有给定最大范围呢&#xff1f; 同样也有for与while两种循环方式。 for #include<iostream> using namespace …

Svelte Web 框架介绍

Svelte 是一个用于构建网络应用程序的现代框架&#xff0c;它与其他用户界面框架&#xff08;如React和Vue&#xff09;有着本质的不同。Svelte 的核心理念是在构建应用程序时&#xff0c;将大部分工作转移到编译步骤中&#xff0c;而不是在用户的浏览器中运行时处理。这种方法…

算法——分治(快速排序)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享分治算法关于快速排序的专题 对于快速排序在我个人主页专栏 <排序> 有详细的介绍,此专题对快排进行了优化操作,并介绍了优化后的快排的几种运用 如果有不足的或者错误的请…

Linux初学(十五)ssh服务

一、SSH服务 1.1 简介 远程登录Linux用的就是ssh服务 ssh服务的特点就是数据会机密传输 ssh服务 组件&#xff1a;openssl 服务名&#xff1a;sshd 默认端口&#xff1a;22 1.2 配置文件 /etc/ssh/sshd_config #Port 22 ssh的端口 #Use…

【正点原子探索者STM32F4】TFTLCD实验学习记录:FSMC控制 TFTLCD的寄存器配置

FSMC控制 TFTLCD的寄存器配置 异步模式 A控制 TFTLCDFSMC寄存器配置ILI9341电平持续时间要求 参考 异步模式 A控制 TFTLCD LCD以ILI9341为例 FSMC寄存器配置 对于异步突发访问方式&#xff0c; FSMC 主要设置 3 个时间参数&#xff1a;地址建立时间(ADDSET)、 数据 建立时间…

Linux服务器上安装多个版本cuda的一些准备

1. 在已经有cuda10.1的基础上安装cuda11.3并配置进环境变量 linux20.04 cuda避坑安装/nvidia驱动/环境配置/安装cuDNN_linux安装cuda-CSDN博客 2. 配置环境变量的过程需要用到Vim编辑器&#xff0c;Vim编辑器的使用方法 vim 的基本使用命令_vim命令行操作-CSDN博客 3.cuda…

Java学习之抽象类和接口

目录 抽象方法和抽象类 示例 使用要点 接口(interface) 作用 定义及使用 声明格式 定义接口的详细说明 要点 示例 接口中定义静态方法和默认方法(JDK8及以后) 默认方法 示例 静态方法 接口的多继承 示例 抽象方法和抽象类 抽象方法 使用abstract修饰的方法&…

Unity之PUN实现多人联机射击游戏的优化(Section 2)

目录 &#x1f3ae;一、准备工作 &#x1f3ae;二、实现手雷投掷动作 &#x1f3ae;三、手雷投掷同步 &#x1f4a4;3.1 photonView.RPC &#x1f3ae;四、同步手雷伤害 这几周都给我布置任务了&#xff0c;最近可忙。现在终于有机会更新了&#xff0c;也谢谢大家的阅读&a…

JavaSE-11笔记【多线程2(+2024新)】

文章目录 6.线程安全6.1 线程安全问题6.2 线程同步机制6.3 关于线程同步的面试题6.3.1 版本16.3.2 版本26.3.3 版本36.3.4 版本4 7.死锁7.1 多线程卖票问题 8.线程通信8.1 wait()和sleep的区别&#xff1f;8.2 两个线程交替输出8.3 三个线程交替输出8.4 线程通信-生产者和消费者…

C++枚举类型

在 C++ 中,枚举(Enumeration)是一种用户定义的数据类型,用于定义一组有限的命名常量。枚举类型可以简化代码,提高代码的可读性。 C++ 中的枚举类型有两种:普通枚举和枚举类。 1. 普通枚举 普通枚举使用关键字 enum 定义,可以指定枚举常量的取值。 #include <iost…

Tailwind 4.0 即将到来:前端开发的“速度与激情”

随着前端开发技术的不断进步&#xff0c;我们每天都在寻找更快、更简洁的解决方案来提升我们的开发效率和用户体验。今天&#xff0c;我要为大家介绍一项令人振奋的新技术进展——Tailwind 4.0的来临&#xff01; 对于经常使用Tailwind的朋友们来说&#xff0c;这个消息无疑是激…

阿里云短信服务业务

一、了解阿里云用户权限操作 1.注册账号、实名认证&#xff1b; 2.使用AccessKey 步骤一 点击头像&#xff0c;权限安全的AccessKey 步骤二 设置子用户AccessKey 步骤三 添加用户组和用户 步骤四 添加用户组记得绑定短信服务权限 步骤五 添加用户记得勾选openApi访问 添加…

Educational Codeforces Round 162 (Rated for Div. 2) ----- E. Count Paths --- 题解

E. Count Paths&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 根据题目中定义的美丽路径&#xff0c;我们可以发现路径只有两种情况&#xff1a; 当前结点作为起始结点&#xff0c;那我们只需要知道它的子树下有多少个相同颜色的结点&#xff0c;并且相同颜色的结…

使用 HTMX 和 Bun 进行全栈 Web 开发

将 HTMX 放在前端&#xff0c;Bun 放在后端&#xff0c;然后将它们与 Elysia 和 MongoDB 连接起来&#xff0c;形成快速便捷的技术栈&#xff0c;使开发 Web 应用程序变得轻而易举。 Bun 和 HTMX 是目前软件领域最有趣的两个事情。 Bun 是一个速度极快的一体化服务器端 JavaSc…