前面介绍了ROS的基本概念, 还没介绍如何操作, 下面从操作层面结束ROS.
1. 创建ROS工作空间
$ mkdir -p ~/catkin_ws/src
$ cd ~/catkin_ws
$ catkin_make
其中catkin_ws是自定义的工作空间名,也就是文件夹名。
2. 配置环境变量
$ source devel/setup.bash 注意zsh: $ source devel/setup.zsh
也可直接在.bashrc里写入:$ source ~/catkin_ws/devel/setup.bash 注意zshrc里: $ source ~/catkin_ws/devel/setup.zsh
3. 创建一个功能包
$ cd ~/catkin_ws/src
使用catkin_create_pkg命令来创建功能包:$ catkin_create_pkg beginner_tutorials std_msgs rospy roscpp
其中,beginner_tutorials是创建的功能包名,后面是该功能包依赖的三个功能包。运行完后可以看出在beginner_tutorials目录下创建了package.xml和CMakeLists.txt两个文件。
4. 配置package.xml文件
package.xml文件主要由4个标签组成,分别为描述标签、维护者标签、许可证标签、依赖项标签。
package.xml包含了package的名称、 版本号、 内容描述、 维护人员、 软件许可、 编译构建工具、 编译依赖、 运行依赖等信息。实际上 rospack find 、 rosdep 等命令之所以能快速定位和分析出package的依赖项信息, 就是直接读取了每一个pacakge中的 package.xml 文件。 它为用户提供了快速了解一个pacakge的渠道。基本的框架如下:
<pacakge> 根标记文件
<name> 包名
<version> 版本号
<description> 内容描述
<maintainer> 维护者
<license> 软件许可证
<buildtool_depend> 编译构建工具, 通常为catkin
<depend> 指定依赖项为编译、 导出、 运行需要的依赖, 最常用
<build_depend> 编译依赖项
<build_export_depend> 导出依赖项
<exec_depend> 运行依赖项
<test_depend> 测试用例依赖项
<doc_depend> 文档依赖项
5. 编写ROS程序
~/catkin_ws/src/功能包名 目录下,创建并编辑cpp程序文件(以hello.cpp为例)。
$ cd ~/catkin_ws/src/beginner_tutorials
$ touch hello.cpp
$ gedit 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! ");
}
6. 编译ROS程序
想要编译我们的程序, 首先需要声明程序所依赖的其他功能包, 我们的程序很简单只需要添加roscpp依赖, 如何添加依赖:
1. CMakeLists.txt中找到find_package,添加roscpp:
find_package(catkin REQUIRED COMPONENTS
#依次写上所依赖的功能包
roscpp
)
2. 修改package.xml,将roscpp添加至build_depend(编译依赖)和exec_depend(运行依赖)。
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_export_depend>roscpp</build_export_depend>
<exec_depend>roscpp</exec_depend>
声明可执行文件, 需要在CMakeLists.txt中添加两行,来声明我们需要创建的可执行文件。
add_executable(hello hello.cpp)
target_link_libraries(hello ${catkin_LIBRARIES})
其中 hello是我们想要生成的可执行文件的文件名,hello.cpp是生成此可执行文件所需的源文件列表。如果有多个源文件,把它们列在此处,并用空格将其区分开。第二行告诉Cmake当链接此可执行文件时需要链接哪些库(在上面的find_package中已经定义了)。
编译工作区, 返回工作空间目录,然后使用catkin_make命令进行编译:
cd ~/catkin_ws
$ catkin_make
完成编译后,将会在工作区中创建devel(开发空间,用来放置编译生成的可执行文件)和build(编译空间,用来储存工作空间编译过程中产生的缓存信息和中间文件)两个子目录。
7. 运行ROS程序
hello 程序是一个节点(Node),需要节点管理器才可以正常运行,启动节点管理器后,用rosrun命令运行程序:
$ roscore
$ rosrun beginner_tutorials hello