ROS 2边学边练(12)-- 创建一个工作空间

        上一篇我们已经接触过工作空间的概念,并简单了解体验了一点构建包、测试包的流程,此篇会深入一点学习工作空间相关内容。

前言

       一个工作空间是包含了ROS 2的功能包的目录(文件夹),在使用ROS 2之前我们得激活一下目标工作空间的环境变量(source environment),这样我们才能在终端中正常的使用这些功能包。

        下面简单介绍下underlayoverlay这俩概念(其实也是借鉴了物理网络和逻辑网络的相关理念),后文会继续提到,不能装作看不到啊。

        在ROS 2的上下文中,underlay指的是ROS 2工作空间的基础层。它包含了ROS 2系统中常用和核心的软件包,通常是ROS 2安装的一部分或者是ROS 2发行版默认包含的一些软件包。而overlay则是一个可以添加新的包而不影响现有ROS 2工作区的工作空间(辅助工作空间,也可以叫第二工作空间);underlay中包含着overlay的依赖包;overlay中的包会覆盖underlay中的包。

        对于我们初学者来说,有点高深了,莫慌,咱边学边练,边学边掌握。

动动手

激活环境变量

        我们安装的主ROS工作空间可能就是underlay(ROS工作空间基础层),但是不要认为情况都是这样,主ROS工作空间不一定都是underlay,也有可能是由overlay(辅助工作空间)承担。

        我们通过下面的命令激活下环境变量:

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

创建一个新的目录

        我们最好为每一个新的工作空间创建一个新的目录文件夹,名字叫啥无所谓,但最好能突出该工作空间的目的。当然,我们也可以不必创建那么多新的工作空间,我们可以在一个工作空间的src路径下添加我们的各种目的功能包。由于上一篇我们已经创建了一个工作空间,下面创建的命令我们看一下就行。

$mkdir -p ~/ros2_ws/src
$cd ~/ros2_ws/src

下载示例

        上一篇我们已经通过git clone或下载zip的方式将官方提供的例子文件都弄到了ros2_ws/src文件夹下,现在我们即将再次clone一份例子到src文件夹下,执行下面命令(终端得cd到src路径下, -b的意思不是二进制版本啊小伙伴们(我就怕你们会这么想~),而是对应的ROS 发行版本(ROS branch,分支),因为不同版本都有对应的例子文件,会有些区别,不能搞岔了):

$git clone https://github.com/ros/ros_tutorials.git -b iron

       

        我们熟悉的小海龟例子就在turtlesim这个包里面(后面还是继续拿它说事),仓库中(githup上对应该例子的文件夹存储网络地址)另外三个文件夹包没有被编译,因为它们里面都包含了COLCON_IGNORE文件(无内容,空文件),在上一篇我们在最后曾经提到COLCON_IGNORE的事情。

        到目前为止,我们已经万事俱备,但是此时的工作空间还不是实际意义上的功能完整,我们还需解决一些软件包的依赖问题,等这东风也准备好了,我们就可以构建我们的工作空间了。

解决依赖项问题

        我们最好在构建工作空间之前养成检查依赖项的好习惯(虽然有时的确有点多余),如果工程很大,构建起来往往很费时,你不希望在等待一俩个小时之后给你回了个失败才意识到是依赖项不全的原因吧。

        首先终端进入到我们的工作空间根路径下再进行依赖项的工作:

$rosdep install -i --from-path src --rosdistro iron -y

如果返回#All required rosdeps installed successfully这样的字眼说明真的万事俱备了,如果你碰到了下面的情况,说明我们之前安装的东西还不全呐,根据它的提示逐项进行。

如果在安装更新的过程中出现下面的几种超时情况:

 

 那么要庆幸自己又有机会去解决一个陌生的问题啦。

解决rosdep update 超时问题

        其实原因大家也能猜个七七八八,git资源链接里面的https://raw.githubusercontent.com访问不了,还是不友好的网络环境导致。我主要参考了此篇文章才解决掉的,当然啦,网上的文章都是解决ROS 1的问题,我们是ROS 2,所以需要根据实际情况做些调整(比较少),步骤简述如下。

