话题模型(发布/订阅)
笔者用的是Python,所以需要在功能包下面创建一个scripts
文件夹。
roscd learning_communication
mkdir scripts
创建一个string_publisher.py
文件,在里面编写如下代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def publisher():
rospy.init_node('string_publisher', anonymous=True)
pub = rospy.Publisher('chatter', String, queue_size=10)
rate = rospy.Rate(10) # 10hz
while not rospy.is_shutdown():
hello_str = "hello world %s" % rospy.get_time()
rospy.loginfo(hello_str)
pub.publish(hello_str)
rate.sleep()
if __name__ == '__main__':
try:
publisher()
except rospy.ROSInterruptException:
pass
上面的代码就简单的实现了一个发布者,具体步骤如下:
- 初始化节点;
- 向ROS Master注册节点信息,包括发布的话题名称和话题中的消息类型;
- 设定消息循环发送频率;
- 创建消息数据,按一定的频率循环发布消息。
创建一个string_subscriber.py
文件,编写订阅者:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(data):
rospy.loginfo(data.data)
def subscriber():
rospy.init_node('string_subscriber', anonymous=True)
rospy.Subscriber('chatter', String, callback)
rospy.spin()
if __name__ == '__main__':
subscriber()
订阅者实现步骤:
- 初始化ROS节点;
- 订阅需要的话题;
- 通过
spin()
循环等待话题消息,接收到消息后进入回调函数; - 在回调函数中完成消息处理。