ROS2教程08 ROS2的功能包、依赖管理、工作空间配置与编译

ROS2的功能包、依赖管理、工作空间配置与编译

版权信息

Copyright 2023 Herman Ye@Auromix. All rights reserved.This course and all of its associated content, including but not limited to text, 
images, videos, and any other materials, are protected by copyright law. 
The author holds all rights to this course and its contents.Any unauthorized use, reproduction, distribution, or modification of this course 
or its contents is strictly prohibited and may result in legal action. 
This includes, but is not limited to:
Copying or distributing course materials without express written permission.
Reposting, sharing, or distributing course content on any platform without proper attribution and permission.
Creating derivative works based on this course without permission.
Permissions and InquiriesIf you wish to use or reproduce any part of this course for purposes other than personal learning, 
please contact the author to request permission.The course content is provided for educational purposes, and the author makes no warranties or representations 
regarding the accuracy, completeness, or suitability of the course content for any specific purpose. 
The author shall not be held liable for any damages, losses, 
or other consequences resulting from the use or misuse of this course.Please be aware that this course may contain materials or images obtained from third-party sources. 
The author and course creator diligently endeavor to ensure that these materials 
are used in full compliance with copyright and fair use regulations. 
If you have concerns about any specific content in this regard, 
please contact the author for clarification or resolution.By enrolling in this course, you agree to abide by the terms and conditions outlined in this copyright notice.

学习目标

  • 了解ROS2功能包的基本概念
  • 熟悉ROS2中功能包的配置及其构建
  • 熟悉ROS2中的依赖管理
  • 熟悉ROS2的工作空间配置及其构建

难度级别

初级中级高级

预计耗时

45 mins

学习前提

对象类型状态
ROS2 Humble软件已安装
Ubuntu22.04操作系统软件已确认
Shell的基本使用知识已了解

工作空间

在ROS2开发中,工作空间是一个重要概念,它是一个包含ROS 2软件包及其编译安装信息的目录。
它用于组织和管理机器人的代码、参数、脚本以及其他相关文件。类似于在 Visual Studio Code 中创建一个项目一样,工作空间提供了一个有序的环境,同时也避免了不同项目之间的冲突,以便更轻松地进行机器人软件开发。

以下是工作空间的常见目录及其用途:

文件夹名称用途
src代码空间:用于存储功能包的代码等。
build编译空间:存储构建过程中产生的缓存和中间文件。软件构建过程通常会产生中间文件,它们通常不直接使用,但保留它们可以使后续构建更快。
install安装空间:用于存放构建生成的可执行文件和脚本。安装空间包含已安装的软件以及使您能够使用该空间的 shell 脚本。
log日志空间:用于保存构建过程中的警告、错误等日志信息。

下面是一个示例ROS 2工作空间的目录结构:

my_ros2_workspace/    # ROS 2工作空间的根目录
├── src/             # 存放ROS 2功能包的源代码
│   ├── my_c++_robot_package/     # C++机器人功能包
│   ├── my_python_robot_package/  # Python机器人功能包
│   ├── ...            # 可以包含其他功能包
├── build/           # 存储构建生成的中间文件,如构建结果
├── install/         # 存放构建生成的功能包文件
├── log/             # 存放ROS 2的构建日志文件

假设我们正在进行机器人开发,通常会发现GitHub上有第三方开源ROS2软件包,非常适合项目,并且可以实现一个令人印象深刻的ROS2演示,为了实现这个演示,我们可以尝试以下步骤:

1.创建工作空间

首先,我们需要创建一个ROS2工作空间。

# Create workspace
mkdir -p ~/ros2_workspace/src
# Go to your workspace src
cd ~/ros2_workspace/src

2.获取功能包

这时需要获取软件包。在这里,我们以官方的demos软件包为例。

# Go to your workspace src
cd ~/ros2_workspace/src
# Download package
git clone https://github.com/ros2/demos.git -b humble

3.安装功能包依赖

当你将第三方分享的软件包放入工作空间时,这些软件包通常会有一些依赖关系。
如果缺少这些依赖关系,软件包将无法正常运行。此时,你需要安装这些软件包的依赖项。

rosdep 是ROS2中用于管理和解决ROS软件包的依赖关系的一个工具,能够识别和解决ROS软件包所需的各种系统和第三方软件包的依赖关系,完成依赖的安装和后续的更新。

在下面的命令中,我们使用rosdep工具来完成这个依赖的安装:

