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.txt
          include/cpp_package_1/
          package.xml
          src/

      py_package_1/
          package.xml
          resource/py_package_1
          setup.cfg
          setup.py
          py_package_1/
      ...
      cpp_package_n/
          CMakeLists.txt
          include/cpp_package_n/
          package.xml
          src/

动动手

创建一个功能包

        我们打开一个终端,第一步要做的事情就是激活下基础层(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文件内容:

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

本篇完。 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

番外篇 | 利用YOLOv5实现视频划定区域目标统计计数

前言:Hello大家好,我是小哥谈。视频划定区域目标统计计数是指在一个给定的视频中,通过划定一个特定的区域,对该区域内的目标进行统计计数的过程。这个过程通常涉及到目标检测和跟踪的技术。本篇文章就以YOLOv5算法为基础,实现视频划定区域目标统计计数!~🌈 目录…

3.6k star, 免费开源跨平台的数据库管理工具 dbgate

3.6k star, 免费开源跨平台的数据库管理工具 dbgate 分类 开源分享 项目名: dbgate -- 免费开源跨平台的数据库管理工具 Github 开源地址&#xff1a; GitHub - dbgate/dbgate: Database manager for MySQL, PostgreSQL, SQL Server, MongoDB, SQLite and others. Runs under…

汇编语言作业(二)

目录 一、实验目的 二、实验内容 三、实验步骤以及结果 四、实验结果与分析 五、实验总结 一、实验目的 1、巩固debug命令 2、使用 debug 来进行寄存器、内存中内容的查看和修改 3、使用 debug 来进行程序的调试 二、实验内容 上图是一段指令代码 &#xff0c;机器码和汇编…

JS详解-手写Promise!!!

前言&#xff1a; 针对js的深入理解&#xff0c;作者学习并撰写以下文章&#xff0c;由于理解认知有限难免存在偏差&#xff0c;请大家指正&#xff01;所有定义来自mdn。 Promise介绍&#xff1a; 对象表示异步操作最终的完成&#xff08;或失败&#xff09;以及其结果值. 描…

vue3表单参数校验+正则表达式

这里我们要实现在form表单中对表单项添加参数校验。 校验要求 我们的表单中有用户名、密码、电话号码、邮箱这四个项。 我们设置用户名为3到20位的非空字符 密码为3到25位非空字符 电话号码就用目前用的电话号码正则表达式&#xff0c;要求手机号码以 1 开头&#xff0c;第…

Unity框架,ET框架8.1版本的打包流程记录

目录 打包代码前置1.必须要安装Visusal Studio 2022的组件&#xff0c;如下图&#xff0c;必须都要进行安装&#xff0c;不然会在代码重构的时候报错&#xff0c;丢失SDK。Rider的版本必须2023及以上 步骤一、使用Rider编辑器打开项目后进行重构项目步骤二、使用HybirdCLR生成A…

UTONMOS:AI+Web3+元宇宙数字化“三位一体”将触发经济新爆点

人工智能、元宇宙、Web3&#xff0c;被称为数字化的“三位一体”&#xff0c;如何看待这三大技术所扮演的角色&#xff1f; 3月24日&#xff0c;2024全球开发者先锋大会“数字化的三位一体——人工智能、元宇宙、Web3.0”论坛在上海漕河泾开发区举行&#xff0c;首次提出&…

设计模式——原型模式05

原型模式核心复制&#xff0c;每次new出来的对象完全不一样&#xff0c;实现对象之间的隔离。 学习前最好先掌握jAVA值传递和深浅拷贝 设计模式&#xff0c;一定要敲代码理解 浅拷贝 克隆出对象&#xff0c;其中两者的引用类型属性是同一个对象。 对象信息 /*** author ggb…

Ps:合并到 HDR Pro

Ps菜单&#xff1a;文件/自动/合并到 HDR Pro Automate/Merge to HDR Pro 合并到 HDR Pro Merge to HDR Pro命令可以将同一场景的具有不同曝光度的多个图像合并起来&#xff0c;从而捕获单个 HDR 图像中的全部动态范围。 合并到 HDR Pro 命令分两步进行。 首先&#xff0c;需要…

Kubernetes(k8s):精通 Pod 操作的关键命令

Kubernetes&#xff08;k8s&#xff09;&#xff1a;精通 Pod 操作的关键命令 1、查看 Pod 列表2、 查看 Pod 的详细信息3、创建 Pod4、删除 Pod5、获取 Pod 日志6、进入 Pod 执行命令7、暂停和启动 Pod8、改变 Pod 副本数量9、查看当前部署中使用的镜像版本10、滚动更新 Pod11…

车载电子电器架构 —— 软件下载

车载电子电器架构 —— 软件下载 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无…

matlab中角度-弧度转化

在 MATLAB 中进行角度和弧度之间的转换可以使用内置的函数&#xff1a; 1. 将角度转换为弧度&#xff1a; matlab rad deg * pi / 180; 这里 deg 是你想要转换的角度值&#xff0c;pi 是 MATLAB 内置的圆周率常量。 2. 将弧度转换为角度&#xff1a; matlab…

端口映射如何测试?

端口映射是一项网络技术&#xff0c;用于将外部网络中的数据流量映射到内部网络中的特定端口或设备上。通过端口映射&#xff0c;可以实现远程访问内部网络中的设备或应用程序&#xff0c;使其能够在外部网络中得到访问。本文将介绍端口映射测试及其应用场景。 2. 【天联】组网…

MIT6.828实验:Xv6 and Unix utilities

2023MIT6.828 lab-1 官方地址 一、sleep 实验内容 调用sleep&#xff08;系统调用&#xff09;编写用户级别程序能暂停特定时常的系统滴答程序保存在user/sleep.c 实验过程 xv6的参数传递 查看官方文档提示的文件中&#xff0c;多采用如下定义&#xff1a; int main(in…

代码随想录算法训练营第三十天| 332.重新安排行程, 51. N皇后, 37. 解数独,总结

题目与题解 参考资料&#xff1a;回溯总结 332.重新安排行程 题目链接&#xff1a;332.重新安排行程 代码随想录题解&#xff1a;332.重新安排行程 视频讲解&#xff1a;带你学透回溯算法&#xff08;理论篇&#xff09;| 回溯法精讲&#xff01;_哔哩哔哩_bilibili 解题思路&a…

【随笔】Git 高级篇 -- 相对引用2(十三)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

每日一题(leetcode287):寻找重复数--二分查找+思维

思路&#xff1a;看官方解答 class Solution { public:int findDuplicate(vector<int>& nums) {int nnums.size();int left1;int rightn-1;int ans-1;while(left<right){int mid(leftright)/2;int count0;for(int j0;j<n;j){if(nums[j]<mid){count;}}if(co…

小林coding图解计算机网络|基础篇03|Linux 系统是如何收发网络包的?

小林coding网站通道&#xff1a;入口 本篇文章摘抄应付面试的重点内容&#xff0c;详细内容还请移步&#xff1a;小林coding网站通道 文章目录 网络模型Linux 网络协议栈Linux 接收网络包的流程Linux发送网络包的流程为什么全部数据包只用一个结构体来描述呢发送网络数据的时候…

[HackMyVM]靶场Logan2

难度:Medium kali:192.168.56.104 靶机:192.168.56.146 端口扫描 ┌──(root㉿kali2)-[~/Desktop] └─# nmap 192.168.56.146 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-04-04 19:41 CST Nmap scan report for 192.168.56.146 Host is up (0.000067s latency)…

0201基础集成与使用-微信支付-支付模块-项目实战

文章目录 一、前言二、springboot集成2.1 配置信息与配置类2.2 微信相关枚举信息2.3 工具类2.4 业务接口 三、演示-支付与退款结语 一、前言 下面我以微信支付v3为例&#xff0c;通过spirngboot集成到我们的项目中&#xff0c;不依赖其他第三方框架。当然适用简单项目&#xf…