workspace(工作空间)是包含ROS2 packages(包)的文件夹。在使用ROS 2之前,有必要在终端中source一下ROS 2的安装工作区,这样就可以在该终端中使用ROS 2的软件包。

还可以source一个“overlay”(一个次级工作区,在这里可以添加新的包,而不会干扰正在扩展的现有ROS 2工作区),或者“underlay”。underlay必须包含overlay中所有包的依赖关系。overlay中的包将覆盖underlay中的包,也可以有多个overlay和underlay,每个连续的overlay使用其父underlay的包。

1.Source ROS2环境

在本例中,主要的ROS2的安装文件为underlay(请记住,一个underlay不一定是主要的ROS2安装文件)。

将ROS2添加到环境变量中,可以参考:配置ROS2环境

2.创建一个新文件夹

在工程项目中最好的做法就是,为每个新工作空间创建一个新文件夹。名称并不重要,但是用它来表示工作区的用途是很有帮助的。创建文件夹名为dev_ws(development workspace):

  1. mkdir -p ~/dev_ws/src
  2. cd ~/dev_ws/src

另一个实践经验是将工作空间中的任何包放到src目录下。上面的代码在dev_ws中创建了一个src目录,然后进入其中。

3.Clone一个简单项目

现在使用来自ros_tutorials存储库(repo)中现有的包对工作空间进行了解,以后会创建自己的包。

dev_ws/src目录下,执行以下命令:

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

现在工作空间中克隆了ros_tutorials,查看dev_ws/src的内容,将看到新的ros_tutorials目录。

要查看ros_tutorials中的包,输入以下命令:

  1. ls ros_tutorials

终端返回:

  1. roscpp_tutorials rospy_tutorials ros_tutorials turtlesim

忽略前三个包,turtlesim是这个仓库中唯一一个真正的ROS2包。

现在已经使用示例包填充了工作区,但它还不是功能齐全的工作空间,需要首先解析依赖项并编译工作空间。

4.解析依赖

在编译工作空间之前,需要解析包依赖项。可能已经拥有了所有依赖项,但是实践经验告诉我们最好是在每次克隆时检查依赖项。这样不会在长时间的等待之后,由于缺少依赖项而导致编译失败。

在工作空间空间(dev_ws)的根目录下,运行以下命令:

  1. rosdep install -i --from-path src --rosdistro foxy -y

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

  1. #All required rosdeps installed successfully

包在package.xml文件中声明它们的依赖关系,此命令遍历这些声明,并安装缺少的依赖。

5.使用colcon编译工作空间

在工作空间的根目录下(dev_ws),可以使用以下命令编译包:

colcon build

此时,终端返回:

  1. Starting >>> turtlesim
  2. [Processing: turtlesim]
  3. Finished <<< turtlesim [50.5s]
  4. Summary: 1 package finished [50.7s]

注意:

colcon build有许多有用的参数:

  • --packages-up-to构建你想要的包,加上它的所有依赖项,但不是整个工作空间(节省时间)

  • --symlink-install使你在每次调整python脚本时都不必重新编译

  • --event-handlers console_direct+在编译时显示控制台输出(同样可以在log目录中找到)

一旦编译完成,在工作空间根目录(~/dev_ws)下输入ls(显示所有内容),会发现colcon创建了新的文件夹:

  1. build install log src

install目录里面包含工作空间的配置文件,可以使用它来source ‘overlay’。

6.source overlay

在source overlay之前,打开一个新的终端,与编译工作空间的终端分开,这是非常重要的。在编译的同一终端中source overlay,或者类似地在已经source overlay的终端中编译,这可能会产生复杂的问题。

在新终端中,将ROS 2环境作为“underlay”,这样就可以在它之上构建“overlay”:

  1. source /opt/ros/foxy/setup.bash

找到工作空间根目录:

  1. cd ~/dev_ws

在根目录下,source overlay:

  1. . install/local_setup.bash

注意:

source overlay的local_setup仅仅将overlay中可用的包添加到环境中,setup则将overlayunderlay一起添加到环境中,可以同时利用这两个工作空间。

所以,source ROS2的安装目录的setup,然后source dev_ws中的overlay的local_setup,与直接source dev_ws中的setup是一样的,因为它包含了underlay。

现在可以在overlay环境中,运行turtlesim

  1. ros2 run turtlesim turtlesim_node

但是怎么才能知道这是运行的overlay turtlesim,而不是主安装的turlesim ?

可以在overlay中修改turtlesim,这样就可以看到效果了:

  • 可以在overlay中修改和重建包(与underlay区分)。

  • overlay优先于underlay。

7.修改overlay

可以通过编辑turtlesim窗口的标题栏来修改overlay。为此,在~/dev_ws/src/ros_tutorials/turtlesim/src中找到turtle_frame.cpp文件。使用文本编辑器打开turtle_frame.cpp

在52行,可以看到函数setWindowTitle("TurtleSim");,将TurtleSim修改为MyturtleSim,并保存,然后使用colcon build重新编译。

返回到第二个终端(source overlay的)并再次运行turtlesim:

  1. ros2 run turtlesim turtlesim_node

将会看到turtlesim窗口的标题栏现在显示为“MyTurtleSim”。

尽管ROS2安装环境在此终端已经source过了,但是dev_ws环境的overlay优先于underlay的内容。

要检查underlay是否仍然完整,打开一个全新的终端,并只source ROS2的安装环境。再次运行turtlesim:

  1. ros2 run turtlesim turtlesim_node

可以看到,对overlay的修改实际上并没有影响到underlay的任何东西。

8.总结

在本例中,将ROS2的安装环境作为underlay,并通过在新的工作空间中克隆和编译包来创建一个overlay,overlay优先于underlay。