rosdepinstall–ignore-src–from-path src–rosdistro humble-y
ROS的依赖工具安装忽略已安装的包指定安装依赖路径指定ROS版本默认确认
# Install pip
sudo apt install -y python3-pip
# Install rosdep
sudo pip install rosdep
# Init rosdep
sudo rosdep init
# Update rosdep
rosdep update
# Go to your workspace
cd ~/ros2_workspace
# Install dependencies for package
rosdep install --ignore-src --from-path src --rosdistro humble -y

对于中国用户,可能会由于网络问题导致rosdep工具失效。在这种情况下,你可以尝试以下命令,使用rosdepc代替rosdep

# Install pip
sudo apt install -y python3-pip
# Install rosdepc
sudo pip install rosdepc
# Init rosdepc
sudo rosdepc init
# Update rosdepc
rosdepc update
# Go to your workspace
cd ~/ros2_workspace
# Install dependencies for package
rosdepc install --ignore-src --from-path src --rosdistro humble -y

当为工作空间中的软件包安装好相应的依赖项后,你将获得以下反馈:

All required rosdeps installed successfully

4.构建工作空间

在完成对依赖的更新后,你可以开始构建你的ROS2工作空间。

ROS2的构建系统

ROS2的构建系统包括三个核心概念:

  • 构建工具(Build Tool)
    构建工具是用于控制单个软件包的编译和测试的关键软件。在ROS2中,通常使用CMake来构建C++软件包,而对于Python软件包,通常使用setuptools。

  • 构建辅助工具(Build Helpers)
    构建辅助工具是用于增强开发者体验的辅助功能,它们与构建工具交互,简化构建,可以试做在基本的构建工具上又封装了一层。
    在ROS2中使用名为ament的构建辅助工具。当一个软件包被标记为ament包时,这意味着它是一个独立的软件单元,由package.xml清单文件描述,包括源代码、构建文件、测试、文档以及其他资源。
    举例来说,如果一个软件包是“ament CMake包”,那么它将使用CMake来构建并符合ament包的规范。

  1. 通用构建工具(meta-build Tool)
    通用构建工具是用户在ROS2中直接交互的表层构建工具。
    它是能够对一组软件包进行拓扑排序,并按正确的依赖关系顺序进行构建或测试的软件。它实际上是调用构建工具来执行编译、测试和软件包安装的工具。
    在ROS2中使用了通用构建工具,被称为colconcolcon是一个用于构建和测试多个软件包的命令行工具。如果你想深入了解colcon,可以查看colcon readme。

如果你希望深入了解ROS2的构建系统,可以参考ROS2构建系统
关于colcon构建工具的设计理念,可以参考ROS2设计:colcon

不过这些构建系统概念不需要深入了解或理解,只需要知道ROS2使用colcon工具进行构建即可。

  • 安装colcon
    如果你尚未安装 colcon,首先需要获取它。你可以执行以下命令:
sudo apt update
sudo apt upgrade
sudo apt install python3-colcon-ros
sudo apt install python3-colcon-common-extensions
  • 编译工作空间
    随后你可以开始编译整个工作空间:
# Go to workspace
cd ~/ros2_workspace
# Build the workspace
colcon build

一旦编译成功,你的执行文件将位于工作空间的 install 目录下。由于 Python 是解释性语言,因此会在 install 目录中创建一份拷贝。ROS 会执行 install 目录中的内容。如果你不重新编译,ROS 执行的内容将不会更新,因为它将使用 install 目录中的拷贝版本。

  • 特殊需求:单独编译包
    如果你只需要编译工作空间中的某个特定包,你可以使用 --packages-select 后缀来节省时间。例如:
colcon build --packages-select package_name
  • 特殊需求:使用符号链接安装
    如果你希望在修改 Python 脚本后无需每次重新构建工作空间,你可以使用符号链接安装选项 --symlink-install。但请注意,这可能会导致代码不兼容问题,如果出现无法正常运行的情况,建议使用常规的 colcon build。同时,不建议混合使用两种方式。
colcon build --symlink-install

相关原理:
使用 colcon build --symlink-install 进行构建时,Colcon 不会将软件包的文件复制到安装目录,而是在安装目录中创建符号链接,指向在构建目录中生成的实际文件。这些符号链接只包含文件的路径信息,而不是实际的文件数据。

这种方式可以节省磁盘空间,因为相同的文件可以在多个软件包之间共享,而不会多次复制相同的文件。此外,符号链接方式还使得在软件包的源代码发生更改时,安装的文件会自动反映这些更改,因为符号链接会指向最新生成的文件。

