《精通ROS机器人编程(原书第2版) 》 —2.1.2 创建ROS节点

举报
华章计算机 发表于 2020/02/10 14:28:21 2020/02/10
【摘要】 本节书摘来自华章计算机《精通ROS机器人编程(原书第2版) 》 一书中第2章,第2.1.2节,作者是[印度]郎坦·约瑟夫(Lentin Joseph)[意大利]乔纳森·卡卡切(Jonathan Cacace),张新宇 张志杰 等译 。

2.1.2 创建ROS节点

我们要讨论的第一个节点是demo_topic_publisher.cpp。此节点将在名为/numbers的话题上发布一个整型数值。我们可以将下面的代码复制到新软件包中或使用代码仓库中的现有文件:

以下是完整的代码:

 

 image.png

以下是上述代码的详细说明:

 image.png

ros/ros.h是ROS的主要头文件。如果我们想在代码中使用roscpp客户端API的话,就必须包含此头文件。std_msgs/Int32.h是整型数据类型的标准消息定义的头文件。

这里我们通过话题发送整型数据,所以我们需要一个消息类型来处理这些整型数据。std_msgs包含了基本数据类型的标准消息定义。std_msgs/Int32.h包含了整型消息的定义。

 image.png

该段代码将初始化一个带有名称的ROS节点。需要注意的是,ROS节点名应该是唯一的。所有的ROSC++节点代码都必须包含此行代码。

 image.png

这将创建一个NodeHandle对象,用于与ROS系统进行通信。

 image.png

这将创建一个话题发布者,该话题是std_msgs::Int32消息类型,话题名是/numbers。第二个参数是缓冲区大小,它表示在发送消息之前可以将多少消息放到缓冲区中。如果数据发送的频率很高,该参数也需要设置得很大。

 image.png

这是用来设置发送数据的频率。

 image.png

这是一个无限while循环,当我们按下Ctrl+C时,它才会退出。如果出现一个中断,ros::ok()函数将返回0,这样就可以中断该while循环。

 image.png

第一行创建了一个整型ROS消息,第二行为这条消息分配了整型数据。在这里,data是msg对象的字段名。

 image.png

这将打印消息数据。该行用于输出ROS消息的日志。

 image.png

这将发布消息到/numbers话题上。

 image.png

此命令将读取和更新所有的ROS话题。一个节点如果没有spin()或spinOnce()函数的话是不会发布消息的。

 image.png

这行能提供必要的延时使发布消息的频率达到10Hz。

讨论了发布者节点之后,现在我们可以讨论订阅者节点了,即demo_topic_subscriber.cpp。你可以将下面的源码复制到一个新文件中或者使用已有的文件。

以下是订阅者节点的源码定义:

 image.png

 

以下是代码的解析:

 image.png

这是订阅者所需的头文件。

 image.png

这是一个回调函数,只要有数据发送到/numbers话题上,它就会被自动调用执行。当有数据发送到此话题上时,该函数将调用并提取消息中的数值,然后将其打印在控制台上。

 image.png

这里定义了一个订阅者,我们给出了订阅所需的话题名称、缓冲区大小和要执行的回调函数。我们将订阅/numbers话题,回调函数已经在前面看到过了。

 image.png

这是一个无限循环,节点将在此步骤中一直等待。只要有数据被发送到话题上,此代码就会立刻执行相应话题的回调函数。只有当按下Ctrl+C键时,该节点才会退出。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。