ROS 2边学边练(11)-- colcon的使用

        从此篇开始我们即将进入client library系列,主要包含包的创建、主题、服务、参数、消息等功能的自定义实现,开始真正进入ROS的大门咯。

前言

        从ROS 1到ROS 2,对应的构建工具集由 catkin_make -> catkin_make_isolated ->catkin_tools -> ament_tools一直迭代到如今的colcon,我只使用过catkin_make,比如编写好一个功能包里面的文件时,我们可以catkin_make一下,再运行结果文件,相当于ROS的编译工具。

工作空间

        所谓的工作空间,简单理解其实就是一种特定结构组成的这样一种目录(一个文件夹下包含几个特定名称的子文件夹)。

        在ROS 2下,一个工作空间文件夹下存在四种同级的子文件夹,分别是:

src:ROS源代码存在的地方,后续我们要手动编写的源代码文件都会保存到这个地方;

build:在编译过程中生成的中间文件会保存在这个地方,其中还包含CMake文件;

install:源代码在编译之后会生成目标文件,这里就是这些最终编译完成的目标文件保存的地方,不同的功能包会在这里生成不同的子子文件夹用来存放各自的目标文件;

log:顾名思义,保存各种各样的日志信息。

从上面可以注意到,不同于catkin中的工作空间,这里面没有devel文件夹。

创建工作空间

        Linux下我们创建名称为ros2_ws的文件夹作为我们使用的工作空间,同时我们也必须手动在ros2_ws下创建src子文件夹,我们可以一条命令搞定:

$mkdir -p ros2_ws/src

-p是为了保证在创建src文件夹时如果其父目录不存在的情况可以自动先创建其父目录再创建目标子目录,通过tree命令可以查看这个目录的一个结构: 

src中添加例子 

我们通过如下命令将官方提供的例子保存到src路径下:

$git clone https://github.com/ros2/examples src/examples -b iron

如果不成功的话(国内的网络环境还是不友好哇),我这里提供几种解决方法:

1. 修改hosts文件内容

1.1 如果是在Ubuntu里面,我们sudo gedit /etc/hosts,在其最后添加如下内容保存即可:

140.82.113.4 github.com 199.232.69.194 github.global.ssl.fastly.net 185.199.108.153 assets-cdn.github.com 185.199.109.153 assets-cdn.github.com 185.199.110.153 assets-cdn.github.com 185.199.111.153 assets-cdn.github.com

1.2 如果是在Windows下, 在C:/Windows/System32/drivers/etc 找到hosts文件 ,同样在最后添加上面的内容保存即可;

2. 用谷歌浏览器(比Edge好用)直接进入资源页下载压缩包文件解压到src路径下(如果网络依然很费力的话可以考虑申请个免费的VPN,也方便我们其他科学上网需求),这种无需修改什么,只不过速度会慢一点,具体得看运营商的策略。

下载完成后的情况如下:

source an underlay

        这小节不太好翻译(自己理解的不够),就直搬原文了。

        对于我们现有的ROS 2安装,重要的是我们已经为其配置了环境,这将为我们的工作空间提供示例包所需的构建依赖项。这是通过配置由二进制安装或源代码安装提供的设置脚本来实现的,即另一个colcon工作空间(参见安装部分)。我们将这个环境称为基础层(underlay)。

        我们的工作空间ros2_ws将是现有ROS 2安装之上的一个上层(overlay)。一般来说,当您计划对少量包进行迭代时,建议使用上层,而不是将所有包都放入同一个工作空间中。

        对于underlay和overlay的解释大家可以参见下篇文章。此处只需留个印象就行。

        简单来讲,我们通过一个相对最上层顶级的setup脚本文件激活 ROS 环境变量,从而解决一些安装文件(可能多个子文件夹下的多种功能包)在编译及运行时的各种资源依赖问题。

构建工作空间

        我们在工作空间的根路径下(ros2_ws路径)执行如下命令构建安装刚刚下载好的例子:

$colcon build --symlink-install

--syslink-install命令的作用是当源码空间中的文件改变时,安装路径下的对应目标文件也能更快地自动更新(针对于python或其他非编译型语言源码文件)。