5. 编译异常的处理

如果在构建过程中出现异常情况,你可以尝试删除工作空间目录下的 buildinstalllog 文件夹,然后重新执行构建。这有时可以解决构建问题。
如果仍无法解决问题,则需要进一步考虑依赖、配置文件及代码自身是否存在问题。

6. 设置ROS2工作空间的环境变量

通常,source 命令用于立即生效最近的更改的初始化文件,而无需注销和重新登录。在设置工作空间的环境变量时,我们使用 ros2_workspace/install/setup.bash 文件来确保新生成的文件可以被正确调用。以下是具体的操作步骤:

# Go to your workplace
cd ~/ros2_workspace
# Run env set script
. install/setup.bash

自动环境变量设置

你也可以配置自动设置环境变量,使得每次打开终端时都能自动生效。以下是具体的步骤:

  1. 你可以使用 pwd 命令来查看当前目录的路径,以获取工作空间的目录路径。

  2. 然后,将以下命令添加到你的 .bashrc 文件中,替换其中的~/ros2_workspace为你的工作空间的这将自动设置 ROS2 环境变量,以便在每次打开终端时自动生效:

echo "source ~/ros2_workspace/install/setup.bash" >> ~/.bashrc

7.测试功能包的基本功能

尝试运行刚才下载的demos包中的案例:

ros2 run demo_nodes_py talker

在这里插入图片描述

关于工作空间更详细的内容可以参考ROS官方关于创建工作空间的教程

功能包

在ROS 2中,功能包(packages)是组织和管理机器人应用程序的基本单元之一,通常包含一组相关的功能和代码,用于实现特定的机器人任务或功能。
它们使机器人开发者能够组织、共享和重用代码,以便更容易开发和维护复杂的机器人应用程序。通过合理组织功能包,开发者可以更高效地开发各种机器人应用。

如图所示,ros2_learningros2_learning_interfaces是在工作空间的源码目录下的两个功能包。
在这里插入图片描述

功能包的特点

  • 模块化设计
    ROS 2鼓励开发者将功能包设计成可重用的模块,以便在不同的机器人项目中进行重复使用。这种模块化设计使得功能包可以更容易共享和扩展,从而提高了ROS 2的灵活性和可维护性。因此包通常以模块化的理念来设计。

  • 依赖关系友善
    ROS 2功能包可以依赖于其他功能包,这意味着它们可以使用其他功能包中的代码和资源来实现其功能。这种依赖关系允许开发者构建复杂的机器人应用程序,同时避免重复造轮子。

  • 代码组织规整
    ROS 2功能包包含了一组源代码文件、配置文件、启动文件、资源文件和其他所需的文件,这些文件用于实现特定的机器人任务或功能。这些文件通常按照一定的目录结构组织,以便开发者更容易理解和维护。

功能包的基本目录样式

在ROS2中,对于Python功能包,通常有以下目录结构:

my_python_package/package.xml # 功能包的元数据文件,包含名称、版本、作者、依赖关系等基本包信息setup.py # 定义python包的元信息,指定python入口点setup.cfg # 用于配置Python包的构建信息my_python_package/ # 存放代码的地方__init__.py # 空文件,用于标识该目录为Python模块目录my_node.py # 示例节点代码文件...launch/ # 存放ROS2启动文件的目录。启动文件用于启动和配置ROS 2节点和其他组件my_launch_file.launch.py # 示例启动文件resource/ # 用于存放功能包中的资源文件,通常用不上my_python_packagetest/...

在ROS2中,对于C++功能包,通常有以下目录结构:

my_cplusplus_package/├── CMakeLists.txt # CMake构建系统配置,描述如何在包中构建代码的文件├── package.xml # 功能包的元数据文件,包含名称、版本、作者、依赖关系等基本包信息├── include/ # 包含包的头文件的目录│   └── my_cplusplus_package/ # C++头文件目录│       └── my_node.hpp # ROS节点的头文件├── src/│   ├── my_node.cpp # 源码文件│   └── my_another_node.cpp # 源码文件2│   └── ...├── launch/ # 启动文件目录│   └── my_node_launch.py # ROS 2启动文件

创建功能包

python

如果你希望创建一个ROS2 Python功能包,请执行:

ros2 pkg create --build-type ament_python <package_name>

C++

如果你希望创建一个ROS2 C++功能包,请执行:

ros2 pkg create --build-type ament_cmake <package_name>

关于功能包的创建如果希望了解更多,可参考ROS官方关于创建功能包的资料。

