所有的ROS程序,包括我们自己开发的程序,都被组织成功能包,而ROS的功能包被存放在称之为工作空间的目录下。因此,在我们写程序之前,第一步是创建一个工作空间以容纳我们的功能包。其实ROS工作空间就是linux下的一个目录,创建ROS工作空间就是创建一个linux目录(我们创建名为catkin_ws的工作空间,当然也可以使用其它名字),只是需要按照ROS的规范在这个目录下添加一个src的子目录,然后执行一个ROS的命令即可。
1.创建工作空间
mkdir -p ~/catkin_ws/src
虽然这时候工作空间是空的,但是我们依然可以进行编译:(一定要在工作空间的根目录下)
cd ~/catkin_ws/
catkin_make
执行完该命令后,发现工作空间catkin_ws中有三个目录: build devel src
其中,src是我们创建工作空间时创建的目录,另外两个是执行完 catkin_make 后生成的。
src文件夹下自动生成了一个名称为CMakeLists.txt的文件,这个也是自动生成的,在编译过程中有如下提示:
Creating symlink "/home/exbot/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/indigo/share/catkin/cmake/toplevel.cmake"
build 文件夹存放编译过程中产生的中间文件
devel 文件夹存放的是编译产生的可执行文件和环境变量的设置脚本
为了在每次打开终端的时候linux系统都能找该工作空间的相关文件,我们将在.bashrc文件中添加如下命令:
source ~/catkin_ws/devel/setup.bash
下面我们检查环境变量是否设置成功,输入以下命令
echo $ROS_PACKAGE_PATH
看到红色方框的提示信息就说明环境变量设置成功,到此,一个工作空间就建立完成了。
2.创建功能包
创建了工作空间,接下来就可以在工作空间里创建功能包。
创建一个新ROS功能包的命令应该在你工作空间中的src目录下运行:
catkin_create_pkg <package_name> [depend1] [depend2] [depend3]
package-name指的是你功能包名称,后面跟的参数功能包的依赖。
我们创建一个名称为hello的功能包,该功能包依赖roscpp(我们源代码用c++编写,roscpp为我们提供必要的环境)
exbot@ubuntu:~/catkin_ws/src$ catkin_create_pkg hello roscpp
我们发现,该命令为我们创建了一个hello文件夹
并且文件夹下内容如下:
第一个配置文件,叫做 package.xml,称为清单文件。清单文件包含了功能包的名字,版本,维护者,依赖的其他的功能包等。如果我们后期想在功能包加更多的依赖,就需要修改这个文件。
第二个文件,叫做 CMakeLists.txt,是一个 Cmake 的脚本文件,Cmake 是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和链接库。当然,这个文件表明 catkin 在内部使用了 Cmake。
我们可以用rospack命令验证hello的一级依赖包
,看到和我们之前设置的roscpp一致。
3.编写功能包的代码
我们在hello功能包的src文件夹下新建main.cpp文件
文件内容如下:
#include "ros/ros.h"
#include<iostream>
using namespace std;
int main(int argc, char **argv)
{
cout<<"hello ros!"<<endl;
return 0;
}
4.修改CMakeLists.txt文件
我们找到hello文件夹下的CMakeLists.txt文件,添加如下两行:
## Declare a cpp executable
add_executable(printf_hello src/main.cpp)
即,生成printf_hello的可执行文件,可执行文件依赖于src/main.cpp
注:cmake的语法在次不做深入讲解
5.编译工作空间
exbot@ubuntu:~/catkin_ws$ catkin_make
编译完成之后我们可以在devel文件加下找到相应的可执行文件
6.运行
启动ros核:
exbot@ubuntu:~$ roscore
在另一个终端运行hello功能包的printf_hello功能
exbot@ubuntu:~$ rosrun hello printf_hello
hello ros!
可以看到成功打印出hello ros!
REF:
https://www.cnblogs.com/huangjianxin/p/6347416.html