一、目的
在ROS Master中,可以发布与订阅已经定义好的消息,比如海龟的运动、位姿等信息。但有时我们需要自己定义消息的类型。
本节主要目的为定义一个Person个人信息,Publisher发布个人信息,Subscriber订阅个人信息。
二、自定义话题消息
1. 定义msg文件
在功能包learning_topic
文件夹中新建一个文件夹msg
,在此文件夹内创建一个Person.msg
文件,在其中添加以下代码
1 2 3 4 5 6 7
| string name uint8 sex uint8 age
uint8 unknown=0 uint8 male=1 uint8 female=2
|
注:uint8
和string
,在不同程序里面需要扩展成对应的格式,因此需要先进行一些配置。
2. 在package.xml文件中添加功能包依赖
在文件末尾部分,添加如下代码
1
| <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
|
build_depend,编译依赖,依赖一个动态产生message的功能包
exec_depend,执行依赖, 依赖message运行时间的功能包
3. 在CMakeLists.txt添加编译选项
首先在find_package
内添加一条语句,用以添加依赖的功能包
1 2 3 4 5 6 7 8
| find_package(catkin REQUIRED COMPONENTS geometry_msgs roscpp rospy std_msgs turtlesim message_generation )
|
在此函数下面再添加
1 2 3 4 5 6 7 8 9
| add_message_files( FILES Person.msg )
generate_messages( DEPENDENCIES std_msgs )
|
add_message_files,将Person.msg作为定义的接口
generate_messages,在编译Person.msg文件时需要依赖的功能包
然后在下方catkin specific configuration
内的catkin_packages
中,添加依赖message_runtime
,修改后的代码如下:
1 2 3 4 5 6
| catkin_package( # INCLUDE_DIRS include # LIBRARIES learning_topic CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime # DEPENDS system_lib )
|
4. 编译生成相关文件
1 2
| cd ~/catkin_ws catkin_make
|
三、创建发布者
在~/catkin_ws/src/learning_topic/src
文件夹下创建person_publisher.cpp
文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
#include <ros/ros.h> #include "learning_topic/Person.h"
int main(int argc, char **argv) { ros::init(argc, argv, "person_publisher");
ros::NodeHandle n;
ros::Publisher person_info_pub = n.advertise<learning_topic::Person>("/person_info", 10);
ros::Rate loop_rate(1);
int count = 0; while (ros::ok()) { learning_topic::Person person_msg; person_msg.name = "huffie"; person_msg.age = 21; person_msg.sex = learning_topic::Person::male;
person_info_pub.publish(person_msg);
ROS_INFO("Publish Person Info: name:%s age:%d sex:%d", person_msg.name.c_str(), person_msg.age, person_msg.sex);
loop_rate.sleep(); }
return 0; }
|
四、创建订阅者
在~/catkin_ws/src/learning_topic/src
文件夹下创建person_subscriber.cpp
文件,内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
|
#include <ros/ros.h> #include "learning_topic/Person.h"
void personInfoCallback(const learning_topic::Person::ConstPtr& msg) { ROS_INFO("Subcribe Person Info: name:%s age:%d sex:%d", msg->name.c_str(), msg->age, msg->sex); }
int main(int argc, char **argv) { ros::init(argc, argv, "person_subscriber");
ros::NodeHandle n;
ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback);
ros::spin();
return 0; }
|
五、配置发布者/订阅者代码编译规则
在CMakeLists.txt
文件的build
区域内添加如下代码
1 2 3 4 5 6 7
| 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)
|
六、编译与运行
首先进行编译,回到主目录
1 2
| cd ~/catkin_ws catkin_make
|
运行roscore
运行订阅者Subscriber
1
| rosrun learning_topic person_subscriber
|
运行发布者Publisher
1
| rosrun learning_topic person_Publisher
|
可以看到发布者在发布个人信息,订阅者在接受信息。