ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法

参考链接:中国大学MOOC中的机器人操作系统入门 https://www.icourse163.org/course/ISCAS-1002580008
古月居博客 www.guyuehome.com/
运行环境:Ubuntu18.04+ROS melodic

Catkin编译系统详解

我们原来编译C++文件的时候,一般会采用Linux 下的g++编译器,

通过 -O 选项来指定可执行程序的文件名。
但是当文件多的时候,一个一个的执行这个命令又太过于麻烦,所以人们开始使用Makefile来进行编译,当工程越来越大的时候,人们开始使用更为高效的工具,Cmake工具,以便能够管理更大型的项目。对于ROS这样的大体量的平台,采用的就是Cmake,并且ROS对CMake就行了扩展,给CMake套上了一个ROS的马甲,于是便有了Catkin编译系统。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第1张图片当我们执行完Catkin之后,Catkin编译系统会生成makefile,放在buile目录下,然后make刚刚生成的makefile文件,编译链接生成可执行文件,放在devel中。
注意 catkin编译的时候一定要在工作空间目录,在其他路径下会编译是会失败的
还有
编译完成之后,一定记得source 刷新环境变量
编译完成之后,一定记得source 刷新环境变量
编译完成之后,一定记得source 刷新环境变量
这是新手比较容易忘的事情,当初我就是在这里栽过不止一个跟头
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第2张图片

如果你没有刷新环境的话,就可能导致你的可执行文件无法打开。

ROS如何创建工作空间

ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第3张图片上面这个图片是ROS的工作空间的结构,其中,build和devel我们不需要自己创建,catkin命令会替我们完成这一切。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第4张图片当你的代码里,使用到的文件很多时,你也可以在SRC下面进行分类,接着在创建功能包。我们只需要在开始的时候,创建一个初始的文件路径,这个路径也是工作空间的最高层级。然后在这个路径下面创建一个src文件夹即可。
在这里插入图片描述
在这里我使用了mkdir指令来创建这个文件夹,你也可以选择在桌面新建文件夹,这两个效果是一样的,没什么区别。
在创建完成文件夹之后,我们就可以来初始化工作空间了。直接执行catkin_make命令就可以了。
在这里插入图片描述
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第5张图片在执行完catkin_make之后,我们发现,原来只有一个子文件的catkin_test1下,多了很多文件,代表着我们初始化工作空间成功了。
在很多教程中,大家可以看到catkin_init_workspace这条命令,用来作工作空间初始化的工作。

但是,catkin_init_workspace这个初始化命令,是以前的初始化命令,虽然ROS这个渣男同时支持catkin_make和catkin_init_workspace这俩个初始化命令,但建议大家现在直接使用catkin_make这个命令来完成初始化,虽然阿姨风韵犹存,可是我更爱年轻的小姐姐
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第6张图片

ROS如何设置环境变量的五种方式

讲完了工作空间,接下来就到了本文的重头戏了,如何设置环境变量。在我讲设置环境变量之前,先向大家介绍一个命令,env 命令,就是environment的缩写。env 命令用于显示系统中已存在的环境变量,大家可以试着在终端下,输入以下 env 看一下,这时就会把系统内的所有环境变量给显示出来,但是这个时候,大家想找到自己需要的环境变量会比较麻烦,所以,大家可以使用 env | grep * 命令,加了一个管道过滤之后,就可以只显示我们需要的环境变量了。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第7张图片
当我在终端输入 env | grep ROS之后,终端就会显示所有跟 ROS相关的环境变量。
在这些环境变量中,大家尤其要注意,ROS_PACKAGE_PATH= 这一行,这一行所代表的,就是我们接下来,要设置的环境变量。

source 设置环境变量

