ROS2学习笔记11--工作空间的创建

Posted 鸿_H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记11--工作空间的创建相关的知识,希望对你有一定的参考价值。

概要:这篇主要介绍工作空间的创建

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现.

2.2.1创建工作空间(原文:https://docs.ros.org/en/foxy/Tutorials/Workspace/Creating-A-Workspace.html

>>教程>>创建工作空间

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

创建工作空间

目标:创建一个工作空间,学习如何配置以方便开发和测试.

课程等级:初级

时长:20min

目录:

1.背景
2.预备知识
3.步骤
3.1Source一下ROS2环境
3.2创建一个新的目录
3.3拉取一个简单的仓库
3.4解决依赖问题
3.5使用colcon构建工作空间
3.6 Source一下上层(环境变量)
3.7 修改上层
4.总结
5.下一步

1.背景

工作空间是包含ros2包的目录.在使用ros2之前,你应该准备使用的终端,source一下安装ros2的工作空间(也就添加ros2环境变量).这可以让你的终端找到ros2提供的包.

你也可以source一下上层,也就是第二个工作空间,你可以在上层添加一些新的包,但不干扰现有的你所拓展的ROS2工作空间,(该空间)又称为底层.你的底层一定包含上层所有包的依赖.上层包会覆盖底层包.很有可能有好几个上下层,并且每一个连续上层会使用其对应的底层包.

2.预备知识

ros2安装
colcon安装
git安装
turtlesim安装
rosdep安装
懂得基本的终端指令(linux常用指令指导http://www.ee.surrey.ac.uk/Teaching/Unix/
自己选择的文本编辑器

3.步骤

3.1Source一下ROS2环境

安装了ros2是本课程的前提.记住底层不单单只有ros2(还得有其他的).

记住,无论是通过发行版本还是源进行ros2安装,都得在你的平台source一下ros2环境变量,使用如下指令:

source /opt/ros/foxy/setup.bash

如果有些指令失灵了,可以查阅安装引导(https://docs.ros.org/en/foxy/Installation.html#installationguide

3.2创建一个新的目录

为了方便学习,每个工作空间都新建一个目录.命名不重要,但是最好说明这个工作空间的作用.这里选择一个dev_ws名字,表示开发型工作空间.

linux:

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

另一很好的练习就是拉取许多包到你工作空间的src目录下.在dev_ws下面创建src目录,把上面代码放到里面,并可以找到它.

3.3拉取一个简单的仓库

拉取前,确定你是在dev_ws/src目录.

(学习)初级开发教程之余,你将会创建自己的包,但现在你得练习使用现有的包构建一个工作空间.

现有的包,可以从ros_tutorials仓库(repo)来拿.如果你完成了"初级:命令行工具"教程,你会很熟悉turtlesim,它也是这个仓库的一个包.

你可以从github(https://github.com/ros/ros_tutorials/)查看这个包.

注意左边分支下拉列表上面的目录清单.当你拉取仓库时,增加-b参数使得拉取的分支对应你的ros2版本.

例如,你用的是foxy版本,在dev_ws/src目录,运行下面指令获取你用的ros2版本的包:

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包.

现在,你有一些简单包在工作空间里面,但是它还不是一个完整功能的工作空间.你需要解决依赖和重新编译这个工作空间.

3.4解决依赖问题

在编译工作空间前,你需要解决包的依赖问题.你或许已经有了这些依赖,但最好时刻检查一下你拉取的(内容)依赖.你总不会希望经过漫长的等待编译,结果因为缺少依赖导致失败.

在你工作空间的根目录(也就是dev_ws目录),运行下面指令:

linux:

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

如果你是在linux上从源或者"fat"归档(版本)安装ros2,你使用的rosdep指令应该从它们安装教程来.这里有从源安装(https://docs.ros.org/en/foxy/Installation/Ubuntu-Development-Setup.html#linux-development-setup-install-dependencies-using-rosdep)和从"fat"版本(https://docs.ros.org/en/foxy/Installation/Ubuntu-Install-Binary.html#linux-install-binary-install-missing-dependencies)的rosdep.

如果你的依赖齐全,控制台会返回:

#All required rosdeps installed successfully

包会在它们的.xml文件中声明依赖的(你会在下一节课学习包更多知识).这个指令会过一遍这些声明的依赖,并且会安装缺失的依赖.你会在另一个课程(快有了)了解更多rosdep.

3.5使用colcon构建工作空间

在工作空间的根目录(也就是dev_ws下面),使用下面指令编译你的工作空间:

linux:

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+:编译过程在控制台显示(否则只能在日志目录里面找来看了)

一旦编译结束,在工作空间根目录(~/dev_ws)输入ls,你可以看见colcon已经创建一个一些新目录:

build  install  log  src

这个install目录放的是工作空间的设置文件setup,也就是你用来source上层的(就是给系统传送工作空间环境变量).

3.6 Source一下上层(环境变量)

source一下上层之前,你应该新开一个终端,与你编译工作空间的终端分开.在你已编译或者正在的终端source一下上层的话,会导致一些麻烦事情发生.

在新终端,source一下ros2环境变量作为底层(ros2环境变量写到启动脚本的话,这步跳过),然后你就可以在上面建个顶盖住它了.

linux:

source /opt/ros/foxy/setup.bash

返回工作空间根目录:

cd ~/dev_ws

在根目录,source一下你的上层:

. install/local_setup.bash

注意:
source上层的local_setup仅是在你环境中增加上层可用的包.setup使你source了上层和下层,可以让你使用两个工作空间.

所以,source一下你的ros2安装配置文件,和dev_ws上层的local_setup,正如你刚才做的那样,如同也sourcedev_ws工作空间的配置,因为那波操作也包括了你创建的上层环境变量了.

现在,你可以在上层运行turtlesim包:

ros2 run turtlesim turtlesim_node

但是,你要怎么告诉,这是上层的turtlesim在运行,而不是主安装版本的呢?

让我们修改一下上层的turtlesim,你会看见这样效果:

你可以修改,并且不依赖底层来重编译上层包.

上层会优先底层.

3.7 修改上层

你可以修改上层turtlesim的仿真窗口的标题.为了完成这个,找到 ~/dev_ws/src/ros_tutorials/turtlesim/src路径下的turtle_frame.cpp文件.使用文本编辑器打开turtle_frame.cpp

52行,你会看见 setWindowTitle("TurtleSim"); 函数,修改”TurtleSim”参数成”MyTurtleSim”,保存文件.

返回你之前运行colcon build的终端,再运行一次(colcon build).

返回第二个终端(你source上层地方)然后再次运行turtlesim

ros2 run turtlesim turtlesim_node

你会看见turtlesim窗口标题变成了MyTurtleSim
图片.png
尽管ros2环境变量之前在这个终端也source了,但是上层dev_ws优先级高于底层的内容.

为了确认底层的还是没有影响的,新开一个终端,只是source一下底层的ros2环境变量,再次启动turtlesim

ros2 run turtlesim turtlesim_node

图片.png
你会发现上层的修改并没有给底层造成影响.

4.总结

在本课程,你source一下安装的ros2版本作为底层,然后在一个新工作空间拉取和编译一些包作为上层.上层的路径具有(执行的)优先权,正如上面修改turtlesim案例一样.

操作一些小包时,推荐使用上层,这样子,你就不用在同一个工作空间添加每一样东西,并且迭代更新不用再重编译一个巨大的工作空间.

5.下一步

现在,你认识了创建,编译工作空间,source工作空间环境变量的细节内容,你可以学习如果创建自己的包了.

其他

个人认为重点:

工作空间的创建,编译;依赖检查;环境变量设置;上下层工作空间的优先级.

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈

以上是关于ROS2学习笔记11--工作空间的创建的主要内容,如果未能解决你的问题,请参考以下文章

ROS2学习笔记15--创建自定义ros2接口文件msg和srv

ROS2学习笔记20--创建一个action

ROS2学习笔记0--ROS2:Foxy学习目录

ROS2学习笔记9--创建一个launch文件

ROS2学习笔记19--探索ros2doctor工具

ROS2学习笔记28--ros2环境下,多激光雷达启动的launch文件编写样式参考