ROS2学习之旅(12)——创建工作空间
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):
mkdir -p ~/dev_ws/src
cd ~/dev_ws/src
另一个实践经验是将工作空间中的任何包放到src
目录下。上面的代码在dev_ws
中创建了一个src
目录,然后进入其中。
3.Clone一个简单项目
现在使用来自ros_tutorials
存储库(repo)中现有的包对工作空间进行了解,以后会创建自己的包。
在dev_ws/src
目录下,执行以下命令:
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
是这个仓库中唯一一个真正的ROS2包。
现在已经使用示例包填充了工作区,但它还不是功能齐全的工作空间,需要首先解析依赖项并编译工作空间。
4.解析依赖
在编译工作空间之前,需要解析包依赖项。可能已经拥有了所有依赖项,但是实践经验告诉我们最好是在每次克隆时检查依赖项。这样不会在长时间的等待之后,由于缺少依赖项而导致编译失败。
在工作空间空间(dev_ws
)的根目录下,运行以下命令:
rosdep install -i --from-path src --rosdistro foxy -y
如果已经拥有了所有依赖项,控制台将返回:
#All required rosdeps installed successfully
包在package.xml
文件中声明它们的依赖关系,此命令遍历这些声明,并安装缺少的依赖。
5.使用colcon编译工作空间
在工作空间的根目录下(dev_ws
),可以使用以下命令编译包:
colcon build
此时,终端返回:
Starting >>> turtlesim
[Processing: turtlesim]
Finished <<< turtlesim [50.5s]
Summary: 1 package finished [50.7s]
注意:
colcon build
有许多有用的参数:
-
--packages-up-to
构建你想要的包,加上它的所有依赖项,但不是整个工作空间(节省时间) -
--symlink-install
使你在每次调整python脚本时都不必重新编译 -
--event-handlers console_direct+
在编译时显示控制台输出(同样可以在log
目录中找到)
一旦编译完成,在工作空间根目录(~/dev_ws
)下输入ls
(显示所有内容),会发现colcon
创建了新的文件夹:
build install log src
install
目录里面包含工作空间的配置文件,可以使用它来source ‘overlay’。
6.source overlay
在source overlay之前,打开一个新的终端,与编译工作空间的终端分开,这是非常重要的。在编译的同一终端中source overlay,或者类似地在已经source overlay的终端中编译,这可能会产生复杂的问题。
在新终端中,将ROS 2环境作为“underlay”,这样就可以在它之上构建“overlay”:
source /opt/ros/foxy/setup.bash
找到工作空间根目录:
cd ~/dev_ws
在根目录下,source overlay:
. install/local_setup.bash
注意:
source overlay的local_setup
仅仅将overlay中可用的包添加到环境中,setup
则将overlay
和underlay
一起添加到环境中,可以同时利用这两个工作空间。
所以,source ROS2的安装目录的setup
,然后source dev_ws
中的overlay的local_setup
,与直接source dev_ws
中的setup
是一样的,因为它包含了underlay。
现在可以在overlay环境中,运行turtlesim
:
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
重新编译。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210714234056889-1048994704.png)
返回到第二个终端(source overlay的)并再次运行turtlesim
:
ros2 run turtlesim turtlesim_node
将会看到turtlesim
窗口的标题栏现在显示为“MyTurtleSim”。
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210714234056666-887160754.png)
尽管ROS2安装环境在此终端已经source过了,但是dev_ws
环境的overlay优先于underlay的内容。
要检查underlay是否仍然完整,打开一个全新的终端,并只source ROS2的安装环境。再次运行turtlesim:
ros2 run turtlesim turtlesim_node
![](https://img2020.cnblogs.com/blog/2418199/202107/2418199-20210714234056322-1951645242.png)
可以看到,对overlay的修改实际上并没有影响到underlay的任何东西。
8.总结
在本例中,将ROS2的安装环境作为underlay,并通过在新的工作空间中克隆和编译包来创建一个overlay,overlay优先于underlay。
对于处理少量的包,建议使用叠加,这样就不必将所有东西都放在同一个工作区中,并在每次迭代中重新编译一个巨大的工作区。
如果给您带来帮助,希望能给点个关注,以后还会陆续更新有关机器人的内容,点个关注不迷路~欢迎大家一起交流学习。
都看到这了,点个推荐再走吧~
未经允许,禁止转载。