在我们catkin_make之后,可以在 catkin_test1路径下使用 source devel/setup.bash来设置环境变量,当你不在catkin_test1的路径下时,就要在devel前面加上相应的路径,使source能找到对应的setup.bash。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第8张图片当我们执行完source命令之后,可以发现 ROS_PACKAGE_PATH= 多了一个环境变量,而多的这个环境变量,就是我们刚刚设置的环境变量。
但是,我们刚刚这个命令,有个很大的缺点,就是我们 source 之后,只会在当前终端有效,当我们新打开一个终端之后,我们就必须要重新 source 一遍。
要想解决这个问题,就要看我们的第二个解决方案了。

使用export来修改环境变量

这条指令是 export ROS_PACKAGE_PATH=~/catkin_test1/src:$ROS_PACKAGE_PATH ,其中 catkin_test1代表的是路径,你也可以根据自己的路径情况做一下修改。这个命令和上一个命令很像,就是作用范围都只限于当前端口。
但是每开一个端口,都要重新更新一下环境,这确实有点麻烦,所以,接下来的三个办法,就可以让我们一劳永逸了。一次使用,终身有效。这效果,可比肾宝强多了,毕竟肾宝也要喝两瓶才可以长生不老。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第9张图片

使用 echo 追加命令来修改 .bashrc

bashrc文件主要保存个人的一些个性化设置,它是一个隐藏文件。并且 .bashrc 在每次打开新的终端时,都要被读取一次。
所以我们可以把我们刚刚那个命令,直接写入在.bashrc文件中,这样,在我们每打开一个端口的时候,source那个命令都会被执行一次。在将文件写入.bashrc文件的时候,常用的有两种方式
1.echo “source ~/catkin_test1/devel/setup.bash” >> ~/.bashrcROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第10张图片但是很神奇的是,当我执行完echo 命令之后,在用 env 查看环境变量的时候,发现环境变量根本没什么变化。。。。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第11张图片其实原因也很简单,因为我们没有重新的 source ~/.bashrc 。我们刚刚说过,.bashrc文件,是会在我们开启新终端的时候刷新的。像我们刚刚只是向 .bashrc 中追加命令之后,没有更新 .bashrc 文件的情况下,我们新追加的命令是无效的。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第12张图片
像我们这样,重新source 了 .bashrc之后,我们的环境变量就能被成功的加载了。

直接修改.bashrc文件

既然我们刚刚采用了echo 命令,来把source 命令追加到 .bashrc中,那我们何不更暴力一点,直接修改.bashrc文件,一步到位。
在我们,没有修改 .bashrc 文件的时候,我们用 gedit ~/.bashrc 命令,直接打开 .bashrc 文件,翻到最下面.发现 source 的命令只有一个,就是我们安装ROS的时候执行的。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第13张图片
当我们执行完 echo “source ~/catkin_test1/devel/setup.bash”>> ~/.bashrc
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第14张图片
我们发现,在最下面多了一行,而这一行,就是我们刚刚追加的命令。
这个时候,就要发挥我们程序猿的看家本领了,直接ctrl+c ,ctrl+v 一下,就变成了下面的样子。
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第15张图片
我们在用 env | grep ros 看一下现在的环境变量
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第16张图片发现我们的test2的环境变量也添加成功。
以上说的四种添加环境变量的方法,是我们使用ROS中,最常用的四个指令,足以应对绝大多数的情况,接下来我要说的这个指令,可能没那么常用,但我希望大家知道有这个方法,万一前四个都不行,你还有路可走。

修改devel中的_setup_util.py

新建一个工作空间,然后执行catkin_make之后,去到那个工作空间中,修改devel中的_setup_util.py文件
ROS放弃指南2:ROS创建工作空间及五种设置环境变量的方法_第17张图片注意 一定要修改CMAKE_PREFIX_PATH那一行,注意,是main函数里面的那个,在那一行中添加其它工作空间的路径。
在修改setup_util.py完成之后,然后将新建的工作空间添加到环境变量中,并且在 .bashrc中,只保留新建的那个工作空间的目录,ROS在查找环境变量的时候,就会根据_setup_util.py中的信息,去找到我们添加的其他工作空间

你可能感兴趣的:(ROS放弃指南,linux,ubuntu,c++)