主要知识点:
1.src、build、devel、install各文件夹的功能介绍。
2.创建工作空间(创建文件夹,初始化工作空间)、编译工作空间、设置环境变量,检查环境变量
(echo $ROS_PACKAGE_PATH)
3.创建功能包:catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
4.编译功能包、工作空间的覆盖。
1.创建工作空间
工作空间(workspace)是一个存放工程开发相关文件的文件夹。
src:代码空间(Source Space)。放置功能包源码的代码空间。
build:编译空间(Build Space)。放置在编译过程当中产生的一些功能文件。
devel:开发空间(Development Space)。放置的是编译完成之后的可执行文件,环境变量配置的一些脚本。
install:安装空间(Install Space)。与devel类似,在ros2里面将其合成了一个文件夹。
接下来我们实际操作一下,创建一个工作空间。
a.创建工作空间:
创建一个名字为catkin_ws,在其文件夹内创建src文件夹放置功能包源码:
mkdir -p ~/catkin_ws/src
之后进入src文件夹下面,将其初始化为ROS工作空间:
1. cd ~/catkin_ws/src 2. catkin_init_workspace
之后的话会看到一个简单的日志回复。然后在这个src文件夹下面会有一个CmakeLists文件。这个文件会告诉系统,这个文件是一个ROS的工作空间。
之后的话我们就可以去编译这个工作空间。
b.编译工作空间:
编译是在工作空间的根目录下的,所以我们需要cd到工作空间的根目录下面对其进行编译
1. cd .. 2. catkin_make
上面的source activate kinetic命令是由于我的ROS装在anaconda里面,如果你没有装anaconda的话,可以直接忽略这个命令,然后,我的电脑报了一个错误:
是由于我们缺少包的原因,我们需要安装一下:
pip install catkin_pkg
之后再执行:
catkin_make
如果没有报错的话,就说明安装成功了。之后在我们的src目录下面就会生成两个文件夹build和devel。build文件里面是编译过程当中产生的中间文件;devel里面是编译过程当中产生的一些可执行文件和一些环境变量设置的脚本。
我们接下来需要设置环境变量。
c.设置环境变量:
因为我们需要在之后的学习过程当中需要linux系统知道我们功能包的位置,所以我们要设置环境变量,告诉系统功能包在哪里。这些路径的设置都是通过环境变量设置的。我们可以通过命令source来对其进行设置。
source devel/setup.bash
如果你使用的终端是zsh的话,那么你需要选择setup.zsh文件。这样的话我们的系统就会知道功能包是放在哪个文件夹下面的。
但是上述命令只是在当前终端里面会生效,如果我们新打开一个终端的话,这个环境变量依然会找不到。如果我们需要系统每次新打开一个终端都能找到相应的路径的话,我们需要将上述命令放入到终端的配置文件里面去。命令如下:
gedit ~/.bashrc
我们将会打开一个新的界面,在界面的最下面添加下面这句话:
source ~/catkin_ws/devel/setup.bash
之后保存退出就可以啦。使用以下命令使其在当前终端中生效:
source ~/.bashrc
我们接下来检查环境变量是否存在。
d.检查环境变量:
我们新打开一个终端,输入以下命令检查环境变量:
echo $ROS_PACKAGE_PATH
可以看到其生成了两个路径,一个是我们刚刚创建的功能包的路径,一个是ROS安装完成之后默认的一个工作空间路径。
我们接下来就可以在我们创建的工作空间下做具体的工作。
2.创建功能包
一个功能包就是我们实现机器人一个具体功能的单元。我们在功能包里面能够去创建具体的代码。创建功能包的命令格式如下所示:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
所表达的意思就是使用catkin_create_pkg,后面接上功能包的名字,还有此功能包依赖的其他一些功能包(这个可以有多个或者没有)。
创建功能包的命令要求我们在src文件目录下面去进行。
上述命令的意思就是创建一个名字叫做learning_communication的功能包,依赖三个功能包,一个叫做std_msgs:是ROS给我们定义好的一些标准的数据结构。rospy是ROS给我们提供的一系列的python接口。roscpp是ROS给我们提供的c++的编程接口。
进入我们刚刚创建的功能包里面,我们可以看到一些文件。在src里面是我们功能包里面一些具体的代码。incluude里面放置的是一些头文件。最重要的是CMakeList.txt和package.xml文件。这两个文件是所有功能包都必须具备的文件。CMakeList.txt里面是我们编译这个功能包的编译选项。package.xml放置的是描述这个功能包的一些具体信息。像名字,版本号等一些具体信息,还有这个功能包会具体依赖哪些功能包。
如果后期我们需要加一些功能包的依赖的话,我们都是在这个地方对其进行修改的。接下来我们我们需要编译这个功能包。
2.编译功能包
我们首先需要退出到工作空间目录里面,然后对其进行编译:
catkin_make
由于我们之前已经将我们的环境变量写入到文件当中去了,所以这里不用再次设置环境变量了。
这里还有要注意的一点是:在同一个工作空间下,不允许存在同名功能包的。不同工作空间下,允许存在同名功能包的。
既然存在同名的功能包,那么我们的ROS将会以什么样的顺序去查找呢?
我们首先查看一下ROS的环境变量,env是查看系统整个的环境变量,我们通过grep就能够查看只与ros有关的环境变量。
其中的:
ROS_PACKAGE_PATH=/home/zhiqianghe/catkin_ws/src:/opt/ros/kinetic/share
就是我们功能包会去查找的路径。当我们运行某个功能包的时候,我们会从上述这个路径依次向后查找。新设置的路径在ROS_PACKAGE_PATH中的最前端。
我的微信公众号名称:深度学习与先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究强化学习、计算机视觉、深度学习、机器学习等相关内容,分享学习过程中的学习笔记和心得!期待您的关注,欢迎一起学习交流进步!