ROS的初步学习(六)---写一个简单程序

就像最初我们接触C/C++一样,我们的第一个程序是“hello world!",现在开始编写一个”hello ros !"  
通过前面的学习,我们已经可以建立一个工作空间和程序包。现在进入catkin_ws2/src,在下面 建一个文件夹my_pkg,
catkin_create_pkg my_pkg
这时会在 my_pkg下生成两个文件
第一个配置文件 .xml 是清单文件
第二个文件 .txt 是cmake 的脚本文件。cmake 是一个符合工业标准的跨平台编译系统。这个文件包含一系列的编译指令,包括应该生成哪种可执行文件,需要那些源文件,以及在那里可以找到所需的头文件和链接库。
catkin_create_pkg 他的工作只不过是创建了两个包目录,和这两个配置文件的默认版本,从而使用户使用更方便。

挨着两个配置文件 命名一个 hello.cpp的文件。
#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::init 函数初始化ROS客户端库。在程序起始处调用一次该函数。函数最后一个参数是一个包含节点默认名的字符。

ros::NodeHandle(节点句柄)对象是你的程序用于和ROS系统
交互的主要机制 。创建此对象会将你的程序注册为ROS节点
管理器的节点。最简单的方法就是在整个程序中只创建一个
NodeHandle对象。
ROS_INFO_STREAM 宏将生成一条消息,且这一消息被发送到
不同的位置,包括控制台窗口。

编译 Hello 程序
我们该如何编译和运行这个程序呢?这些交给ROS的catkin
编译系统来处理。一共有四个步骤 。
声明依赖库
首先,我们需要声明程序所依赖的其他功能包。对
于 c++程序而言,此步骤是必要的,以确保 catkin 能够向 c++编译

为了给出依赖库,编辑包目录下的 CMakeLists.txt 文件。该文
件的默认版本含有如下行:

find_package(catkin REQUIRED)

所依赖的其他 catkin 包可以添加到这一行的 COMPONENTS 关键字
后面,如下所示:

find_package(catkin REQUIRED COMPONENTS my_pkg)

对于 hello 例程,我们需要添加名为 roscpp 的依赖库,它提
供了 ROS 的 C++客户端库。因此,修改后的 find_package 行如下
find_package(catkin REQUIRED COMPONENTS roscpp)还需要在包的清单文件中列出依赖库,通过使用
build_depend (编译依赖)和 run_depend(运行依赖)(报错?)两个关键
字实现:

<build_depend>package-name</build_depend>
<run_depend>package-name</run_depend>(报错?)

CMakeLists.txt
声明可执行文件
接下来,我们需要在 CMakeLists.txt 中添加两行,
来声明我们需要创建的可执行文件。其一般形式是:

add_executable(executable-name source-files)
target_link_libraries(executable-name ${catkin_LIBRARIES})

第一行声明了我们想要的可执行文件的文件名,以及生成此
可执行文件所需的源文件列表。如果你有多个源文件,把它们列
在此处,并用空格将其区分开。第二行告诉 Cmake 当链接此可执
行文件时需要链接哪些库(在上面的 find_package 中定义)。如果
你的包中包括多个可执行文件,为每一个可执行文件复制和修改
上述两行代码。
配置好如下:

cmake_minimum_required(VERSION 2.8.3)
project(my_pkg)
**find_package(catkin REQUIRED COMPONENTS roscpp)**
catkin_package()
include_directories(include ${catkin_INCLUDE_DIRS})
**add_executable(hello hello.cpp)**
target_link_libraries(hello ${catkin_LIBRARIES})

package.xml

<?xml version="1.0"?>
<package format="2">
<name>my_pkg</name>
<version>0.0.0</version>
<description>The my_pkg package</description>
  <build_depend>roscpp</build_depend>
  <run_depend>roscpp</run_depend>

在我们的例程中,hello 程序在编译时和运行时都需要 roscpp 库,
因此清单文件需要包括:

<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend>

然而,在清单文件中声明的依赖库并没有在编译过程中用到;
如果你在此处忽略它们,你可能不会看到任何错误消息,直到发
布你的包给其他人,他们可能在没有安装所需包的情况下编译你
发布的包而导致报错。

编译工作区
一旦你的 CMakeLists.txt 文件设置好,你就可以编译
你的工作区,使用如下命令来编译所有包中的所有可执行文件:

catkin_make

因为被设计成编译你的工作区中的所有包,这个命令必须从你的工作区目录运行。它将会完成一些配置步骤(尤其是你第一
次运行此命令时),并且在你的工作区中创建 devel 和 build 两个
子目录。这两个新目录用于存放和编译相关的文件,例如自动生
成的编译脚本、目标代码和可执行文件。如果你喜欢,当完成功
能包的相关工作后(译者注:即完成了编写、调试、测试等一系
列工作后,此时代码基本定型),可以放心地删除 devel 和 build
两个子目录。
如果有编译错误,你会在执行此步骤时看见它们。在更正它
们以后,你可以重新运行 catkin_make 来完成编译工作。

Sourcing setup.bash

最后的步骤是执行名为 setup.bash 的脚本
文件,它是 catkin_make 在你工作区的 devel 子目录下生成的。

source devel/setup.bash

这个自动生成的脚本文件设置了若干环境变量,从而使 ROS 能够
找到你创建的功能包和新生成的可执行文件。它类似于 setup.bash,但是是专门为你的工作区量身定做的。除非目录结构发生变化,否则你只需要在每个终端执行此命令一次,即使你修改了代码并且用 catkin_make 执行了重编译。
所有这些编译步骤完成后,新的 ROS 程序就可以使用
rosrun(来执行,就像任何其他 ROS 程序一样。对于我们的例程,命令是:

rosrun my_pkg hello

这里写图片描述

不要忘了首先要启动 roscore:这个程序是一个节点,节点需
要一个节点管理器才可以正常运行。顺便说一下,这行输出中的
数字代表时间,从 1970 年 1 月 1 日开始以秒计数,这一时间是
我们的 ROS_INFO_STREAM 开始执行的时间。

猜你喜欢

转载自blog.csdn.net/weixin_40641902/article/details/78296043