【ROS第一讲】一、创建工作空间
- 一、工作空间
- 1.src:
- 2.build:
- 3.devel:
- 4.install:
- 二、创建工作空间
- 1.工作空间的编译
- 2.配置环境变量:
- 三、创建功能包
一、工作空间
1.src:
放置所有功能包源码的空间
2.build:
所有在编译过程中产生的中间文件(使用的较少)
3.devel:
存放的所有编译完的可执行文件,环境变量的配置脚本(常用)
4.install:
和devel有点重复,存放的都是编译完成的可执行文件,ros2中把install和devel合并为同一个文件夹了.
二、创建工作空间
1.工作空间的编译
依赖于catkin_make
工具,他的底层也是基于cmake的,只不过是基于cmake做了一点封装。
新建的工作空间内进行编译,并不会编译任何的代码(因为还没有写代码),只是会生成一些固定的文件:
2.配置环境变量:
配置ROS功能包的路径,使得ROS能够找到相应的环境包在什么位置。
可以用source devel/setup.bash
这句来配置环境变量。在当前中断下,输入该指令,就可以告诉ros系统相应的功能包在改catkin_ws工作空间中。
但是该指令仅在当前终端生效,另外开辟一个终端的时候就会失效。
所以推荐把该命令放在终端的配置文件中即可不用每次打开都运行一遍这个命令,配置文件的位置是在home的根目录下,是一个名为.bashrc
的文件脚本。
打开该脚本,在最后一行增加以下命令(即环境变量,功能包的路径名称): source ~/catkin_ws/devel/setup.bash
保存之后,运行命令:source -/.bashrc
即可让刚才的配置在终端生效。
- 可以用echo命令来打印出当前ros系统中的环境变量:
echo $ROS_PACKAGE_PATH
可以看到当前有两个环境变量路径,一个是刚刚添加的,一个是安装ros系统之后添加的,终端要寻找ros相应的命令方法或者文件需要到第二个路径去找,因为第二个路径是ros系统安装的位置。
三、创建功能包
功能包中可以具体的写相关的代码,也要有各种包的依赖才行。创建功能包的时候可以写出这些具体的依赖包。
如下图所示,出现相应的反馈即代表该功能包创建完成。
可以看到在src目录下已经有了刚才创建的功能包:
点击进去之后可以看到已经初始化了该功能包:
这些都是默认会帮我们生成好的文件。CMakeLists
文件和package
文件这两个是很重要的。
CMakeLists
文件会放置该功能包的一些编译选项。
package
会放置描述功能包的一些具体信息,比如版本号,该功能包具体依赖哪些其他的功能包等等。
然后可以回到该工作空间的根目录,重新编译该工作空间,就可以看到编译反馈的信息已经找到了该包。
同一工作空间下,不可以有同名的功能包, 不同工作空间下可以有同名的功能包。
但是如果真的在不同工作空间下放着同名的功能包,ros 在运行某个功能包的时候,同名功能包运行的顺序是什么?这就要用到ros的overlaying机制了。即工作空间的覆盖。
可以用env
命令来查找该系统中所有的环境变量。用env|grep ros
来查找所有与ros相关的环境变量。
其中:ROS_PACKAGE_PATH=/home/geroge/catkin_ws/src:/opt/ros/melodic/share
显示的就是ros在查找功能包的时候会去查找的两个路径。ros要查找功能包的时候会从这两个路径中依次开始查找,比如刚才建立的learning_ros
功能包,如果他在第一个路径home/geroge/catkin_ws/src
里面找到了这个功能包,就可以结束查找,运行该功能包中的相应节点了。
工作空间的路径依次在ROS PACKAGE PATH环境变量中记录
新设置的路径在ROS PACKAGE PATH中会自动放置在最前端
运行时,ROS会优先查找最前端的工作空间中是否存在指定的功能包
如果不存在,就顺序向后查找其他工作空间
【例】
先安装一个roscpp-turtorial包,然后我们看一下他怎么找到这个包:
sudo apt-get install ros-melodic-roscpp-tutorials
然后我们开始找这个包:
rospack find roscpp_tutorials
可以看到他已经在第二个路径中找到了该功能包。