ROS 2 功能包的命令行工具

在ROS 2中,有一些命令行工具可用于管理和操作功能包。以下是这些工具的介绍和用法。

列出功能包中的可执行文件

要列出特定功能包中的可执行文件,可以使用以下命令:

ros2 pkg executables packagename

这将返回指定功能包(packagename)中所有可执行文件的列表。你也可以指定包含文件后缀,以进一步过滤结果。

列出本地所有已安装的功能包

如果你想查看系统中所有已安装的功能包,可以使用以下命令:

ros2 pkg list

这将返回一个包含所有已安装功能包的列表。

  • 查找功能包的安装位置

要知道特定功能包的安装位置,可以使用以下命令:

ros2 pkg prefix packagename

这将输出指定功能包(packagename)的安装位置前缀。

获取功能包的清单描述信息

如果你需要查看功能包的清单描述信息,可以使用以下命令:

ros2 pkg xml packagename

这将返回指定功能包(packagename)的XML清单描述信息,其中包含有关功能包的详细信息。

跳转到包

ROS2支持和ROS1中roscd相似的colcon_cd,该命令colcon_cd允许您快速将 shell 的当前工作目录更改为包的目录,
将以下两个脚本写入~/.bashrc即可

echo "source /usr/share/colcon_cd/function/colcon_cd.sh" >> ~/.bashrc
echo "export _colcon_cd_root=/opt/ros/humble/" >> ~/.bashrc
colcon_cd your_package

在这里插入图片描述

具体的使用方式参考colcon_cd的使用,此处不涉及。

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

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

相关文章

品牌是如何通过软文推广产品的?媒介盒子为您揭秘

需求是概念的、抽象的&#xff0c;产品是具象的&#xff0c;多维的。软文推广就是通过发现消费者的需求来促使消费者主动购买产品&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;品牌是如何通过软文推广产品的。 一、 差异化内容打出独特点 差异化内容指通过和竞品的分析…

基于Intel Ai Analytics Toolkit 及边缘计算的溶氧预测水产养殖监测方案

基于AI的淡水养殖水质溯源、优化系统方案 前言一、关键需求及方案概述二、方案设计预测机制LSTM 模型基于intel AI 的时序水质分析模型与分类模型优化 三、实战分析1、方案简述2、数据分析预处理特征类型处理特征分布分析 3、特征构造4、特征选择过滤法重要性排序 5.构建LSTM模…

算法--最短路

这里写目录标题 xmind单源最短路简介所有边权都是正朴素的Dijkstra算法思想例子题解 堆优化版的Dijkstra算法 存在负数权Bellman-Ford算法思想例子题解 多源汇最短路简介 xmind 上述中&#xff0c;朴素Dijkstra算法适用于稠密图 其他用堆优化版 而SPFA算法一般都比Bellman-For…

设计模式:装饰者模式

目录 一、定义 二、场景 三、例子 四、优缺点 优点&#xff1a; 缺点&#xff1a; 一、定义 在不改变已有对象结构的情况下&#xff0c;动态添加新的功能到对象上&#xff0c;是继承的一种替代方案。属于结构型模式。 二、场景 1.扩展一个类的功能&#xff0c;添加附加职责…

七、ZooKeeper选举机制

目录 1、概念 2、全新集群选举 3、非全新集群选举 zookeeper默认的算法是FastLeaderElection,采用投票数大于半数则胜出

资料分析(花生)

基期A&#xff08;给出BR或BX&#xff09; 前期&#xff1a;代入、直除、假设分配隔年前期&#xff1a;求出间隔增长率&#xff0c;再变成第一类考法前期差值&#xff1a;假设分配法求得两个前期作差。 现期B 有增量求现期&#xff1a;求出 X&#xff0c;列不等式即可有增速求现…

【已解决】页内切换<router-view>使得url变化导致菜单高亮消失

在写项目时&#xff0c;我们常会用到侧边菜单栏&#xff0c;而具体页面中经常使用<router-view>切换子组件。 但是按照我们平时的写法&#xff0c;切换子组件后会导致url改变&#xff0c;从而使得菜单高亮消失&#xff0c;这是非常影响用户体验的。 所以&#xff0c;我…

class文件结构

文章目录 1. 常量池集合2. 访问标志3. 字段表集合4. 方法表集合5. 属性表集合 成员变量&#xff08;非静态&#xff09;的赋值过程&#xff1a;1. 默认初始化 2. 显示初始化/代码块中初始化 3. 构造器中初始化 4. 有了对象后对象。属性或者对象。方法的方式对成员变量进行赋值 …

