建立msg文件夹,添加msg文件:Person.msg(首字母大写)
定义话题信息
string name uint8 age uint8 sex uint8 unknown = 0 uint8 male = 1 uint8 female = 2
1.package.xml加入:
<build_depend>message_generation</build_depend> <exec_depend>message_runtime</exec_depend>
2.cmakelist中添加黄色部分
#在开头
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp
rospy
std_msgs
turtlesim
message_generation
)
#在ros message那块
add_message_files(
FILES
Person.msg
)
generate_messages(
DEPENDENCIES
std_msgs# std_msgs
)
#在 catkin specific configuration
catkin_package(
CATKIN_DEPENDS
message_runtime
)
3.编译
cd ~/workspace/catkin_ws
catkin_make
4.在~/workspace/catkin_ws/devel/include/learning_topic目录下生成了Person.h
----------------------------------------------------------------------------------------
5.发布话题,订阅话题
/*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************/ /** * 该例程将发布/person_info话题,自定义消息类型learning_topic::Person */ #include <ros/ros.h> #include "learning_topic/Person.h" int main(int argc, char **argv) { // ROS节点初始化 ros::init(argc, argv, "person_publisher"); // 创建节点句柄 ros::NodeHandle n; // 创建一个Publisher,发布名为/person_info的topic,消息类型learning_topic::Person,队列长度10 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类型的消息 learning_topic::Person person_msg; person_msg.name = "Tom"; person_msg.age = 18; 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; }
/*********************************************************************** Copyright 2020 GuYueHome (www.guyuehome.com). ***********************************************************************/ /** * 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person */ #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节点 ros::init(argc, argv, "person_subscriber"); // 创建节点句柄 ros::NodeHandle n; // 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback ros::Subscriber person_info_sub = n.subscribe("/person_info", 10, personInfoCallback); // 循环等待回调函数 ros::spin(); return 0; }
6.编译,在cmakelist中加入
add_executable(person_publisher src/person_publisher.cpp) add_executable(person_subscriber src/person_subscriber.cpp) add_dependencies(person_publisher ${PROJECT_NAME}_generate_messages_cpp) add_dependencies(person_subscriber ${PROJECT_NAME}_generate_messages_cpp) target_link_libraries(person_publisher ${catkin_LIBRARIES}) target_link_libraries(person_subscriber ${catkin_LIBRARIES})
在终端
catkin_make
---------------------------------
7.执行
终端1:roscore
终端2:rosrun learning_topic person_publisher
终端3:rosrun learning_topic person_subscriber
———————————————————————————————————————————————————————————————————————————————————————————————————Python———————————————————————————————————
———————————————————————————————————————————————————————————————————————————
代码:
publisher
#!/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################## #### Copyright 2020 GuYueHome (www.guyuehome.com). ### ######################################################################## # 该例程将发布/person_info话题,自定义消息类型learning_topic::Person import rospy from learning_topic.msg import Person def velocity_publisher(): # ROS节点初始化 rospy.init_node('person_publisher', anonymous=True) # 创建一个Publisher,发布名为/person_info的topic,消息类型为learning_topic::Person,队列长度10 person_info_pub = rospy.Publisher('/person_info', Person, queue_size=10) #设置循环的频率 rate = rospy.Rate(10) while not rospy.is_shutdown(): # 初始化learning_topic::Person类型的消息 person_msg = Person() person_msg.name = "Tom"; person_msg.age = 18; person_msg.sex = Person.male; # 发布消息 person_info_pub.publish(person_msg) rospy.loginfo("Publsh person message[%s, %d, %d]", person_msg.name, person_msg.age, person_msg.sex) # 按照循环频率延时 rate.sleep() if __name__ == '__main__': try: velocity_publisher() except rospy.ROSInterruptException: pass
subscriber
#!/usr/bin/env python # -*- coding: utf-8 -*- ######################################################################## #### Copyright 2020 GuYueHome (www.guyuehome.com). ### ######################################################################## # 该例程将订阅/person_info话题,自定义消息类型learning_topic::Person import rospy from learning_topic.msg import Person def personInfoCallback(msg): rospy.loginfo("Subcribe Person Info: name:%s age:%d sex:%d", msg.name, msg.age, msg.sex) def person_subscriber(): # ROS节点初始化 rospy.init_node('person_subscriber', anonymous=True) # 创建一个Subscriber,订阅名为/person_info的topic,注册回调函数personInfoCallback rospy.Subscriber("/person_info", Person, personInfoCallback) # 循环等待回调函数 rospy.spin() if __name__ == '__main__': person_subscriber()
执行方法:直接运行