学习参考:

ROS/教程/CreatingMsgAndSrv - ROS Wiki

ROS Message 类型总结_ros msg类型-CSDN博客

在对于存在代码的功能包中一般使用src存放源码,对于功能包是话题而言一般是在功能包中还会多增加一个msg文件夹,感觉相当于放置话题所需要传递的数据类型,msg文件夹中放置话题使用的消息,可能会有不同的消息,比如人与人之间的交流,动物与动物之间的交流,所msg文件夹下放置的.msg文件就是给不同的话题去使用。

 

而服务通讯的功能包中会建一个srv进行存放服务通讯使用的数据类型,大致作用也是相同;

 

--------------------------------------------------------------------------------------------------------------

ROS中的通讯分为两种一种为话题,一种为服务。

对于话题通讯而言需要有发布者与订阅者,订阅者通过话题订阅发布者发布传递的信息;

对于服务通讯而言需要有请求者与回应者,两者一对一进行交流;

--------------------------------------------------------------------------------------------------------------

msg:

我感觉msg就是话题通讯中的自主定义需要进行传递的数据类型,在.msg文本文件中设定这个话题所使用传递的数据类型,下面是一些数据类型;

常见类型感觉有点像是封装好的一大串类型,要调用别的包或库再写出使用的类型在.msg文档中;

 下面是一个msg中text文档示例:

 上面只是创建使用的数据类型的text文档,在功能包中还需要设置Package.xml文件与CMakeList.txt文件才算设置一个通讯的msg完成;

打开Package.xml文件,在其中设置下图:

 其作用:

ROS通过message_generation将.msg文件或者.srv文件自动转换为C++或者Python能使用的源码,同时需要message_runtime提供运行时的支持;

保存后再编写功能包中的CMakeList.txt文件

①find_package()

寻找到find_package()在内部加上message_generation你所使用的依赖包,因为上面那些使用到这个包,寻找到这个包才能使用它;

②catkin_package()

同时还有下面的catkin_package()感觉这里是编译包导入包的感觉,对于使用的依赖,记得写上去,在这里我们上面写了依赖项是message_generatin,但是要执行的是包中的message_runtime所以下面的编译依赖直接编译message_runtime即可,我的感觉是这样的

可以一次性写多个编译依赖,用空格隔开就好了。

 eg:

③add_message_files()

修改一个add_message_files(),用于指定使用文件;

 ④generate_messages()作用不知道干嘛的有点难受

 上面就是一个msg消息的创建过程;

--------------------------------------------------------------------------------------------------------------

srv:

同理是差不多的,因为只是传递信息的方式不同,其中数据类型那些大致都是相同的。

在服务功能包中的srv文件夹创建所需要的.srv文件,在里面存放这个服务的数据类型;

但是这个.srv文档的写的方式与.msg存在一点差距,上面说的.msg文档中只用存放总的使用的数据类型,因为只有一个发布者进行信息发布,订阅者只负责订阅信息即可,但是服务不一样有请求有响应,.srv文档中通过三个-即---来分割开两个进行传递的数据类型,上半区域是request即请求,下半区是respond即回应的数据类型,创建完保存后同样要对服务功能包中的Package.xml与CMakeList.txt做出修改,大致内容也是相同;

在Package.xml中打上你所需要使用依赖的标签,与所要执行的依赖。

在CMakeList.txt中,无所谓步骤位置放对写对就行,和上面.msg作用大致相同

①find_package()

②add_service_files()

③generate_messages()

④catkin_package()

 

这些玩意设置完毕保存就行,这就是一个.srv文档的创建。