ROS2 学习笔记13:创建 ROS2 包

ROS2 学习笔记13:创建 ROS2 包

  • Background 背景
    • 1 什么是ROS2 包
    • 2 ROS2包的组成
    • 3 工作空间的包
  • Prerequisites 前提
  • Tasks 任务
    • 1 Create a package
    • 2 Build a package
    • 3 Source the setup file
    • 4 Use the package
    • 5 Examine package contents
    • 6 Customize package.xml
  • Summary 总结
  • Next steps 下一步

Background 背景

1 什么是ROS2 包

包可以视为你的ros2代码的容器.如果你想安装你的程序或者分享给别人,你需要(把代码)有组织放到一个包里面。有了包,你可以分享ros2工作内容,别人可以方便地编译以及使用。

ros2包创建使用ament作为编译系统,colcon作为编译工具。使用CMake或者python来创建一个包,这些是官方支持的,当然也存在其他构建方式。

2 ROS2包的组成

ROS2 CMake或者python 包 应至少包含以下相关文件:

CMake
CMakeLists.txt :描述如何编译代码的文件
include/<package_name> :包含包的公共头文件的目录
package.xml:包含包的基本信息的文件
src:包含包源代码的目录

python
package.xml:包含包的基本信息的文件
resource/<package_name>:包的标记文件
setup.cfg:该文件的作用是,让ros2 run指令可以找到包里面的可执行文件
setup.py:安装该包的使用说明
/<package_name>:一个和包名同名的目录,可让ros2工具用来找到你的包,其包含__init__.py

最简单的包文件结构如下:
备注: 不同版本略有差异

CMake

my_package/CMakeLists.txtinclude/my_package/package.xmlsrc/

python

my_package/    package.xml    resource/my_package    setup.cfg    setup.py    my_package/    

3 工作空间的包

一个工作区可以包含任意数量的软件包,每个软件包都有自己的文件夹。您也可以在一个工作区中包含不同构建类型的软件包(CMakePython 等)。但不能嵌套软件包。

最佳做法是在工作区中建立一个 src 文件夹,并在其中创建软件包。这样可以保持工作区顶层的 “干净”。

工作空间可能是这样的

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/

Prerequisites 前提

按照上一教程中的说明操作后,您应该拥有一个 ROS 2 工作区。您将在此工作区中创建软件包。

Tasks 任务

1 Create a package

首先,source一下ros2环境变量.

使用前面课程创建的工作空间dev_ws来放新包.

使用包创建指令之前,确认你是在src文件夹下面:

cd ~/ros2_ws/src     

ros2创建新包的指令语法如下:

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

在本教程中,你将使用可选参数--node-name--license--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文件夹.

运行完指令,你的终端会返回一下信息:

going to create a new package
package name: my_package
destination directory: /home/user/ros2_ws/src
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['<name> <email>']
licenses: ['Apache-2.0']
build type: ament_cmake
dependencies: []
node_name: my_node
creating folder ./my_package
creating ./my_package/package.xml
creating source and include folder
creating folder ./my_package/src
creating folder ./my_package/include/my_package
creating ./my_package/CMakeLists.txt
creating ./my_package/src/my_node.cpp

您可以看到为新软件包自动生成的文件

2 Build a package

将软件包放在工作区中尤为重要,因为通过在工作区根目录下运行 colcon build,可以一次性构建多个软件包。否则,您将不得不单独构建每个软件包。

返回工作区的根目录:

cd ~/ros2_ws     

现在,您可以构建软件包了:

colcon build

在上一个教程中,您的 ros2_ws 中还包含了 ros_tutorials 软件包。你可能已经注意到,运行 colcon build 时也会生成 turtlesim 软件包。当你的工作区中只有几个软件包时,这没什么问题,但当有很多软件包时,colcon build 就会耗费很长的时间。

要想下次只编译 my_package 软件包,可以运行

colcon build --packages-select my_package   

3 Source the setup file

为了使用新的包和执行文件,新开终端,并source一下ros2环境变量

然后,在dev_ws目录,运行下面指令来source一下工作空间环境变量:

source install/local_setup.bash

现在工作区已添加到路径中,您就可以使用新软件包的可执行文件了。

4 Use the package

为了使用创建包时,使用--node-name参数创建的执行文件,输入指令:

ros2 run my_package my_node

终端会返回信息:

hello world my_package package  

5 Examine package contents

dev_ws/src/my_package目录下面,你会看到一些文件和文件夹使用指令ros2 pkg create自动生成:

CMakeLists.txt  include  package.xml  src

