除了ROS定义好的消息类型,我们还可以自己定义消息的类型。
定义msg文件
在我们首先定义好的功能包文件下创建msg文件夹,打开终端,在msg目录下运行 touch Person.msg ,创建msg文件。这里我们用到之前ROS发布者publisher和订阅者subscriber编程实现创建好的功能包learning_topic , 在learning_topic文件下创建的msg文件夹.
yue@yue-HP-288-Pro-G6-Microtower-PC:~/catkin_ws/src/learning_topic/msg$ touch Person.msg
自定义话题消息
在定义好的msg文件下,创建我们的话题消息,数据接口定义,文件和语言无关。
string name
uint8 sex
uint8 age
uint8 unkown = 0
uint8 male = 1
uint8 female = 2
添加功能包依赖
在learning_topic文件夹下package.xml中添加功能包依赖,一个是编译依赖,一个是执行依赖:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
编译依赖动态产生message
添加位置如图
接下来添加C++文件
将文末资料中的 person_publisher.cpp 和 person_subscriber.cpp 文件添加到learning_topic文件下的src文件中:
添加编译选项
在learning_topic文件夹下CMakeLists.txt中添加编译选项 : 在find_package中添加一个message_generation项:
添加把msg文件转化成对应的程序文件的配置项
add_message_files(FILES Person.msg) //确定定义接口
generate_messages(DEPENDENCIES std_msgs)//依赖已有的功能包
创建messge运行依赖
在catkin_package()中取消CATKIN_DEPENDS注释,末尾添加message_runtime:
到这里就完成了msg文件编译的基本配置。
回到catkin_ws根目录下进行编译 catkin_make
yue@yue-HP-288-Pro-G6-Microtower-PC:~/catkin_ws$ catkin_make
得到:编译成功
编译完成后在learning_topic下 的CMakeLists.txt 添加编译规则:
add_executable(person_publisher src/person_publisher.cpp)
target_link_libraries(person_publisher ${catkin_LIBRARIES})
add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp)
add_executable(person_subscriber src/person_subscriber.cpp)
target_link_libraries(person_subscriber ${catkin_LIBRARIES})
add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp)
再次进行编译,话题消息的定义就完成了。
话题消息使用
打开一个新的终端,运行roscore打开ROS;
再打开一个新的终端运行 rosrun learning_topic person_publisher,ROS发布person信息;
接着再打开一个终端运行 rosrun learning_topic person_subscriber,ROS会订阅person信息;
yue@yue-HP-288-Pro-G6-Microtower-PC:~$ rosrun learning_topic person_publisher
yue@yue-HP-288-Pro-G6-Microtower-PC:~$ rosrun learning_topic person_subscriber