ROS2入门教程—创建ROS2工作空间

ROS2入门教程—创建ROS2工作空间


  ROS2中的工作空间类似我们常说的概念——“工程”,是我们在ROS中开发具体项目的空间,所有功能包的源码、配置、编译都在该空间下完成。我们可能会同时开发多个项目,就会产生多个工作空间,所以工作空间之间也有一个层次的问题,类似于优先级的概念,比如不同工作空间中有同名的功能包,那运行的时候是启动哪一个呢?ROS默认是启动最上层的工作空间( overlay),上层工作空间中的功能包会覆盖( override)下层工作空间( underlay)中的同名功能包。所以有多个工作空间存在的时候,我们还需要注意设置工作空间的层次。本篇我们就来尝试下工作空间的创建和层次设置。

1 设置环境变量

  工作空间的层次是通过环境变量来配置的,简单来说:下一个配置的工作空间会放到上一个配置的工作空间之上。ROS2安装路径下的功能包一般会被我们设置为最下层的工作空间。所以我们在打开一个新的终端运行ROS2相关的命令之前,都需要设置环境变量:

source /opt/ros/eloquent/setup.bash

  当然,为了方便,可以把上述命令添加到.bashrc文件中。这样,每次打开新的终端就不需要再去source环境变量了,系统能够自动找到ROS2相关的环境。但是对于同时安装了ROS1和ROS2环境的系统,最好不要把source /opt/ros/eloquent/setup.bash命令和source /opt/ros/melodic/setup.bash命令写入.bashrc/etc/profile,不然会冲突。最好的做法是使用ros1时source /opt/ros/melodic/setup.bash,使用ros2时source /opt/ros/eloquent/setup.bash

2 创建一个新文件夹

  开发每一个项目的工作空间,最好是独立创建一个文件夹,文件夹的名字可以*定义,比如我们来创建一个开发用的工作空间,就叫做dev_ws

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

  这里的src就是未来放置所有功能包相关文件的位置。

3 克隆例程代码

  在克隆例程代码之前,确保当前终端所在的路径在dev_ws/src目录下。在后续教程中,我们将学习如何创建自己的功能包,但是现在我们先练习将现有功能包整合到已经创建的工作空间。我们将使用的功能包来自ros_tutorials仓库。通过前面的学习教程我们应该都很熟悉turtlesim这个乌龟模拟仿真器了,它就是该仓库中的一个功能包。

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

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

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

  现在,ros_tutorials已克隆到您的工作空间中。如果您现在查看dev_ws/src的内容,您将看到新的ros_tutorials目录。要查看ros_tutorials中的功能包,请输入以下命令:

ls ros_tutorials

  这将列举出您刚刚克隆的内容:

roscpp_tutorials  rospy_tutorials  ros_tutorials  turtlesim

  前面三个包可以忽略,turtlesim是这个仓库中唯一实际的ROS 2功能包。现在我们已经在工作空间中放置好了示例功能包,在编译运行之前,我们还需要配置好这些功能包的依赖。

4 解决依赖问题

  在创建好功能包之后,我们最好养成一个比较好的习惯,就是先解决所有功能包的依赖,不然未来编译运行都会有很多问题。ROS2也提供了自动化的依赖安装方式,需要我们在工作空间的根目录dev_ws下运行如下命令:

rosdep install -i --from-path src --rosdistro eloquent -y

  运行之后,会自动安装缺失的依赖,如果依赖全部满足的话,就会显示:

#All required rosdeps installed successfully

  这里需要注意一点,以上自动化安装依赖的前提是:每个功能包已经完整的将所依赖的包和库在package.xml文件中声明了。

5 编译工作空间

  接下来就可以编译代码啦,需要在工作空间的根目录dev_ws下运行:

colcon build

  编译完成之后,会输出如下信息:

Starting >>> turtlesim
[Processing: turtlesim]                             
Finished <<< turtlesim [50.0s]                         

Summary: 1 package finished [50.6s]

  colcon是ROS2的编译工具,类似于ROS1中的catkincolcon build后边还可以跟一些常用的参数:
   ∙ \bullet ∙ --packages-up-to 编译指定的功能包,而不是整个工作空间,从而节约编译时间
   ∙ \bullet ∙ --symlink-install 节省每次重建python脚本的时间
   ∙ \bullet ∙ --event-handlers console_direct+ 在终端中显示编译过程中的详细日志(也可以在log文件夹中找到)
  编译结束后,在dev_ws工作空间根目录下,可以看到有几个新创建的文件夹:

build  install  log  src

  其中的install文件夹就是未来运行所有节点启动文件和脚本的位置。

6 设置环境变量

  接下来需要重新打开一个终端,然后来设置dev_ws工作空间的环境变量。(请注意,打开一个新的终端,与编译工作区的终端分开,这一点非常重要,否则会产生非常复杂的问题。)

cd ~/dev_ws
. install/setup.bash

  install里有两个很类似的文件:local_setup.shsetup.sh,前者仅会设置当前工作空间中功能包的相关环境变量,后者还会设置该工作空间下其他底层工作空间的环境变量。现在我们就可以来运行dev_ws工作空间下的turtlesim功能包了:

ros2 run turtlesim turtlesim_node

  这时会有一个问题,ROS2安装的路径下有一个turtlesim功能包,这里又有一个turtlesim功能包,如何能确定现在运行的就是dev_ws里的turtlesim呢?不如我们来尝试修改下这个包,看下是否会有变化。

7 修改上层工作空间中的功能包

  通过编辑turtlesim窗口上的标题栏,可以在上层工作空间中修改turtlesim。为此,请在~/dev_ws/src/ros_tutorials/turtlesim/src中找到turtle_frame.cpp文件。使用首选文本编辑器打开turtle_frame.cpp。在第52行,您将看到函数setWindowTitle(“TurtleSim”)。将值“TurtleSim”更改为“MyTurtleSim”,如下所示,然后保存文件。

setWindowTitle(" MyTurtleSim");

  修改之后回到dev_ws路径下,再次colcon build编译,然后返回到第二个终端(设置了环境变量. install/setup.bash)运行:

ros2 run turtlesim turtlesim_node

  现在可以看到turtlesim窗口上的标题栏现在显示“MyTurtleSim”
ROS2入门教程—创建ROS2工作空间

  可见,当前运行的确实是dev_ws工作空间下的turtlesim包。如果再打开一个新终端,source环境变量:source /opt/ros/eloquent/setup.bash,然后执行以下命令:

ros2 run turtlesim turtlesim_node

  新弹出的乌龟模拟仿真器窗口如下所示:
ROS2入门教程—创建ROS2工作空间

  此时turtlesim窗口上的标题栏显示为“TurtleSim”

  所以在这里,dev_ws是上层工作空间,ROS2安装路径是下层工作空间,具体运行哪里的包,全看你在终端中如何设置环境变量了。好啦,这就是ROS2中工作空间的基本操作,大家需要熟悉工作空间的创建和编译,同时要理解工作空间层次的概念(主要是环境变量的作用)。

上一篇:在O(1)的时间删除链表的一个节点


下一篇:LeetCode 92. Reverse Linked List II - 链表(Linked List)系列题8