1. 将rosdistro clone到自己的家目录下(我的是/home/mike):
$git clone https://github.com/ros/rosdistro.git

 下载完成后(如果github clone失败请往上翻找到解决办法),我们检查下:

里面包含了很多ROS版本,包括我们的iron,那就对了;

2. 修改4个文件
2.1 20-default.list
$cd /home/mike/rosdistro/rosdep/sources.list.d/
$sudo gedit 20-default.list 

之前的内容是:

修改后的内容是:

2.2 gbpdistro_support.py
$sudo gedit /usr/lib/python3/dist-packages/rosdep2/gbpdistro_support.py

找到宏FUERTE_GBPDISTRO_URL,替换后的内容为:

FUERTE_GBPDISTRO_URL = 'file:///home/mike/rosdistro/' \'releases/fuerte.yaml'
2.3 rep3.py
$sudo gedit /usr/lib/python3/dist-packages/rosdep2/rep3.py

找到宏REP3_TARGETS_URL,替换后的内容为:

REP3_TARGETS_URL = 'file:///home/mike/rosdistro/releases/targets.yaml'
2.4 __init__.py
sudo gedit /usr/lib/python3/dist-packages/rosdistro/__init__.py

找到宏DEFAULT_INDEX_URL,替换后的内容为:

DEFAULT_INDEX_URL = 'file:///home/mike/rosdistro/index-v4.yaml'
3. 替换20-default.list

如果你之前执行过sudo rosdep init命令,那么在/etc/ros/rosdep/sources.list.d路径下会生成一个20-default.list文件,我们将第一步修改好的该同名文件覆盖掉/etc/ros/rosdep/sources.list.d/20-default.list即可:

sudo cp /home/mike/rosdistro/rosdep/sources.list.d/20-default.list /etc/ros/rosdep/sources.list.d/

最后我们再来执行一次rosdep update:

搞定!

        我们继续解决依赖项的问题,执行下面的命令(终端切换到工作空间根目录ros2_ws):

$rosdep install -i --from-path src --rosdistro iron -y

构建工作空间(用colcon)

还是保持在工作空间的根路径下(ros2_ws),执行如下命令进行构建:

$colcon build

因为我没有将ros2_ws/src路径下的examples文件夹删除,所以连同这次的都一块构建了,我们可以在安装ros2_ws/install路径下看到我们熟悉的turtlesim,

补充

colcon构建的其他有用参数:
--packages-up-to构建所需的包及其所有依赖项,但不是整个工作空间(以节省时间);
--symlink-install避免了每次调整python脚本时都需要重新构建;
--event-handlers console_direct+在构建时显示控制台输出(也可以在日志目录中找到);
--executor sequential顺序逐个处理包,而不是使用并行机制。

激活overlay空间

        我们重新打开一个终端(如果在刚才执行colcon build的终端执行source命令可能会引起莫名其妙的问题,大家可以试试看会有什么问题出现),通过老方法进行激活环境变量(可以在任何路径):

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

在工作空间ros2_ws下按照下面的命令激活overlay(会覆盖工作空间基础层underlay):

$source install/local_setup.bash

补充

        通过激活overlay的local_setup.bash仅会将overlay层中可用的功能包添加到环境中去,如果我们激活ROS 2安装路径下的setup.bash那么就是将underlay层中可用的功能包添加到环境中去,这样一来,我们就可以以激活脚本的不同而灵活使用两种工作空间了。

        因此,我们先激活ROS 2主安装路径下的setup.bash,再激活overlay层的local_setup.bash,就像我们上面做的那样,其实与我们直接激活ros2_ws路径下的setup.bash效果是一样的,那是因为ros2_ws路径下的setup.bash已经包含了underlay基础层的环境。(不大理解也没关系啊)

我们现在就可以启动小海龟节点了:

$ros2 run turtlesim turtlesim_node

        但是,目前会存在一个问题,我们在ROS 2刚开始的文章里已经运行过小海龟例子N遍了,那时游动的小海龟可是根正苗红,它就是我们在安装ROS 2时自带的(underlay基础层空间),而我们今天又创建了一个工作空间(overlay上层空间)ros2_ws,里面又构建了一个小海龟例子(到这个地方,是不是关于underlay和overlay的概念突然就清晰明了了),那我们启动的这个turtlesim_node节点到底是根正苗红underlay里面的小海龟呢还是ros2_ws(overlay里面)的小海龟呢???

        为了进一步明确这种问题,我们需要修改小海龟窗口上面的主题名称来区别。