由于例子里面的内容比较多,构建完成的时间比较长(接近5分钟),工作空间下自动创建了build、install、log文件夹:

安装包整体测试

我们可以一键测试刚刚构建安装好的所有例程,如下:

$colcon test

同样需要花点时间,整体测试完成后,终端会打印出整体测试的结果:

可以看到,我们一共测试了22个功能包,其中14个包有给出标准错误输出信息(罗列出那些包),4个包测试失败(罗列出对应失败的包) 。

source环境变量

        下面我们将测试单独的包,在这之前我们得刷新下ROS的环境变量,将这些目标文件和库添加到相关的路径当中去,防止目标包文件在运行时由于各种依赖项或其他原因导致失败的情况。在install文件夹下,我们会找到一个setup.bash脚本文件,这个脚本文件会帮助我们将install文件夹下生成的所有目标包信息统一添加到环境变量中去(回忆下之前的小海龟例子,是不是也是每次新开一个终端后我们都要source一下setup.bash)。

$source install/setup.bash

 试试小demo

        既然准备工作都搞定了,我们找个主题订阅/发布的小例子来看看,它们分别是install下的examples_rclcpp_minimal_subscriber包和examples_rclcpp_minimal_publisher包,我们打开两个终端(新打开的终端依旧需要source),分别启动订阅节点subscriber_member_function和发布节点publisher_member_function:

$ros2 run examples_rclcpp_minimal_subscriber subscriber_member_function
$ros2 run examples_rclcpp_minimal_publisher publisher_member_function

 

创建自己的包 

        我们可以简单地执行ros2 pkg create来创建一个新包(后面需添加一些依赖的文件和库),具体可以跟哪些参数呢,我们执行ros2 pkg create -h来瞅瞅:

有一个必选项(包名称),剩下的都是可选项(比如构建类型可以选择cmake、ament_cmake、ament_python),这些选项内容我们可以通过例子中的package.xml文件进行了解。 

        我们可以在例子路径下(src/examples/rclcpp/topics/minimal_subscriber)找到这样一份package.xml(体现了该包的构建信息),内容如下:

<?xml version="1.0"?>
<?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
<package format="2"><name>examples_rclcpp_minimal_subscriber</name><version>0.18.0</version><description>Examples of minimal subscribers</description><maintainer email="aditya.pande@openrobotics.org">Aditya Pande</maintainer><maintainer email="alejandro@openrobotics.org">Alejandro Hernandez Cordero</maintainer><license>Apache License 2.0</license><author email="jacob@openrobotics.org">Jacob Perron</author><author>Mikael Arguedas</author><author>Morgan Quigley</author><author email="sloretz@openrobotics.org">Shane Loretz</author><buildtool_depend>ament_cmake</buildtool_depend><build_depend>rclcpp</build_depend><build_depend>rclcpp_components</build_depend><build_depend>std_msgs</build_depend><exec_depend>rclcpp</exec_depend><exec_depend>rclcpp_components</exec_depend><exec_depend>std_msgs</exec_depend><test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend><export><build_type>ament_cmake</build_type></export>
</package>

包含了版本信息、构建类型信息、包格式、源文件信息、构建/执行依赖库信息、测试 依赖库信息等等内容,本篇不再细究,后面会继续涉及。

设置colcon_cd

        colcon_cd命令可以方便我们从当前的工作目录切换到目标包的源文件目录 (当然也可以用cd命令),比如说我们想快速进入some_ros_package这个包目录,直接colcon_cd some_ros_package(如果用cd,还得回忆查找下各级路径的文件夹名称,稍显麻烦),我们就进入了~/ros2_ws/src/some_ros_package目录。

        为了让系统找到colcon_cd命令,我们得提前将colcon_cd的命令添加到系统的环境变量中去,一劳永逸的方法直接加入到永久性配置文件中,在终端执行如下命令:

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

上面的/usr/share/colcon_cd路径你得根据安装ROS 2时的实际路径来写,默认情况都是这个路径。 

设置colcon命令补全功能

        前提是你得安装了colcon_argcomplete包(安装了完整桌面版的ROS 2默认都是有的),我们可以将这个colcon自动补全功能添加到系统环境变量中去(其实默认已经全局使能了):

