【ROS2 入门】ROS2 创建工作空间

news2024/10/6 12:19:27

        大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从ROS1切换到ROS2,在上几篇中,我们一起了解ROS 2中很多基础概念,从今天开始我们逐步就开始利用ROS2的特性进行开发编程了。

        工作区(workspace)是包含ROS 2包的目录。在使用ROS 2之前,有必要在你计划使用的终端中source ROS 2安装工作空间。这使ROS 2的软件包可在该终端中使用。你还可以选择采购“覆盖”——一个辅助工作区,在那里你可以添加新的包,而不会干扰你已经source的现有ROS 2工作区”。

1.1 Source ROS 2 environment

source /opt/ros/eloquent/setup.bash

1.2 创建工作目录

最佳习惯是为每个新工作区创建一个新目录。名称不重要,但让它指示工作区的用途是有帮助的。让我们为“开发工作区”选择目录名dev_ws:

mkdir -p ~/dev_ws/src
cd ~/dev_ws/src

另一个最佳习惯是将工作区中的任何包放入src目录。上面的代码在dev_ws中创建一个src目录,然后CD到它。

1.3 clone 一个简单的测试工程

在clone之前,请确保您仍在dev_ws/src目录中。在的之后部分中,你将创建自己的包,但目前你将使用现有包练习如何将工作区放在一起。我们使用的现有软件包来自ros_tutorials存储库(repo)。如果您阅读了“初学者:CLI工具”教程,您将熟悉本回购中的一个软件包turtlesim。

入口:GitHub - ros/ros_tutorials: Code used in tutorials found on ROS wiki

 请注意目录列表上方左侧的“分支”下拉列表。克隆此repo时,添加-b参数,后跟与ROS2发行版对应的分支。

在dev_ws/src目录中,为正在使用的发行版运行以下命令:

git clone https://github.com/ros/ros_tutorials.git -b eloquent-devel

 我们可以进入这个包的目录,看到所有下载的子包

         前三个包被忽略;turtlesim是本回购协议中唯一实际的ROS 2包。现在,你已经用一个示例包填充了工作空间,但它还不是一个功能齐全的工作空间。需要首先解决依赖关系并构建工作区。

1.4 解决依赖关系(Resolve dependencies)

        在构建工作区之前,您需要解决包依赖关系。可能已经拥有所有依赖项,如果不希望构建在长时间等待后因为缺少依赖项而失败,最好做法是在每次检查依赖项。

从工作区的根目录(dev_ws)运行以下命令:

cd ~/dev_ws
rosdep install -i --from-path src --rosdistro eloquent -y

如果出现如下错误提示:

 

继续使用之前安装的时候提示使用的小鱼一键安装。

 

 完成后继续之前的建立依赖的命令,就可以成功了。

 如果您已经拥有所有依赖项,控制台将返回:

#All required rosdeps installed successfully

包在package.xml文件中声明其依赖关系。上面命令遍历这些声明并安装缺少的声明。后续可以在另一个教程中了解更多有关rosdep的信息。

1.5 使用colcon 编译工程

从工作区的根目录(dev_ws),现在可以使用以下命令构建包:

#进入根目录
cd ~/dev_ws
#编译
colcon build

编译过程中会有提示,因为之前我们安装过这个工程,现在编译,会有提示注意,这也是和之前ROS1有区别的地方,ROS2中可以使用覆盖的概念。

1、colcon build还可以带一些参数,这个做个分享:

  • --packages-up-to 只编译指定包,其所有依赖项,但不构建整个工作区(节省时间)

  • --symlink-install避免每次调整python脚本时都需要重新构建

  • --event-handlers console_direct+ 显示生成时的控制台输出(否则可以在“log”目录中找到)

构建完成后,在工作区根目录(~/dev_ws)中输入ls,您将看到colcon已经创建了新目录:

 install 目录是工作区的安装文件所在的目录,您可以使用它来源代码覆盖。这个和ROS1中有很大区别。

1.6 Source 环境变量覆盖(the overlay)

注意:在Source 之前,打开一个新的终端,与构建工作区的终端分开,这一点非常重要。在构建的同一终端中Source 覆盖层,或者同样在Source 覆盖层的地方构建覆盖层,可能会产生复杂的问题。

在新终端中,将您的主ROS 2环境作为“底层”,以便可以在其上构建覆盖层:

#新终端,不是构建终端 设置环境变量
source /opt/ros/eloquent/setup.bash
#进入工作根目录
cd ~/dev_ws
#执行覆盖
. install/local_setup.bash

执行local_setup只会将系统中可用的包添加到您的环境中。local_setup提供了允许使用这两个工作空间。因此,像刚才所做的那样,获取主ROS 2安装的设置,然后获取dev_ws覆盖的local_setup,与获取dev_w的设置是一样的,因为这包括创建它的底层环境。如果有很多个,交叉覆盖,就可能会出现一些问题。

现在,你可以在这个终端中运行你刚才编译的包了:

ros2 run turtlesim turtlesim_node

 但是,你怎么能知道这是正在运行的包,而不是系统自带的那个包呢?

你可以修改叠自己包中的turtlesim,以便可以看到效果:

 可以看到本地的优先于系统的。

我是在启动文件最开始增加了一句打印:

cd ~/dev_ws/src/ros_tutorials/turtlesim/src

vim turtlesim.cpp

 

1.7 官方提供的修改窗口标题的方法验证

上面为了验证,谁的优先,我自己增加了打印,官方提供的事修改窗口名称的方法,我就一并也分享给大家:

cd ~/dev_ws/src/ros_tutorials/turtlesim/src

 

vim turtle_frame.cpp

 

 重新编译:

#进入根目录
cd ~/dev_ws
#编译
colcon build

完事后,继续再新的终端测试:

我们用新的一个终端,运行系统自带的做对比:

 

以上就是我今天要分享的内容。纠错,疑问,交流: 911946883@qq.com

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

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

相关文章

【Linux】基础IO --- 系统级文件接口、文件描述符表、文件控制块、fd分配规则、重定向…

能一个人走的路别抱有任何期待,死不了 文章目录一、关于文件的重新认识二、语言和系统级的文件操作(语言和系统的联系)1.C语言文件操作接口(语言级别)1.1 文件的打开方式1.2 文件操作的相关函数1.3 细节问题2.系统级文…

【Go基础】加密算法和数据结构

文章目录一、加密算法1. 对称加密2. 非对称加密3. 哈希算法二、数据结构与算法1. 链表2. 栈3. 堆4. Trie树一、加密算法 1. 对称加密 加密过程的每一步都是可逆的 加密和解密用的是同一组密钥 异或是最简单的对称加密算法 // XOR 异或运算,要求plain和key的长度相…

PHP实现URL长连接转短连接方法总结

依据第二种算法,URL长连接转短连接实现方法如下:语言:PHP5.6服务器环境:LNMP假设:长连接地址:http://www.test.com/index.php短连接地址:http://t.test.com/六位code码第一步:利用sh…

Jupyter使用详解

Jupyter使用详解 本篇文章我们主要介绍Jupyter的使用与配置,本篇文章的主要内容如下: 什么是Jupyter notebookJupyter notebook的安装使用Jupyter notebook 什么是Jupyter notebook? Jupyter Notebook是一个Web应用程序,允许您…

在甲骨文云容器实例(Container Instances)上部署Oracle Linux 8 Desktop加强版(包括Minio,ssh登录等)

甲骨文云推出了容器实例,这是一项无服务器计算服务,可以即时运行容器,而无需管理任何服务器。 今天我们尝试一下通过容器实例部署Oracle Linux 8 Desktop加强版。 加强版里包括,Minio,ssh登录,OCI CLI命令行…

linux基本功系列之-rpm命令实战

文章目录前言🚀🚀🚀一. rpm命令介绍1.1 RPM包介绍1.2 rpm包的优缺点1.3 rpm包获取方式二. 语法格式及常用选项2.1 RPM安装常用参数2.2 rpm格式介绍三. 应用案例3.1 从本地安装软件包3.2 查询lrzsz的包有没有安装3.3 查询命令是哪个包安装的3.…

3.1(完结)Linux扫盲笔记

1. Linux环境下,输入密码,不回回显(*)。 2.普通用户的密码一定不要和root一样,root一定要安全级别更高。具体的添加账户和修改密码的操作,见蛋哥Linux训练营,第2课,30分钟处。 3.在最高权限(root)&#x…

java基础学习 day37 (集合)

