切换至~/catkin_ws/src/learning_topic功能包目录下,然后新建一个文件夹,命名为msg,用来存放自定义的话题消息。
切换至msg目录下,新建一个空白的msg文件,以msg为后缀表示代表是msg文件。这里我们以Information.msg为例子说明下,把以下代码复制到刚刚创建好的msg文件里边。
string companystring city xxxxxxxxxx<build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>
xxxxxxxxxx在find_package里边加上message_generationadd_message_files(FILES Information.msg)generate_messages(DEPENDENCIES std_msgs)
xxxxxxxxxxcd ~/catkin_wscatkin_make
1)、切换至~/catkin_ws/src/learning_topic/src下,新建两个cpp文件,命名为Information_publisher.cpp和Information_subscriber.cpp,把以下代码分别复制到里边,
Information_publisher.cpp
x/** * 该例程将发布/company_info话题,消息类型是自定义的learning_topic::Information */
int main(int argc, char **argv){ // ROS节点初始化 ros::init(argc, argv, "company_Information_publisher");
// 创建节点句柄 ros::NodeHandle n;
// 创建一个Publisher,发布名为/company_info的topic,消息类型为learning_topic::Person,队列长度10 ros::Publisher Information_pub = n.advertise<learning_topic::Information>("/company_info", 10);
// 设置循环的频率 ros::Rate loop_rate(1);
int count = 0; while (ros::ok()) { // 初始化learning_topic::Information类型的消息 learning_topic::Information info_msg; info_msg.company = "Yahboom"; info_msg.city = "Shenzhen";
// 发布消息 Information_pub.publish(info_msg);
ROS_INFO("Information: company:%s city:%s ", info_msg.company.c_str(), info_msg.city.c_str());
loop_rate.sleep();// 按照循环频率延时 }
return 0;}
Information_subscriber.cpp
xxxxxxxxxx/** * 该例程将订阅/company_info话题,自定义消息类型learning_topic::Information */
// 接收到订阅的消息后,会进入消息回调函数处理数据void CompanyInfoCallback(const learning_topic::Information::ConstPtr& msg){ // 打印接收到的消息 ROS_INFO("This is: %s in %s", msg->company.c_str(), msg->city.c_str());}
int main(int argc, char **argv){ ros::init(argc, argv, "company_Information_subscriber");// 初始化ROS节点
ros::NodeHandle n;// 这里是创建节点句柄
// 创建一个Subscriber,订阅名话题/company_info的topic,注册回调函数CompanyInfoCallback ros::Subscriber person_info_sub = n.subscribe("/company_info", 10, CompanyInfoCallback);
ros::spin();// 循环等待回调函数
return 0;}
2)、修改CMakeLists.txt文件
xxxxxxxxxxadd_executable(Information_publisher src/Information_publisher.cpp)target_link_libraries(Information_publisher ${catkin_LIBRARIES})add_dependencies(Information_publisher ${PROJECT_NAME}_generate_messages_cpp)add_executable(Information_subscriber src/Information_subscriber.cpp)target_link_libraries(Information_subscriber ${catkin_LIBRARIES})add_dependencies(Information_subscriber ${PROJECT_NAME}_generate_messages_cpp)
3)、核心部分
这里的实现流程和之前的一样,主要不一样的就是引入头文件和使用自定义消息文件:
引入头文件是
xxxxxxxxxx#include "learning_topic/Information.h"
前边learning_topic是功能包名字,后边的Information.h是刚才创建的msg文件产生的头文件名字
使用自定义消息文件是
xxxxxxxxxxlearning_topic::Information info_msg;info_msg.company = "Yahboom";info_msg.city = "Shenzhen";void CompanyInfoCallback(const learning_topic::Information::ConstPtr& msg)
4)、运行程序
xxxxxxxxxxroscorerosrun learning_topic Information_publisherrosrun learning_topic Information_subscriber
5)、运行截图

6)、程序说明
Information_publisher作为发布者,不断向“/company_info”这个话题里边发布消息内容,并且打印发布的消息;而作为订阅者的Information_subscriber,也不断接收“/company_info”这个话题的内容,然后在回调函数里边打印出来。
1)、切换至~/catkin_ws/src/learning_topic/script下,新建两个py文件,命名为Information_publisher.py和Information_subscriber.py,把以下代码分别复制到里边,
Information_publisher.py
xxxxxxxxxx#!/usr/bin/env python# -*- coding: utf-8 -*-
import rospy
from learning_topic.msg import Information #导入自定义的msg
def information_publisher(): rospy.init_node('information_publisher', anonymous=True)# ROS节点初始化
# 创建一个Publisher,发布名为/company_info的topic,消息类型为learning_topic::Information,队列长度6 info_pub = rospy.Publisher('/company_info', Information, queue_size=6)
rate = rospy.Rate(10) #设置循环的频率
while not rospy.is_shutdown():
# 初始化learning_topic::Information 类型的消息 info_msg = Information() info_msg.company = "Yahboom"; info_msg.city = "Shenzhen"; info_pub.publish(info_msg)# 发布消息
rospy.loginfo("This is %s in %s.", info_msg.company, info_msg.city)# 打印发布消息 rate.sleep()# 按照循环频率延时
if __name__ == '__main__': try: information_publisher() except rospy.ROSInterruptException: pass
Information_subscriber.py
xxxxxxxxxx#!/usr/bin/env python# -*- coding: utf-8 -*-
import rospy
from learning_topic.msg import Information #导入自定义的msg
def CompanyInfoCallback(msg):
rospy.loginfo("company: name:%s city:%s ", msg.company, msg.city)#打印订阅接收到信息
def Infomation_subscriber(): rospy.init_node('Infomation_subscriber', anonymous=True)# ROS节点初始化
# 创建一个Subscriber,订阅名为/company_info的topic,注册回调函数personInfoCallback rospy.Subscriber("/company_info", Information, CompanyInfoCallback)
rospy.spin()# 循环等待回调函数
if __name__ == '__main__': Infomation_subscriber()
2)、核心部分
这里主要是说明下如何导入自定义的消息模块和使用:
导入
xxxxxxxxxxfrom learning_topic.msg import Information使用
xxxxxxxxxxinfo_msg = Person()info_msg.company = "Yahboom";info_msg.city = "Shenzhen";3)、运行程序
运行程序前,先给py文件增加可执行权限
xxxxxxxxxxsudo chmod a+x Information_subscriber.pysudo chmod a+x Information_publisher.py
运行程序
xxxxxxxxxxroscorerosrun learning_topic Information_publisher.pyrosrun learning_topic Information_subscriber.py
4)、运行截图