$echo "source /usr/share/colcon_argcomplete/hook/colcon-argcomplete.bash" >> ~/.bashrc

 补充

 1. 如果不想构建特定的包,请在目录中放置一个名为 COLCON_IGNORE 的空文件,该文件将不会被索引;

2.如果你想避免在 CMake 包中配置和构建测试,你可以添加参数:--cmake-args -DBUILD_TESTING=0;

3.如果你想运行某个包中的单独测试,你可以这样:

$colcon test --packages-select YOUR_PKG_NAME --ctest-args -R YOUR_TEST_IN_PKG

本篇完。

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

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

相关文章

Redis监控方案以及相关黄金指标提升稳定性和可靠性

Redis监控方案以及相关黄金指标提升稳定性和可靠性 1. 需要了解的词2. 「基准性能」相关指标2.1 Latency2.2 最大响应延迟2.3 平均响应延迟2.4 OPS(instantaneous_ops_per_sec)2.5 Hit Rate 3. 「内存」相关指标3.1 内存使用量(used_memory)3.2 内存碎片率(mem_fragmentation_r…

文件操作(详解)

该片博客有点长大家可以通过目录选择性阅读 这是个人主页 敲上瘾-CSDN博客 目录 1. 为什么使⽤⽂件&#xff1f; 2. 什么是⽂件&#xff1f; 2.1 程序⽂件 2.2 数据⽂件 2.3 ⽂件名 3. ⼆进制⽂件和⽂本⽂件&#xff1f; 4. ⽂件的打开和关闭 4.1 流和标准流 4.1.1 流…

【c/c++】深入探秘:C++内存管理的机制

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章我们详细讲解c中的动态内存管理 目录 1.C/C内存分布2.C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3.c内存管理方式3.1new/delete对内…

【how2j练习题】JS部分阶段练习

练习题 1 <!-- 练习&#xff1a;自定义一个函数&#xff0c;对数组进行排序&#xff0c;要求排序后没有重复数据 --> <script>function p(s){document.write(s);document.write("<br>");}function uniquel(arr){ var hash[];for(var i 0;i<arr.…

Java源值1.5已过时,将在未来所有发行版中删除

1、背景 确认java项目没问题&#xff0c;但是启动的时候&#xff0c;却报错&#xff1a;java: -source 1.5 中不支持 diamond 运算符 2、解决 2.1 2.2 2.3 2.4 2.5

拓数派向量计算引擎PieCloudVector助力东吴证券AIGC应用升级

1.项目背景 随着人工智能技术的不断创新和应用&#xff0c;我们可以看到人工智能在各个领域的应用越来越广泛。深度学习技术在图像识别、语音识别、自然语言处理等领域表现出色。机器学习算法的改进将解决更多实际问题&#xff0c;如增强学习、迁移学习和联合学习等&#xff0…

蓝桥杯 - 受伤的皇后

解题思路&#xff1a; 递归 回溯&#xff08;n皇后问题的变种&#xff09; 在 N 皇后问题的解决方案中&#xff0c;我们是从棋盘的顶部向底部逐行放置皇后的&#xff0c;这意味着在任何给定时间&#xff0c;所有未来的行&#xff08;即当前行之下的所有行&#xff09;都还没…

算法学习——LeetCode力扣动态规划篇9(1035. 不相交的线、53. 最大子数组和、392. 判断子序列、115. 不同的子序列)

算法学习——LeetCode力扣动态规划篇9 1035. 不相交的线 1035. 不相交的线 - 力扣&#xff08;LeetCode&#xff09; 描述 在两条独立的水平线上按给定的顺序写下 nums1 和 nums2 中的整数。 现在&#xff0c;可以绘制一些连接两个数字 nums1[i] 和 nums2[j] 的直线&#x…

matlab使用教程(33)—求解时滞微分方程(1)

1.时滞微分方程(DDE)的分类 时滞微分方程 (DDE) 是当前时间的解与过去时间的解相关的常微分方程。该时滞可以固定不变、与时间相关、与状态相关或与导数相关。要开始积分&#xff0c;通常必须提供历史解&#xff0c;以便求解器可以获取初始积分点之前的时间的解。 1.1常时滞 D…

【MATLAB源码-第176期】基于matlab的16QAM调制解调系统频偏估计及补偿算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 在通信系统中&#xff0c;频率偏移是一种常见的问题&#xff0c;它会导致接收到的信号频率与发送信号的频率不完全匹配&#xff0c;进而影响通信质量。在调制技术中&#xff0c;QPSK&#xff08;Quadrature Phase Shift Keyin…

LeetCode每日一题之专题一:双指针 ——复写零

复写零OJ链接&#xff1a;1089. 复写零 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 解法&#xff08;原地复写-双指针&#xff09;&#xff1a; 算法思路&#xff1a; 如果「从前向后」进⾏原地复写操作的话&#xff0c;由于 0 的出现会复写两次&#xff0c;导致…

java 数据结构 Map和Set

目录 搜索树 操作-查找 操作-插入 操作-删除&#xff08;难点&#xff09; Map Map 的常用方法 Set 哈希表 哈希函数 哈希冲突 冲突-避免-负载因子调节&#xff08;重点掌握&#xff09; 冲突-解决 冲突-解决-开散列/哈希桶(重点掌握) 实现HashBuck类 put方法 …

C#清空窗体的背景图片

目录 一、涉及到的知识点 1.设置窗体的背景图 2.加载窗体背景图 3.清空窗体的背景图 二、 示例 一、涉及到的知识点 1.设置窗体的背景图 详见本文作者的其他文章&#xff1a;C#手动改变自制窗体的大小-CSDN博客 https://wenchm.blog.csdn.net/article/details/137027140…

AI结合机器人的入门级仿真环境有哪些?

由于使用真实的机器人开发和测试应用程序既昂贵又费时&#xff0c;因此仿真已成为机器人应用程序开发中越来越重要的部分。在部署到机器人之前在仿真中验证应用程序可以通过尽早发现潜在问题来缩短迭代时间。通过模拟&#xff0c;还可以更轻松地测试在现实世界中可能过于危险的…

C# 登录界面代码

背景 MVVM 是一种软件架构模式&#xff0c;用于创建用户界面。它将用户界面&#xff08;View&#xff09;、业务逻辑&#xff08;ViewModel&#xff09;和数据模型&#xff08;Model&#xff09;分离开来&#xff0c;以提高代码的可维护性和可测试性。 MainWindow 类是 View&a…

【星计划★C语言】c语言初相识:探索编程之路

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;星计划★C语言、Linux实践室 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. ⛳️第一个c语言程序二. ⛳️数据类型2.1 &#x1f514;数据单位2.2 &…

哲♂学家带你深♂入了解动态顺序表

前言&#xff1a; 最近本哲♂学家学习了顺序表&#xff0c;下面我给大家分享一下关于顺序表的知识。 一、什么是顺序表 顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构&#xff0c;一般情况下采用数组存储。在数组 上完成数据的增删查改。 顺序表&#xff…

C++从入门到精通——入门知识

1. C关键字(C98) C总计63个关键字&#xff0c;C语言32个关键字 2. 命名空间 在C/C中&#xff0c;变量、函数和后面要学到的类都是大量存在的&#xff0c;这些变量、函数和类的名称都将存在于全局作用域中&#xff0c;可能会导致很多冲突。使用命名空间的目的就是对标识符的名…

PS从入门到精通视频各类教程整理全集,包含素材、作业等(8)复发

PS从入门到精通视频各类教程整理全集&#xff0c;包含素材、作业等 最新PS以及插件合集&#xff0c;可在我以往文章中找到 由于阿里云盘有分享次受限制和文件大小限制&#xff0c;今天先分享到这里&#xff0c;后续持续更新 B站-PS异闻录&#xff1a;萌新系统入门课课程视频 …

大模型论文阅读:ADAPTIVE BUDGET ALLOCATION FOR PARAMETEREFFICIENT FINE-TUNING

大模型论文阅读:ADAPTIVE BUDGET ALLOCATION FOR PARAMETEREFFICIENT FINE-TUNING 论文链接:https://arxiv.org/pdf/2303.10512v1.pdf 当存在大量下游任务时,微调所有预训练模型的参数变得不可行。因此,为了以参数高效的方式学习预训练权重的增量更新,提出了许多微调方法,…