集合与数组的区别 长度:数组长度固定,一旦创建完成,就不能改变。集合长度可变,根据添加和删除元素,自动扩容或自动收缩,(添加几个元素就扩容多少,删除几个元素就收缩多少&#xff0…

JMeter测试redis性能

JMeter测试redis性能前言插件使用说明前言 针对Redis的性能测试需求本身就比较小众,因为Redis的性能指标在官网已经给出了详细的数据。但是有时候我们仍然需要对redis进行性能测试,例如资源配置需求,参数调优对比,程序优化等场景…

树型结构——二叉数

之前就说过我们的数据结构分为两种,分别是线性结构和非线性结构,我们今天要学的第一种线性结构就是树型结构。 1. 树型结构 树型结构并非我们熟悉的重点,所以在这里只做了解。 概念: 树是一种非线性的数据结构,它是…

【人工智能原理自学】循环:序列依赖问题

😊你好,我是小航,一个正在变秃、变强的文艺倾年。 🔔本文讲解循环:序列依赖问题,一起卷起来叭! 目录一、“序列”二、代码实现一、“序列” 数据除了在空间上可能出现关联性外,也可…

nodejs在线教学网上授课系统vue367

目 录 摘 要 I Abstracts II 目 录 III 第1章 绪论 1 1.1课题背景 1 1.2研究意义 1 1.3研究内容 2 第2章 技术介绍 1 2.1 相关技术 1 1、 node_modules文件夹(有npn install产生) 这文件夹就是在创建完项目后,cd到项目目录执行np…

基于nodejs+vue驾校预约网站管理系统

系统分为用户和管理员,教练三个角色 目 录 第1章 绪论 1 1.1课题背景 1 1.2 背景意义 1 1.3 研究的内容 2 第2章 相关技术 3 第3章 系统分析 5 3.1可行性分析 5 3.2系统性能分析 6 3.3系统流程分析 6 3.3.1操作流程 6 3.3.2信息添加…

Cadence PCB仿真使用Allegro PCB SI生成电源地噪声报告SSN Report及报告导读图文教程

🏡《Cadence 开发合集目录》   🏡《Cadence PCB 仿真宝典目录》 目录 1,概述2,生成报告3,报告导读4,总结1,概述 SSN报告等效的电源和地噪声源报告。本文简单介绍使用Allegro PCB SI生成SSN报告的方法,及其要点导读。 2,生成报告 第1步,选择需要生成报告的网络,…

【绝密】大厂笔试题

👦个人主页:Weraphael ✍🏻作者简介:目前是C语言学习者 ✈️专栏:C语言刷题 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&…

微信支付账户更换实名认证微信钱包零钱余额还在吗?怎么更换微信钱包实名认证?

原文来源:https://www.caochai.com/article-4119.html 微信支付账户更换实名认证微信钱包零钱余额还在吗? 微信支付账户更换实名认证微信钱包的零钱余额将清空,因为更换微信钱包实名认证的前提条件是微信钱包零钱余额不能大于0元。所以&…

一周学习总结(2022.1.25)

文章目录前言本周任务完成情况1.《Vue.js的设计与实现》2.《计算机网络:自顶向下方法》3.组件库4.青训营笔记5.刷题总结前言 年前给自己定下了一组学习计划,安排了每天需要完成的事情。这里主要记录一下每周任务的完成情况。本周定制的任务主要围绕着《V…

DP初入门

目录 一、前言 二、DP概念 1、最少硬币问题 2、DP的两个特征 三、0/1背包(最经典的DP问题) 1、小明的背包1(lanqiaoOJ题号1174) 2、空间优化:滚动数组 1)交替滚动 2)自我滚动 一、前言…

C语言函数调用详解

所谓函数调用(Function Call),就是使用已经定义好的函数。函数调用的一般形式为:functionName(param1, param2, param3 ...);functionName 是函数名称,param1, param2, param3 ...是实参列表。实参可以是常数、变量、表…

【Java开发】Spring Cloud 10 :Stream消息驱动

官方定义Spring Cloud Stream 是一个用来为微服务应用构建消息驱动能力的框架。它为一些供应商的消息中间件产品提供了个性化的自动化配置实现,Spirng Cloud Stream 本质上就是整合了 Spring Boot 和 Spring Integration,实现一套轻量级的消息驱动的微服…