修改overlay空间(ros2_ws)

        利用gedit打开ros2_ws/src/ros_tutorials/turtlesim/src/turtle_frame.cpp,找到第52行,将窗口标题修改成“MyTurtleSim”,你也可以取个其他与“TurtleSim”不一样的名字。 

修改完成之后我们重新构建一下功能包, 正好试用下上文提到的单独构建一个功能包的参数命令:

$colcon build --packages-up-to turtlesim

切换到执行过overlay空间中source install/local_setup.bash的终端 ,再次启动小海龟:

$ros2 run turtlesim turtlesim_node

我们在执行underlay空间source /opt/ros/iron/setup.bash命令的终端也启动小海龟:

通过上面的现象可以看到,overlay(ros2_ws)空间中的修改 并没有影响到underlay空间中的内容(如果在overlay那个终端重新source underlay的setup,露脸的是根正苗红还是?自己try下),你看,多好,距离产生美嘛。

        在平时的开发中,为了节省时间和环境资源,我们还是尽量使用overlay空间,因为没必要每次开发调试个别的功能包而加载所有的依赖和资源吧。

本篇完。

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

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

相关文章

Codeforces CodeTON Round 8(Div.1 + Div.2) A~E

A. Farmer John’s Challenge (模拟) 题意: 构造一个长度为 n n n的数组,将这些数组围成一个圈(顺时针)从任意一个位置打开,有且仅有 k k k个非降序排列的数组。 分析: k 1 k1 k1时,升序输…

如何删除 iPhone 上的 iCloud 激活锁

Apple 在 iPhone 上通过不同的安全屏障来保护您的数据。 iCloud 激活锁可阻止外部人员访问您的手机。您可以通过打开“查找我的 iPhone”功能来激活此锁。 使用安全协议似乎是无害的,直到你到达门的另一边。如果您购买了带有激活锁的二手 iPhone 或忘记了 iCloud 凭…

「精细化管理」某物业集团精细化管理咨询项目纪实

实现工作例行化、定时化、程序化与可视化企业重视绩效考核,却总感觉考核不到点上;企业重视规划职责,却总感觉部门间职责不清;企业重视激励,却总感觉难以真正激励员工。到底是哪里出了问题?华恒智信指出&…

win11安装WSL UbuntuTLS

win11安装WSL WSL 简介WSL 1 VS WSL 2先决要求安装方法一键安装通过「控制面板」安装 WSL 基本命令Linux发行版安装Ubuntu初始化相关设置root用户密码网络工具安装安装1panel面板指导 WSl可视化工具问题总结WSL更新命令错误Ubuntu 启动初始化错误未解决问题 WSL 简介 Windows …

【QT+QGIS跨平台编译】056:【pdal_kazhdan+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_kazhdan介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_kazhdan介绍 pdal_kazhdan 是 PDAL(Point Data Abstraction Library)相关的 Kazhdan 算法的实现。PDAL 是一个用于处理和分析点云数据的开源库,而 Kazhdan 算法通常…

C语言 | Leetcode C语言题解之第9题回文数

题目&#xff1a; 题解&#xff1a; bool isPalindrome(int x) {if(x < 0)return false;long int sum0;long int nx;while(n!0){sumsum*10n%10;nn/10;}if(sumx)return true;elsereturn false; }

LLaMA-Factory微调(sft)ChatGLM3-6B保姆教程

LLaMA-Factory微调&#xff08;sft&#xff09;ChatGLM3-6B保姆教程 准备 1、下载 下载LLaMA-Factory下载ChatGLM3-6B下载ChatGLM3windows下载CUDA ToolKit 12.1 &#xff08;本人是在windows进行训练的&#xff0c;显卡GTX 1660 Ti&#xff09; CUDA安装完毕后&#xff0c…

前端路径问题总结

