《精通ROS机器人编程(原书第2版) 》 —2.2 添加自定义的msg和srv文件

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

2.2 添加自定义的msg和srv文件

在本节中,我们将学习如何在当前软件包中创建自定义的消息和服务。消息的定义存储在.msg文件中,服务的定义存储在.srv文件中。这些定义告知ROS从节点发送的数据类型和数据名称。当添加自定义消息时,ROS会将其定义转换为等价的C++代码,这样我们就可以将这些代码包含在节点中。

首先我们来介绍消息定义。这些消息定义必须写在.msg文件中,且必须保存在软件包内的msg文件夹中。现在我们创建一个名为demo_msg.msg的消息文件,定义如下:

 image.png

到目前为止,我们一直使用的都是标准消息定义。现在,我们已经可以创建自定义的消息了,并学会如何在我们的代码中使用它们。

第一步是编辑当前软件包中的package.xml文件,取消注释:<build_depend>message_generation</build_depend>和<exec_depend>message_runtime</exec_depend>。

编辑当前的CMakeLists.txt并添加message_generation行,如下所示:

 image.png

取消下面这些行代码的注释并添加自定义消息文件:

 image.png

完成这些步骤后,我们就可以编译和生成软件包了:

 image.png

要检查消息生成是否正确,我们可以使用rosmsg命令来检查:

 image.png

如果执行命令后显示的内容和定义一样,那说明创建自定义消息的过程是正确的。

如果我们想测试自定义的消息,可以使用名为demo_msg_publisher.cpp和demo_msg_subscriber.cpp的自定义消息类型生成发布者和订阅者来测试节点。在mastering_ros_demo_pkg/1文件夹中可以获取到这些代码。

我们可以通过在CMakeLists.txt中添加以下代码来测试自定义消息:

 image.png

使用catkin_make来编译生成软件包,并使用以下命令测试这些节点。

运行roscore:

 image.png

启动自定义消息的发布者节点:

 image.png

启动自定义消息的订阅者节点:

 image.png

发布者节点将发布一条带有字符串和一个整数的消息,订阅者节点订阅该话题并打印这些内容。输出内容和通信图如图2-4所示。

 image.png

图2-4 运行使用自定义消息的发布者和订阅者

节点间通信的话题名为/demo_msg_topic。图2-5是两个节点之间的通信图:

 image.png

图2-5 消息发布者和订阅者之间的通信图

接下来,我们可以在软件包中添加srv文件。首先在当前软件包的文件夹中创建一个名为srv的新文件夹,然后添加一个名为demo_srv.srv的srv文件。该文件的定义如下:

 image.png

这里的请求(Request)和应答(Response)都是字符串类型。

下一步,我们需要取消package.xml文件中的以下两行注释,和我们在ROS消息中所做的一样:

 image.png

打开CMakeLists.txt文件并在catkin_package( )中添加message_runtime:

 image.png

我们需要遵循与生成ROS消息相同的过程来生成服务。除此之外,我们还需要取消其他部分注释,如下所示:

 image.png

做了这些修改后,我们就可以使用catkin_make来编译生成软件包了。使用下面的命令验证整个过程是否正确:

 image.png

如果我们看到输出内容与服务文件中定义的内容一样,我们就可以确认创建自定义服务的过程是正确的。


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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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