【ROS2 入门】ROS2 创建工作空间
创始人
2024-05-17 05:07:55
0

        大家好,我是虎哥,从今天开始,我将花一段时间,开始将自己从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

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
【PdgCntEditor】解... 一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
修复 爱普生 EPSON L4... L4151 L4153 L4156 L4158 L4163 L4165 L4166 L4168 L4...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...