roscpp 库基本用法
本文主要介绍如何使用 roscpp 客户端库编写 ROS 节点,包括 ROS 节点中使用的头文件介绍、初始化 ROS 节点,以及发布和订阅话题等基本用法。
头文件
使用 C++ 编程时,首先需要包含头文件。为了创建 ROS 节点,C++ 源文件中必须包含以下头文件:
#include "ros/ros.h"
ros.h 文件中包含了实现 ROS 功能所必需的所有头文件,如果不包含该头文件,就不能创建 ROS 节点。
ROS 节点中使用的第二种头文件是 ROS 消息头文件。如果要在节点中使用某种特定的消息类型,那么一定要包含消息头文件。ROS 中有一些内置的消息类型,当然用户也可以自定义新的消息类型。
ROS 中有一个名为 std_msgs
的内置消息软件包,其中包含诸如整型、浮点型和字符串类型等的标准数据类型的消息定义。例如,如果代码中需要用到字符串消息,那么需要添加如下代码:
#include "std_msgs/String.h"
在这行代码中,双引号的第一部分是软件包的名称,第二部分是消息类型的名称。如果需要使用定制的消息类型,可以使用如下代码:
#include "msg_pkg_name/message_name.h"
以下是 std_msgs
软件包中的一些消息头文件:
#include "std_msgs/Int32.h"
#include "std_msgs/Int64.h"
如果你想了解 std_msgs
软件包的完整消息类型列表,可以点击这里查看。
初始化 ROS 节点
在编写任何 ROS 节点功能之前,首先要做的就是初始化节点。
在 C++ 中,使用下面几行代码即可完成初始化:
int main(int argc, char **argv)
{
ros::init(argc, argv, "name_of_node");
...
}
ros::init()
函数用于初始化 ROS 节点,在调用时可以向其传递 argc、argv 命令行参数和节点的名称。这个名称就是 ROS 节点的名称,后续可以通过 rosnod list
命令查看。
在 ROS 节点中打印信息
ROS 提供了记录日志信息的应用程序接口。这些信息是一些可读字符串,代表了节点的运行状态。
在 C++ 中,以下函数可以用于记录节点信息:
ROS_INFO(string_msg, args); /* 记录节点输出的基本信息 */
ROS_WARN(string_msg, args); /* 记录节点输出的警告信息 */
ROS_DEBUG(string_msg, args); /* 记录节点输出的调试信息 */
ROS_ERROR(string_msg, args); /* 记录节点输出的错误信息 */
ROS_FATAL(string_msg, args); /* 记录节点输出的致命信息 */
使用示例:
ROS_INFO("Hello %s", "World");
创建节点句柄
初始化节点后,需要创建一个节点句柄实例,用于启动 ROS 节点和消息发布、订阅等操作。
在 C++ 中,我们可以使用 ros::NodeHandle
创建节点句柄,如下:
ros::NodeHandle nh;
创建 ROS 消息定义
发布 话题之前,需要创建一个 ROS 消息定义。
在 C++ 中,我们可以使用下面代码创建一个 ROS 消息的实例,并为其添加数据:
std_msgs::String msg;
msg.data = "String data";