《精通ROS机器人编程(原书第2版) 》 —2.1.2 创建ROS节点
2.1.2 创建ROS节点
我们要讨论的第一个节点是demo_topic_publisher.cpp。此节点将在名为/numbers的话题上发布一个整型数值。我们可以将下面的代码复制到新软件包中或使用代码仓库中的现有文件:
以下是完整的代码:
以下是上述代码的详细说明:
ros/ros.h是ROS的主要头文件。如果我们想在代码中使用roscpp客户端API的话,就必须包含此头文件。std_msgs/Int32.h是整型数据类型的标准消息定义的头文件。
这里我们通过话题发送整型数据,所以我们需要一个消息类型来处理这些整型数据。std_msgs包含了基本数据类型的标准消息定义。std_msgs/Int32.h包含了整型消息的定义。
该段代码将初始化一个带有名称的ROS节点。需要注意的是,ROS节点名应该是唯一的。所有的ROSC++节点代码都必须包含此行代码。
这将创建一个NodeHandle对象,用于与ROS系统进行通信。
这将创建一个话题发布者,该话题是std_msgs::Int32消息类型,话题名是/numbers。第二个参数是缓冲区大小,它表示在发送消息之前可以将多少消息放到缓冲区中。如果数据发送的频率很高,该参数也需要设置得很大。
这是用来设置发送数据的频率。
这是一个无限while循环,当我们按下Ctrl+C时,它才会退出。如果出现一个中断,ros::ok()函数将返回0,这样就可以中断该while循环。
第一行创建了一个整型ROS消息,第二行为这条消息分配了整型数据。在这里,data是msg对象的字段名。
这将打印消息数据。该行用于输出ROS消息的日志。
这将发布消息到/numbers话题上。
此命令将读取和更新所有的ROS话题。一个节点如果没有spin()或spinOnce()函数的话是不会发布消息的。
这行能提供必要的延时使发布消息的频率达到10Hz。
讨论了发布者节点之后,现在我们可以讨论订阅者节点了,即demo_topic_subscriber.cpp。你可以将下面的源码复制到一个新文件中或者使用已有的文件。
以下是订阅者节点的源码定义:
以下是代码的解析:
这是订阅者所需的头文件。
这是一个回调函数,只要有数据发送到/numbers话题上,它就会被自动调用执行。当有数据发送到此话题上时,该函数将调用并提取消息中的数值,然后将其打印在控制台上。
这里定义了一个订阅者,我们给出了订阅所需的话题名称、缓冲区大小和要执行的回调函数。我们将订阅/numbers话题,回调函数已经在前面看到过了。
这是一个无限循环,节点将在此步骤中一直等待。只要有数据被发送到话题上,此代码就会立刻执行相应话题的回调函数。只有当按下Ctrl+C键时,该节点才会退出。
- 点赞
- 收藏
- 关注作者
评论(0)