【ROS第一讲】一、创建工作空间
一、工作空间
1.src:
放置所有功能包源码的空间
2.build:
所有在编译过程中产生的中间文件(使用的较少)
3.devel:
存放的所有编译完的可执行文件,环境变量的配置脚本(常用)
4.install:
和devel有点重复,存放的都是编译完成的可执行文件,ros2中把install和devel合并为同一个文件夹了.
一个常见的工作空间结构如下:
workspace_folder/
|—— src/
|—— CMakeLists.txt
|—— package_1/
|—— CMakeLists.txt
|—— package.xml
|—— ......
|—— package_2/
|—— CMakeLists.txt
|—— package.xml
|—— ......
|—— devel/
|—— setup.bash
|—— ......
|—— build/
|—— ......
|—— install/
二、创建工作空间
1.工作空间的编译
依赖于catkin_make
工具,他的底层也是基于cmake的,只不过是基于cmake做了一点封装。
新建的工作空间内进行编译,并不会编译任何的代码(因为还没有写代码),只是会生成一些固定的文件:
2.配置环境变量:
当编译完成你自己创建的工作空间之后,工作空间的根目录里会自动产生build和devel两个文件夹及其中的文件,在devel文件夹会产成几个setuo.*sh形式的环境变量设置脚本。为了使工作空间中的环境变量脚本生效,故我们需要用source命令来运行这些脚本文件;输入source devel/setup.bash
,来把该工作空间的setup.bash文件添加到ros的环境中去,这样ros就知道你在操作该工作空间,之后ros就会从该工作空间找需要的包依赖之类的。
配置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系统安装的位置。
三、创建功能包
功能包中可以具体的写相关的代码,也要有各种包的依赖才行。创建功能包的时候可以写出这些具体的依赖包。
在catkin_ws\src目录下新建功能包:
可以看到在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
可以看到他已经在第二个路径中找到了该功能包。
四、完整的创建工作空间以及功能包的步骤如下:
1.创建工作空间
mkdir -p ~/catkin_ws/src #使用系统命令创建工作空间目录
cd ~/catkin_ws/src
catkin_init_workspace # ROS的工作空间初始化命令
创建完成后,在工作空间的根目录下使用catkin_make命令编译整个工作空间:
cd ~/catkin_ws # 回到工作空间的根目录
catkin_make # 编译整个工作空间
编译中,工作空间的根目录会自动产生devel和build两个文件夹即其中的文件。
编译完成后,在devel文件夹中已经产生几个setuo.*sh形式的环境变量设置脚本,使用source命令运行这些脚本,可以使工作空间中的环境变量生效。
source devel/setup.bash
检查环境变量是否生效:
echo $ROS_PACKAGE_PATH
如果打印的路径中包含当前工作空间中的路径,则说明环境变量设置成功。
注意:source命令设置的环境变量只能在当前终端生效,如果希望在所有终端生效,需要在终端配置文件中加入环境变量设置:echo
“source /home/xxx/catkin_ws/devel/setup.bash” >> ~/.bashrc
2.创建功能包
ROS不允许功能包的嵌套,多个功能包必须平行放置在代码空间(src)中。
ROS直接创建功能包的命令catkin_create_pkg,用法:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
即需要输入功能包名称和所依赖的其它功能包。
进入代码空间,创建功能包:
cd ~/catkin_ws/src
catkin_create_pkg leraning_communication std_msgs rospy roscpp
回到工作空间根目录进行编译,设置环境变量:
cd ~/catkin_ws
catkin_make
source ~/catkin_ws/devel/setup.bash
一个功能包就这样创建完成了。