my_node.cpp存在src目录,以后需要要运行的c++编写的节点都是放这里

6 Customize package.xml

您可能已经注意到,在创建软件包后的返回信息中,descriptionlicense字段包含 TODO 注释。这是因为软件包描述和许可证声明不是自动设置的,但如果您想发布软件包,这两个字段是必须填写的。maintainer字段可能也需要填写。

进入dev_ws/src/my_package目录,用编辑器打开文件package.xml

<?xml version="1.0"?>
<?xml-modelhref="http://download.ros.org/schema/package_format3.xsd"schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="3"><name>my_package</name><version>0.0.0</version><description>TODO: Package description</description><maintainer email="user@todo.todo">user</maintainer><license>TODO: License declaration</license><buildtool_depend>ament_cmake</buildtool_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

如果maintainer一栏没有自动填写,请输入您的姓名和电子邮件地址。然后,编辑description描述行,对软件包进行概述:

<description>Beginner client libraries tutorials practice package</description>

然后,更新license许可证行。你可以在这里关于开源许可证的信息。由于本软件包仅用于练习,因此使用任何许可证都是安全的。我们将使用 Apache License 2.0

<license>Apache License 2.0</license>

编辑完成后不要忘记保存。

在许可证标签下面,您会看到一些以 _depend 结尾的标签名称。my_package 很简单,没有任何依赖关系,但你会在接下来的教程中看到这个的使用。

Summary 总结

您创建了一个软件包来组织您的代码,方便他人使用。

您的软件包会自动填充必要的文件,然后您使用 colcon 构建它,这样您就可以在本地环境中使用它的可执行文件。

Next steps 下一步

接下来,让我们为软件包添加一些有意义的东西。您将从一个简单的发布者/订阅者系统开始,可以选择用C++Python 编写。

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

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

相关文章

虚 拟 化原理

1 概念&#xff1a; ①通俗理解&#xff1a; 虚拟化是在硬件和操作系统之间的实践 ②通过对计算机的服务层级的理解&#xff0c;理解虚拟化概念 抽离层级之间的依赖关系&#xff08;服务器虚拟化&#xff09; 2 虚拟化分类 ①按架构分类 ◆寄居架构&#xff1a;装在操作系统上…

pytest.param作为pytest.mark.parametrize的参数进行调用

pytest.param&#xff1a;在 pytest.mark.parametrize 中可以作为一个指定的参数进行调用 获取数据库&#xff08;网页端&#xff09;数据&#xff0c;通过pytest.param包装成数据包用于pytest.mark.parametrize 中实现数据驱动调用。 import os import pytest import json fr…

OSCP靶场--Nickel