1.相对路径 不以/开头 以当前资源的所在路径为出发点去找目标资源 语法: ./表示当前资源的路径 ../表示当前资源的上一层路径 缺点:不同位置,相对路径写法不同2.绝对路径 以固定的路径作为出发点作为目标资源,和当前资源所在路径没关系 语法:以/开头,不同的项目中,固定的路径…

【Godot4自学手册】第三十四节来回无限滚动的伤害铁刺球

本节主要学习给地宫添加来回滚动的铁刺球&#xff0c;铁刺球共有两个方向&#xff0c;一个是左右方向&#xff1b;另一个是上下方向。如果主人公不小心碰到球&#xff0c;就会收到伤害。这是地宫的第一个机关。 一、新建场景并布局节点 把我们准备好的铁球图片素材拖入到文件…

基于单片机的测时仪系统设计

**单片机设计介绍&#xff0c;基于单片机的测时仪系统设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机的测时仪系统设计是一个结合了单片机技术与测时技术的综合性项目。该设计的目标是创建一款精度高、稳定性强且…

【数据结构】复杂度(长期维护)

本篇博客主要是浅谈数据结构概念及时间复杂度&#xff0c;并做长期的维护更新&#xff0c;有需要借鉴即可。 复杂度目录 一、初识数据结构1.基础概念2.如何学好数据结构 二、复杂度1.复杂度2.时间复杂度①有限数的时间复杂度②函数的时间复杂度③二分查找时间复杂度④递归拓展练…

汇编语言作业(二)

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

ubuntu更换国内镜像源,下载增速

方法一&#xff1a;通过脚本更换源 1.备份原来的源 sudo cp /etc/apt/sources.list /etc/apt/sources_init.list 将原来的源保留一下&#xff0c;以后想用还可以继续用 2.更换源 sudo gedit /etc/apt/sources.list 使用gedit打开文档&#xff0c;将下面的阿里源复制进去&am…

Java零基础入门-java8新特性(完结篇)

一、概述 ​上几期&#xff0c;我们是完整的学完了java异常类的学习及实战演示、以及学习了线程进程等基础概念&#xff0c;而这一期&#xff0c;我们要来玩点好的东西&#xff0c;那就是java8&#xff0c;我们都知道java8是自2004年发布java5之后最重要且一次重大的版本更新&a…

走进车厂 | 移远通信以前沿车载技术,照亮智能网联汽车产业创新发展之路

无钥匙自动解锁方便快捷、实时路况导航精准高效、语音指令轻松控制车辆、车载娱乐系统丰富多样……随着智能化、数字化浪潮的不断推进&#xff0c;现如今的汽车出行焕然一新。 正如我们所见&#xff0c;汽车产业正在经历前所未有的变革。物联网、车联网等前沿技术的发展和应用&…

idea Springboot校园新闻系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 校园新闻发布系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&a…

ubuntu无法粘贴复制windows中的内容,分辨率无法自适应电脑自带系统

1、直接在命令行执行以下命令 sudo apt-get autoremove open-vm-tools //卸载已有的工具 sudo apt-get install open-vm-tools //安装工具open-vm-tools sudo apt-get install open-vm-tools-desktop //安装open-vm-tools-desktop 2、重启Ubuntu系统即可 3.如果上述…

mbti,ESTP型人格的心理问题分析

什么是ESTP型人格 ESTP分别代表外向&#xff0c;实感&#xff0c;理智&#xff0c;依赖&#xff0c;而ESTP型人格则是一种性格上十分激进&#xff0c;喜欢冒险&#xff0c;并且总是因为情绪起伏过大&#xff0c;而一下子做出应激行为的相对冒险的人格。具有ESTP型人格的人一般…

蓝桥杯 --- 日期问题模板

目录 1.如何判断闰年 2.如何遍历当前年份的每一天 3.如果想要输出某一年某一天到某一年某一天之间一共有多少天。 4.精确到具体周几到周几的问题分析 5.如何直接通过一层for循环枚举年月日 习题&#xff1a; 蓝桥杯竞赛特别喜欢考日期问题&#xff0c;今天给大家分享一下…

EfficientVMamba实战:使用 EfficientVMamba实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度&#xff0c;DP多卡&#xff0c;EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…