作为学习一门新语言的套路,我们首先要学习的是最简单的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
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",添加
在"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!