1. 创建工作空间(Workspace)
mkdir -p ~/ROS/workspace/MyFirstWorkspace/src
注:目录没有固定要求,随意命名。其中src是用来存放源代码的。
2.创建功能包(package)
创建一个新ROS功能包。在工作空间的src目录下运行:catkin_create_pkg package-name,package-name指的是你功能包的名字。
cd MyFirstWorkspace/scr/
catkin_create_pkg hello
完成后如下图:
其实,这个功能包创建命令没有做太多工作,它只不过创建了一个存放这个功能包的目录,并在那个目录下生成了两个配置文件。
第一个配置文件,叫做 package.xml,称为清单文件。
第二个文件,叫做 CMakeLists.txt,是一个 Cmake 的脚本文件,Cmake 是一个符合工业标准的跨平台编译系统。这个文件包含了一系列的编译指令,包括应该生成哪种可执行文件,需要哪些源文件,以及在哪里可以找到所需的头文件和 链接库。当然,这个文件表明 catkin 在内部使用了 Cmake。
注意:ROS 包的命名遵循一个命名规范,只允许使用小写字母、数字和下划线,而且首字符必须是一个小写字母。一些 ROS工具,包括 catkin,不支持那些不遵循此命名规范的包。
注:编辑清单文件创建包后,你可能希望编辑其 package.xml 文件,其中包含一些描述这个包的元数据。通过 catkin_create_pkg 创建的功能包默认含有很丰富的注释,对于读者在很大程度上是不言自明的。然而,请注意,无论是在编译时还是在运行时,其中的大部分信息 ROS 并没有使用,这些信息只有在你公开发布代码时才变得重要。本着保持文档与实际功能同步的精神,至少填写description 和 maintainer 两部分可能是比较合理的。
3.Hello,ROS!
在项目文件夹(hello)下创建一个.cpp文件,命名为hello.cpp
#include <ros/ros.h>
int main ( int argc , char ** argv )
{
ros::init ( argc , argv , "hello" ) ;
ros::NodeHandle nh ;
ROS_INFO_STREAM( " Hello , ROS! " ) ;
return 0;
}
注意:一些在线教程建议在你的功能包目录中创建 src 目录来存放 C ++源文件。这个附加的组织结构可能是有益的,特别是对于那些含有多种类型文件的较大的功能包,但它不是严格必要的。
以及,如果在/usr/inlcude/ 路径下不存在ros文件夹,那么你就要找到你的ros 库安装在哪里,并把它复制到/usr/include/ 的路径下,否则编译会报错的。
可以在终端中使用Locate命令定位ros.h
locate ros.h
4.编译Hello程序
我们该如何编译和运行这个程序呢?这些交给ROS的catkin编译系统来处理。
第一步:声明依赖库
首先,我们需要声明程序所依赖的其他功能包。对于 c++程序而言,此步骤是必要的,以确保 catkin 能够向 c++编译器提供合适的标记来定位编译功能包所需的头文件和链接库。为了给出依赖库,编辑包目录下的 CMakeLists.txt 文件。该文件的默认版本含有如下行:
find_package(catkin REQUIRED)
所依赖的其他 catkin 包可以添加到这一行的 COMPONENTS 关键字后面,如下所示:find_package(catkin REQUIRED COMPONENTS package-names)
对于 hello 例程,我们需要添加名为 roscpp 的依赖库,它提供了 ROS 的 C++客户端库。因此,修改后的 find_package 行如下:
find_package(catkin REQUIRED COMPONENTS roscpp)
我们同样需要在包的清单文件package.xml 中列出依赖库,通过使用build_depend (编译依赖)和 run_depend(运行依赖)两个关键字实现:格式如下:
<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>
在hello 程序在编译时和运行时都需要 roscpp 库,因此清单文件package.xml加入:
<build_depend>roscpp</build_depend>