背景知识
工作空间指的是包含了ROS 2 应用包的文件夹。在使用ROS 2之前,需要在你将要进行工作的终端上,source你安装了ROS 2的工作空间。这使得ROS 2的应用包可以在所打开的终端上使用。
你还有一个选择是source一个上层工作空间,也就是第二工作空间。第二工作空间指的是你添加了一些新的包,但是它跟已经有的ROS 2 工作空间不存在接口。你的基础工作空间必须要包含有你的上层工作空间所需要的全部依赖。你的上层工作空间中的包会覆盖掉基础工作空间的同名应用包。这里也是可能存在多个层工作空间重叠的情况,每一个上层的工作空间都会使用到它的父工作空间的内容。
前提条件
- 安装ROS 2
- 安装colcon
- 安装git
- 安装turtlesim
- 安装rosdep
- 能理解基础的终端命令(Linux基础教程)
- 你喜欢的文本编辑器
任务
1. source ROS 2 环境
source ROS 2的基础工作空间可以使用下面的命令:
source /opt/ros/foxy/setup.bash
如果上面的命令不能正常工作,那么具体的命令会跟你的安装方式有关,可以参考:ROS 2环境配置
2. 创建一个新的文件夹
最好是为每一个新的工作空间创建一个新的文件夹。名字不重要,但是它可以帮助你区分不同目的的工作空间。我们选择将工作空间的 名字成为dev_ws
,意思是开发工作空间。执行类似下面的命令:
mkdir -p ~/dev_ws/src
cd ~/dev_ws/src
另外一个好的习惯是,将你的工作空间中所有的包都放在src
文件夹下。上面的代码在dev_ws
下创建一个src
文件夹,并且进入到该文件夹下。
3. 克隆一个例程的仓库
在你克隆之前,确认你还在dev_ws/src
这个文件夹下。
在接下来的入门级教程中,你将会创建你自己的包,但是现在,你将练习使用已经有的包组成一个工作空间。
你将要使用的已有的包是来自ros_tutorials
仓库的。如果你已经看过ROS2专利之前的教程,已经对turtlesim这个包已经很熟悉了,它就是在这个仓库中的其中一个包。
你可以再GitHub上看到这个仓库。
注意看文件夹列表左上方的“分支”的下拉菜单。当你克隆这个仓库的时候,通过在命令后面增加-b
参数,后面再跟上与你的ROS 2版本想对应分支的名称。
在dev_ws/src
这个文件夹下,运行对应你正在使用ROS 2版本的命令:
git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
比如,如果你正在使用Foxy:
git clone https://github.com/ros/ros_tutorials.git -b foxy-devel
现在,ros_tutorials
已经克隆到你的工作空间。如果你查看dev_ws/src
在的内容,你会看到新的叫ros_tutorials
的文件夹。
为了查看在ros_tutorials
中的文件夹,你可以输入下面的命令:
ls ros_tutorials
这将会返回你刚刚克隆的内容,大概类似:
roscpp_tutorials rospy_tutorials ros_tutorials turtlesim
前面三个包都被忽略了,turtlesim
是这个仓库唯一真实的ROS 2 包。
现在你已经在你的工作空间中新增了一个例程的包,但是这还不是一个完整的工作空间,你还需要解决工作空间的依赖问题,并且构建这个工作空间。
4. 解决依赖
在构建工作空间之前,你需要解决应用包的依赖问题。你可能已经安装了所有的依赖,但是最好的操作还是每次克隆了仓库之后都检查一遍依赖。你大概是不希望因此缺少依赖,导致你等待了很长的时间之后,构建失败了。
在你工作空间的根目录(dev_ws
),运行下面的命令:
rosdep install -i --from-path src --rosdistro foxy -y
如果你是通过源码或者”fat“包将ROS2安装到你的Linux上,你将需要用它们的安装指南中提到的rosdep命令。下面是分别是源码的rosdep部分以及”fat“archive的rosdep部分。
如果你已经有了全部的依赖,终端的窗口会返回下面的信息:
All required rosdeps installed successfully
应用包会将它们的依赖声明在package.xml文件中。这个命令会遍历那些声明,并且安装那些缺少的依赖。
5. 使用colcon构建工作空间
在你的工作空间的根目录(dev_ws
),你可以通过下面的命令来构建你的包:
colcon build
命令行的窗口会返回下面的消息:
Starting >>> turtlesim
Finished <<< turtlesim [5.49s]
Summary: 1 package finished [5.58s]
备注:
colcon build
还有一些有用的参数:
--packages-up-to
用来构建你想要构建的包,已经它的全部依赖,但是不会构建整个工作空间(节省时间)。--symlink-install
可以让你不需要在每次稍微调整了你的python脚本之后都要重新构建。--event-handlers console_direct+
构建的过程中,在窗口中显示输出。否则的话,可以在log文件夹中找到。
一旦构建结束,在工作空间的根目录中输入ls
,你可以看到colcon已经创建了新的文件夹:
build install log src
你的工作空间的setup文件会在install
文件夹中,你可以用这个setup文件来source你的上层工作空间。
6. source上层工作空间
在你source上层工作空间之前,一件很重要的事情是你需要打开一个新的终端,跟你构建工作空间的那个终端分隔开。在你构建上层工作空间的终端中source上层工作空间,或者反过来,在source了上层工作空间的终端里面构建上层工作空间,都可能引起复杂的问题。
在一个新的终端中,source你的主要的ROS2环境作为基础工作空间,然后你就可以在它上面构建上层工作空间:
source /opt/ros/foxy/setup.bash
去到你的工作空间的根目录:
cd ~/dev_ws
在根目录中source你的上层工作空间:
. install/local_setup.bash
备注
source上层工作空间的local_setup
只是只会将上层工作空间的包增加到你的环境中。sourcesetup
的话,则会将上层工作空间以及基础工作空间的应用都添加到你的环境中,允许你同时使用两个工作空间的应用包。
因此,source你安装的主要ROS2的setup
,然后像你刚刚做的那样,source上层工作空间dev_ws
的local_setup
,跟仅仅source dev_ws
的setup
是一样的效果,因为这样做环境中也会包含用于创建上层工作空间的基础工作空间。
现在,你可以从上层工作空间中source turtlesim
包了:
ros2 run turtlesim turtlesim_node
不过,你如何可以确定,这个turtlesim是来自上层工作空间的,而不是你安装到主环境中的turtlsim呢?
让我们修改上层工作空间中的turtlesim,这样你就可以看到相关的效果了:
- 你可以修改然后重新构建上层工作空间的包
- 上层工作空间相比于基础工作空间具有更高的优先级
7. 修改上层工作空间
你可以通过编辑turtlesim窗口的标题栏来修改你的上层工作空间中的turtlesim。为了做到这个,首先在 ~/dev_ws/src/ros_tutorials/turtlesim/src
这个路径下找到turtle_frame.cpp
这个文件,然后用你喜欢的文本编辑器打开它。
在第52行,你可以看到 setWindowTitle("TurtleSim");
这个函数,将"Turtlesim"
这个值改变为"Myturtlesim"
,然后保存文件。
回到第一个终端,也就是你运行colcon build
的终端,把这个命令再运行一次。
回到第二个终端,也就是你source了上层工作空间的终端,然后将turtlesim在运行一次:
ros2 run turtlesim turtlesim_node
你将会看到窗口的标题栏现在显示的是“MyTurtleSim"。
虽然在这个终端启动的时候,你也source了ROS2的环境,但是位于dev_ws
环境下的上层工作空间比基础工作空间的内容具有更高的优先级。
为了验证你的基础工作空间的内容依然是可以用的,你打开一个全新的终端,然后仅仅是source的你ROS2的安装目录,然后运行turtlesim:
ros2 run turtlesim turtlesim_node
你可以看到修改过的上层工作空间并没有影响基础工作空间中的任何内容。
总结
在这个教程中,你通过source你所安装的ROS版本作为基础工作空间,并且通过克隆和构建软件包在一个新的工作空间中创建了一个上层工作空间。正如你从修改过的turtlesim中所看到的,这个上层工作空间被前置在环境变量中,对基础工作空间具有优先权。
标签:入门,source,工作,空间,turtlesim,ROS,上层 From: https://blog.51cto.com/u_16018714/6570967