ROS: Hello ROS程序

作为学习一门新语言的套路,我们首先要学习的是最简单的hello ROS程序。简单的hello ROS程序遵循以下的流程

(零):创建功能包(文件夹)

ROS里的包指的是程序包,是ROS应用程序代码的组织单元。我的理解是,它类似于VS里的工程。所以在ROS创建功能包的动作应该类似于在VS中新建工程。

在命令窗中输入:

cd ~/ros_ws/src

这个命令是打开我平时放置源代码的文件夹

接下来继续输入

catkin_create_pkg agitr

这个命令的作用是在当前文件夹目录下创建一个名为agitr的程序包,此包与普通的文件夹不同的地方在于里面会存在两个文件分别叫做"package.xml","CMakeLists.txt",这两个文件后面编译的时候会用到。

PS:agitr这个名字是a gentle introduction to ROS的缩写,是我使用的ros书籍里的记法,读者也可以选择其他喜欢的名字。

(一):编写c++代码

像windows系统那样打开agitr文件夹,这个文件夹中应该可以看到上面提到的"package.xml"和"CMakeLists.txt"。右击创建新空白文件,然后将文件重命名为"hello.cpp",要注意的是,ubuntu系统创建的是一个完全空白的文件,包括拓展名都是要自己写的。接下来打开这个文件,输入代码:

#include <ros/ros.h>

int main(int argc, char** argv)
{
	ros::init(argc, argv, " hello _ros ");
	ros::NodeHandle nh;
	ROS_INFO_STREAM(" Hello , .ROS! ");
}

头文件ros/ros.h包含了标准ROS类的定义,对于每一个ROS程序中都应该包含这个库。

主函数中,第一句ros::init(argc, argv, " hello _ros ");  这句初始化了ROS的客户端库,按照我所看的书籍的说法是“请在你程序的起始位置调用一次该函数,函数最后一个参数是一个包含结点默认名的字符串”

第二句声明了一个句柄对象,该对象是ROS系统和用户程序交互的主要机制,创建此对象会将用户程序注册为结点管理器的结点。最好只在一个用户程序中声明一个句柄对象。

最后一句将生成一个消息,该消息会被 发送出去。包括命令窗

(二):声明依赖库

一个程序的编译和运行往往需要依赖其它的程序,在VS这样的IDE中,类似的处理IDE已经帮助用户处理好了,但是在ubuntu中,这种工作需要用户自己处理。具体来说,声明依赖库有如下步骤

打开包目录下的"CMakeLists.txt"文件,找到

find_package(catkin REQUIRED)

修改为

find_package(catkin REQUIRED COMPONENTS roscpp)

同样要在包的清单文件中列出依赖库,打开包目录下的"package.xml",添加

<build_export_depend>message_runtime</build_export_depend>
<exec_depend>message_runtime</exec_depend>

在"package.xml"中没有列出依赖库不一定会在本机出现问题,但是当把程序打包发给其他机器时,如果没有声明依赖库很可能会出现问题。

(三):声明可执行文件

打开包目录下的"CMakeLists.txt"文件,添加

add_executable(hello hello.cpp)

这句语句的意思是,我们想要一个名为hello的可执行文件,这个文件的源代码是hello.cpp

ps:add_executable()和add_library()命令必须放在catkin_package()命令后面,不然编译完的可执行文件会在/build文件夹下面而不是我们需要的/devel/lib文件夹下,前者的话rosrun命令将无法找到。


然后添加

target_link_libraries(hello ${catkin_LIBRARIES})

这个语句的意思是,编译生成hello可执行文件的时候,需要连接名为catkin_LIBRARIES的库 。

(四):修改路径

这里教程上没有说,我是踩了坑以后自己摸索出来的,我也不知道怎么称呼比较好

还是在"CMakeLists.txt"文件,找到

include_directories()

修改为

include_directories(include ${catkin_INCLUDE_DIRS})


//我也不知道为什么要这样


(五):编译

在命令窗中进入工作区目录,然后输入

catkin_make

这个命令的作用是编译工作区内所有的包,因此,在使用这个命令之前,必须进入工作区目录


(六):执行脚本文件

如果编译成功了,会在工作区的devel文件夹下面生成一个名为setup.bash的脚本文件,这个自动生成的脚本文件可以帮助ROS找到用户生成的文件包和新生成的可执行文件。

在命令窗执行命令

source devel/setup.bash

除非目录结构发生改变,否则只需执行一次该命令


(七):执行hello程序

打开两个命令窗,第一个输入

roscore

另一个输入

rosrun agitr hello

程序会在终端打印类似下面内容

[ INFO] [1416432122.659693753]: Hello, ROS!

说明hello ROS程序正确运行


猜你喜欢

转载自blog.csdn.net/buaazyp/article/details/80635651
ROS