无线网卡填坑记

没想到我安装无线网卡这么波澜起伏~ 起因 近来刚在电脑上玩完了 Dishonored 2&#xff0c;紧接着继续着我的刺客信条之旅。总是觉得键盘鼠标玩起来不爽&#xff0c;还是手柄玩这种游戏才舒服。突然&#xff0c;灵光一现&#xff0c;我想到正好有闲置的 Switch 掌机没怎么玩&am…

掌握Python Pingouin:数据统计新利器解析!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Pingouin库基于pandas、scipy和statsmodels&#xff0c;为用户提供了执行常见统计分析的功能。它支持各种统计方法和假设检验&#xff0c;例如 t-tests、ANOVA、correlation analysis 等。让我们看一些示例代码&…

请求函数的封装---工具函数

导出一个通用的请求工具函数&#xff0c;支持设置响应数据类型 支持不同接口设不同的响应数据的类型 import axios, { AxiosError, type Method } from axios// 4. 请求工具函数 const request (url: string, method: Method GET, submitData?: object) > {return insta…

【数据结构与算法篇】一文详解数据结构之二叉树

树的介绍及二叉树的C实现 一 . 树的概念二 . 相关术语三 . 树的表示四 . 什么是二叉树1> 二叉树的特性2> 特殊的二叉树3> 二叉树的性质 五 . 二叉树的存储结构1> 二叉树的顺序存储2> 二叉树的链式存储 六 . 堆1> 什么是堆2> 用堆存储数据3> 堆的Cpp代码…

木马病毒是怎么进入服务器的,要如何防范

木马病毒通常是基于计算机网络&#xff0c;基于客户端和服务端的通信、监控程序。名称来源于公元前十二世纪希腊和特洛伊之间的一场战争。能够在计算机管理员未发觉的情况下开放系统权限、泄漏用户信息、甚至窃取整个计算机管理使用权限&#xff0c;隐匿性高。 木马病毒的入侵方…

【恋上数据结构】哈夫曼树学习笔记

哈夫曼树 哈夫曼编码&#xff08;Huffman Coding&#xff09; 哈夫曼编码&#xff0c;又称为霍夫曼编码&#xff0c;它是现代压缩算法的基础 假设要把字符串 [ABBBCCCCCCCCDDDDDDEE] 转成二进制编码进行传输。 可以转成 ASCII 编码 (6569&#xff0c;10000011000101) &…

Python脚本模拟真实设备刷视频播放量、浏览量

简述 Python3脚本刷视频播放量 前情提示 系统:centOS7,8阿里云一折优惠云小站_专享特惠_云产品推荐-阿里云 宝塔8.x 一说 部分截图、链接等因过期、更换域名、MD语法等可能不显示,可联系反馈(备注好博文地址),谢谢❤带有#号、删除线、不操作、不执行字样的为提示或者…

C++学习之路(十九)C++ 用Qt5实现一个工具箱(用SQLite数据库来管理粘贴板数据)- 示例代码拆分讲解

上篇文章&#xff0c;我们用 Qt5 实现了在小工具箱中添加了《点击按钮以新窗口打开功能面板》功能。今天我们把粘贴板功能用SQLite数据库来管理&#xff0c;用SQLite来实现增删改查。下面我们就来看看如何来规划开发这样的小功能并且添加到我们的工具箱中吧。 老规矩&#xff…

基于51单片机多功能时钟闹钟系统

**单片机设计介绍&#xff0c;基于51单片机多功能时钟闹钟系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于51单片机的多功能时钟闹钟系统是一种基于单片机的电子设备&#xff0c;能够显示时间、设置闹钟、进行计时以及提…

随机链表的复制[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个长度为n的链表&#xff0c;每个节点包含一个额外增加的随机指针random&#xff0c;该指针可以指向链表中的任何节点或空节点。构造这个链表的深拷贝。深拷贝应该正好由n个全新节点组成&#xff0c;其中每个新节点的值都设为…

Hadoop学习笔记(HDP)-Part.18 安装Flink

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

sort by modulus of a complex number

描述 复数E包含实部x和虚部y, Exyi;E的模为: 输入n(<1000)和n对(x,y); 按模数升序对复合体进行排序&#xff0c;如果模数相等&#xff0c;则按输入顺序排序。 排序后输出n行of (x_i,y_i,mod_i)&#xff0c;保留2个十进制小数。 输入 输入n和n对(x,y); 输出 输出排序后的n行(…