对于处理少量的包,建议使用叠加,这样就不必将所有东西都放在同一个工作区中,并在每次迭代中重新编译一个巨大的工作区。

如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。

都看到这了,点个推荐再走吧~

未经允许,禁止转载。

ROS2学习之旅(12)——创建工作空间的更多相关文章

  1. ROS2学习之旅(4)——理解ROS2 Graph中的节点

    ROS(2)图(ROS(2) graph)是一个同时处理数据的基于ROS2元素的网络,它包含了所有的可执行文件以及它们之间的连接.图中的基本元素包括:节点(nodes).话题(topics).服务(s ...

  2. ROS2学习之旅(13)——创建ROS2 功能包

    一个功能包可以被认为是ROS2代码的容器.如果希望能够管理代码或与他人共享代码,那么需要将其组织在一个包中.通过包,可以发布ROS2工作,并允许其他人轻松地构建和使用它. 在ROS2中,创建功能包使用 ...

  3. ROS2学习之旅(20)——创建一个动作消息

    本文用来自定义一个动作消息类型. 以下命令用来创建一个工作空间并建立一个功能包: mkdir -p action_ws/src cd action_ws/src ros2 pkg create act ...

  4. ROS2学习之旅(21)——创建一个动作服务和客户节点(C++)

    动作是ROS中的一种异步通信形式,动作客户端向动作服务器发送目标请求,目标服务器向操作客户端发送目标反馈和结果.本文基于前一篇自定义动作博文. 1.创建一个action_turtorials_cpp包 ...

  5. ROS2学习之旅(14)——编写简单的发布者和订阅者(C++)

    节点是通过ROS Graph进行通信的可执行进程.在本文中,节点将通过话题以字符串消息的形式相互传递信息.这里使用的例子是一个简单的"talker"和"listener& ...

  6. ROS2学习之旅(2)——配置ROS2环境

    目录 1.source一下setup文件 2.自动source 3.自动进入工作区(不常用) 4.检查环境变量是否设置成功 5.总结 ROS2依赖于使用shell(终端)环境组合工作空间的概念.工作空 ...

  7. ROS2学习之旅(15)——编写简单的服务和客户节点(C++)

    当节点使用服务进行通信时,发送数据请求的节点称为客户节点,响应请求的节点称为服务节点.请求和响应的结构由.srv文件决定. 本文的例子是一个简单的整数加法系统:一个节点请求两个整数的和,另一个节点响应 ...

  8. python学习之旅1-2(基础知识)

    三,python基础初识. 1.运行python代码. 在d盘下创建一个t1.py文件内容是: print('hello world') 打开windows命令行输入cmd,确定后 写入代码pytho ...

  9. ROS2学习之旅(1)——初识ROS2

    本系列用来记录ROS2的学习过程,有错误或者不合理的地方请大家指正.由于博主具有ROS1的学习经历,会添加一些与ROS1的一些对比,当然这对于ROS2本身的学习内容没有丝毫影响,欢迎大家积极与我在评论 ...

随机推荐

  1. 使用vue-i18n实现中英文切换(内含动态属性的绑定)

    最近做学生管理系统,因为有国外的学生,所以要进行中英文切换,查了查Vue中使用vue-i18n插件能够实现网页的中英文切换,学习内容如下: 一.下载vue-i18n插件 npm install vue ...

  2. 聊聊java工程师换工作那些事

    最近有个读者在苦恼一件事,那就是有大公司在挖他,他要不要从所在的小公司,跳槽到大公司,前提是两家公司的待遇基本一致.由这个问题结合自己多年的工作经验,来谈谈java工程师要不要跳槽,何时跳槽,怎么跳槽 ...

  3. CAP理论之思考

    分布式系统的最大难点就是各个节点如何保持一致.最近我在工作中就遇到这样的问题,不同节点之间,彼此通过API,进行通信,交互数据,但有些服务节点存在延迟等问题,导致我看到的并不是实时的数据,以及系统更新 ...

  4. JMeter逻辑控制器完整介绍

    JMeter逻辑控制器可以对元件的执行逻辑进行控制,就像编程一样,实现业务需求. JMeter包括了以下逻辑控制器: 一共17种.除了仅一次控制器外,其他控制器下可以嵌套别的种类的逻辑控制器. If ...

  5. CUDA C++编程手册(总论)

    CUDA C++编程手册(总论) CUDA C++ Programming Guide The programming guide to the CUDA model and interface. C ...

  6. 开发掉坑(二)前端静态资源 Uncaught SyntaxError: Unexpected token <

    某天,有同学反馈后台管理系统出现静态资源无法加载的问题. 复现如下: 进入首页. 点击侧边栏某个子功能,静态资源可正常访问到. 等待10分钟左右,点击侧边栏其他子功能,无法访问到静态资源. 查看控制台 ...

  7. 用 Flutter 和 Firebase 轻松构建 Web 应用

    作者 / Very Good Ventures Team 我们 (Very Good Ventures 团队) 与 Google 合作,在今年的 Google I/O 大会上推出了 照相亭互动体验 ( ...

  8. Java基础_循环嵌套_打印乘法口诀、菱形,各种图形,计算二元一次和三元一次方程组_7

    循环嵌套 打印乘法口诀 for(int j=1;j<=9;j++){ for(int i=1;i<=j;i++){ System.out.print(i+"*"+j+& ...

  9. MySQL笔记02(黑马)

    DDL操作数据库.表 操作数据库:CRUD C(Create):创建 创建数据库: create database 数据库名称; 创建数据库,判断不存在,再创建: create database if ...

  10. macOS 下使用命令行进行用户(组)管理,就是这么简单! dscl 你很有必要了解一下!!

    大家好,我是@小猿来也... Command-line interface to Directory Services. 在 linux 系统中我们习惯了使用 useradd,userdel,user ...