OSCP靶场–Nickel 考点(1.POST方法请求信息 2.ftp&#xff0c;ssh密码复用 3.pdf文件密码爆破) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.237.99 -sV -sC -p- --min-rate 5000 Starting Nmap 7.92 ( https://nmap.org ) at 2024-02-22 04:06 EST Nm…

5.1 Ajax数据爬取之初介绍

目录 1. Ajax 数据介绍 2. Ajax 分析 2.1 Ajax 例子 2.2 Ajax 分析方法 &#xff08;1&#xff09;在网页页面右键&#xff0c;检查 &#xff08;2&#xff09;找到network&#xff0c;ctrl R刷新 &#xff08;3&#xff09;找 Ajax 数据包 &#xff08;4&#xff09;…

【前后端的那些事】文件上传组件封装

文章目录 效果前端代码后端代码组件封装 效果 前端代码 /views/file/file.vue <template><el-row><el-uploadv-model:file-list"fileList"class"upload-demo"multiple:auto-upload"false":on-preview"handlePreview"…

Javascript[ECMAScript] ES6、ES7、ES8、ES9、ES10、ES11、ES12、ES13、ES14[2023]新特性

# 前言 鉴于找不到ES6-ES14 的新特性集合&#xff0c;所以有了这篇文章&#xff0c;后续会持续更新每年的新特性 # 背景 ## JS1.1&#xff08;1997&#xff09; [第一版基于Netscape Navigator 3.0中实现的JAVASCRIPT 1.1](https://web.archive.org/web/19970614042441/http:/…

数据结构之:跳表

跳表&#xff08;Skip List&#xff09;是一种概率性数据结构&#xff0c;它通过在普通有序链表的基础上增加多级索引层来实现快速的查找、插入和删除操作。跳表的效率可以与平衡树相媲美&#xff0c;其操作的时间复杂度也是O(log n)&#xff0c;但跳表的结构更简单&#xff0c…

Swiper.js:不识这个轮播图js库,说明你的前端还未入门

hello&#xff0c;我是贝格前端工场&#xff0c;本期给大家带来轮播图的s库&#xff1a;Swiper.js&#xff0c;用这个类库处理轮播图、幻灯片、画廊那是得心应手&#xff0c;非常的easy&#xff0c;欢迎老铁们点赞关注&#xff0c;如有前端定制开发需求可以私信我们。 一、Swip…

网络编程、UDP、TCP

计算机网络 就是将地理位置不同的具有独立功能的多台计算及外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统、网络管理软件以及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计算机系统 目的 传播交流信息、数据交换、通信 如何做…

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理

TensorRT及CUDA自学笔记003 CUDA编程模型、CUDA线程模型及其管理、CUDA内存模型及其管理 各位大佬&#xff0c;这是我的自学笔记&#xff0c;如有错误请指正&#xff0c;也欢迎在评论区学习交流&#xff0c;谢谢&#xff01; CUDA编程模型 我们使用CUDA_C语言进行CUDA编程&am…

【Vue3】‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。

问题 今天拿到别人项目的时候&#xff0c;我平时比较习惯用pnpm&#xff0c;我就使用pnpm i先下载依赖包&#xff0c;下载完成后&#xff0c;启动项目&#xff0c;就开始报以下错误&#xff01; 但是当我执行pnpm i的时候&#xff0c;vite不应该就已经被我下载下来了吗 研究了…

学习JAVA的第五天(基础)

目录 API 字符串 String概述 比较的是什么&#xff1f; 关于字符串的比较 字符串代码展示 StringBuilder概述 StringBuilder方法的代码展示 StringJoiner概述 StringJoiner方法的代码展示​​​​​​​ 练习-用户登录 API API&#xff08;Application Programing I…

【Java程序设计】【C00307】基于Springboot的基Hadoop的物品租赁管理系统(有论文)

基于Springboot的基Hadoop的物品租赁管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的基于 Hadoop的物品租赁系统的设计与实现&#xff0c;本系统有管理员、用户二种角色权限&#xff1b; 前台首页&#…

day11-项目集成SpringSecurity-今日指数

项目集成SpringSecurity 学习目标 理解自定义认证和授权过滤器流程&#xff1b;理解项目集成SprignSecurity流程&#xff1b; 第一章 自定义认证授权过滤器 1、SpringSecurity内置认证流程 通过研究SpringSecurity内置基于form表单认证的UsernamePasswordAuthenticationFi…

【工程院院士加盟】第四届计算机通信与人工智能国际会议

CCAI 2024 | Xian, Chinahttp://ccai.net/ - IEEE出版&#xff0c;EI核心和Scopus检索 - 工程院院士&#xff0c;IEEE Fellow等学术大咖主题演讲 - 会议时间-地点&#xff1a;2024年5月24-26日&#xff0c;中国西安 会议简介 Brief Introduction 作为人工智能的重要传播技术…

Linux环境下基本指令

今天我们一起来认识一下Linux环境下一些基本的指令&#xff0c;这些指令是我们学习Linux的基础&#xff0c;只有掌握了这些指令&#xff0c;我们才能在Linux环境下进一步学习知识&#xff0c;话不多说&#xff0c;我们开始&#xff08;以下演示操作是在云服务器的环境下&#x…

基于SSM的车位租赁系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的车位租赁系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Spri…

MySQL TO_DAYS() 函数详解与实际应用

前言 在数据库操作中&#xff0c;日期和时间函数是处理日期相关计算和筛选数据时不可或缺的一部分。MySQL 作为广泛应用的关系型数据库管理系统&#xff0c;提供了丰富的日期时间函数供开发者使用。本文将详细介绍 MySQL 中的 TO_DAYS() 函数&#xff0c;包括其基本功能、用法…

【数据分析之Numpy基础004】数学运算大揭秘:轻松玩转ndarray的强大实力

ndarray的数学运算是一项非常重要的操作&#xff0c;包括不同对象之间的四则运算&#xff0c;三角函数变换、求和、求平均等操作 1、四则运算 如果参与运算的两个对象都是ndarray&#xff0c;并且形状相同&#xff0c;那么就可以进行对位之间的四则&#xff08; - * / &#x…

unity学习(37)——自动保存

虽然脚本图片这些东西可以自动保存&#xff0c;但是场景中的控件不会自动&#xff0c;需要增加以下控件。 unity运行自动保存_unity自动保存-CSDN博客 Asset->创建Editor->创建autosave.cs&#xff0c;脚本代码如下&#xff1a; using UnityEditor; using UnityEngine…