学习参考:
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文档的创建。