ROS节点之间进行通信的最重要机制是消息传递,为了在不同的开发语言实现的模块间进行消息通信,ROS利用了简单的、与开发语言无关的接口定义语言来描述模块间传递的消息在ROS中,消息本质上是一种节点间传递信息的数据类型,当节点想要分享信息时,节点可以发布消息到相应的话题中,当节点需要接收信息时,节点可以订阅相应的话题。节点管理器会确保消息传递的互通性,但消息不需要经过节点管理器进行转发。ROS提供了很多预定义的消息类型,但开发者可以通过后缀名为msg的消息文件自定义消息类型,msg文件应放置在程序包的msg目录下。消息类型每行的声明必须包含两部分:域和变量;域定义了消息的数据类型,变量定义了域的名称。域可以是独立域也可以是复合域。
一、对两个重要配置文件的了解
1.package.xml。
package.xml描述了功能包的元信息,也就是描述功能包属性的信息,它定义了程序包的信息,如名称、版本、维护者、编译依赖、执行依赖等。
2、CmakeList.txt
记录了功能包的编译规则,它定义了ROS对cmake的最低要求、编译依赖的程序包、消息文件、服务文件、动作文件、头文件等,还定义了编译输出的可执行文件、目标链接库、安装输出、单元测试等。
如:cmake_minimum_required()
要求的CMake最低版本
project()
程序包的名称
find_package()
编译依赖的程序包
add_message_files(), add_service_files(), add_action_files()
添加消息、服务或响应文件
generate_messages()
生成消息、服务或响应文件
catkin_package()
catkin程序包
add_library()/add_executable()/target_link_libraries()
添加库文件,可执行文件,链接库文件
catkin_add_gtest()
添加测试单元
install()
安装
二、具体的实现步骤
1、定义消息接口
在所在的功能包中创建一个msg的目录,然后在目录下创建一个Person.msg文件,文件内容如下:
string name
uint8 age
uint8 sex
uint8 unknown = 0
uint8 male = 1
uint8 female = 2
2、在package.xml中添加功能包依赖
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
//依赖message_generation用于产生与特定语言相关的消息代码,message_generation本身是一个功能包
//依赖message_runtime表示特定语言相关的消息运行依赖
通俗地讲需要message_generation生成C++或Python能使用的代码,需要message_runtime提供运行时的支持,所以package.xml中添加以下两句。总的来说,一定要确保该文件中设置了以下编译和运行的相关依赖。
具体如下:
3、在CMakeLists.txt添加编译选项
添加预处理代码
//把依赖的程序包添加进去,调用find_package查找依赖的包,必备的有roscpp rospy message_generation,其他根据具体类型添加。
①find_package( …… message_generation)
//在find_package中添加消息生成依赖的功能包message_generation。这样在编译的时候才能找到所需要的的文件。
②add_message_files(FILES Person.msg)
//指定msg文件,也就是将Person.msg作为我们定义的消息接口,然后在编译的时候就可以发现这个接口&#