ros1学习之发布订阅
简单的发布订阅std_msg string
实现流程:如下
发布流程
实现流程:
1.导包
2.初始化 ROS 节点:命名(唯一)
3.实例化 发布者 对象
4.组织被发布的数据,并编写逻辑发布数据
订阅流程
实现流程:
1.导包
2.初始化 ROS 节点:命名(唯一)
3.实例化 订阅者 对象
4.处理订阅的消息(回调函数)
5.设置循环调用回调函数
代码部分:
发布方实现
#! /usr/bin/env python
import rospy
from std_msgs.msg import String
if __name__ == "__main__":
rospy.init_node("sandai") #初始化节点
pub = rospy.Publisher("che",String,queue_size=10) #发布
#发布逻辑
# 1、创建数据
msg = String()
rate = rospy.Rate(1) 设置频率1s/次
count = 0
# 2、循环发布数据
while not rospy.is_shutdown():
count+=1
msg.data = "hello" + str(count) #创建数据
pub.publish(msg)
rospy.loginfo("发布的数据:%s",msg.data)
rate.sleep()
订阅方实现:
#! /usr/bin/env python
import rospy
from std_msgs.msg import String
def domsg(msg):
rospy.loginfo("订阅的数据为:%s",msg.data)
if __name__ == "__main__":
rospy.init_node("huahau")
sub = rospy.Subscriber("che",String,domsg,queue_size=10)
rospy.spin()
自定义的msg消息发布和订阅
首先需要在功能包下面创建一个msg文件夹,然后需要修改cmakelist.txt,package.xml文件的内容,具体如何修改参考这部分:ros1——noetic版本 细节性配置记录(python)-CSDN博客
msgs只是简单的文本文件,每行具有字段类型和字段名称,可以使用的字段类型有:
-
int8, int16, int32, int64 (或者无符号类型: uint*)
-
float32, float64
-
string
-
time, duration
-
other msg files
-
variable-length array[] and fixed-length array[C]
这里在自定义完文件夹并且编译之后,如果用vscode,可以选择添加路径到setting.json里去
{
"python.autoComplete.extraPaths": [
"/opt/ros/noetic/lib/python3/dist-packages",
"/xxx/yyy工作空间/devel/lib/python3/dist-packages"
]
}
实现逻辑:
第一步:定义消息
string name
uint16 age
float64 height
第二步:上代码!!!
发布方实现:
#! /usr/bin/env python
import rospy
from plumbing_pub_sub.msg import Person 从功能包中导入 from 功能包名.msg import 消息名称
if __name__=="__main__":
rospy.init_node("Person")
pub = rospy.Publisher("person",Person,queue_size=10)
#创建数据
person = Person()
person.name="奥特曼"
person.age = 18
person.height = 1.85
rate = rospy.Rate(1)
while not rospy.is_shutdown():
pub.publish(person)
rospy.loginfo("发布的消息为:%s,%d,%f",person.name,person.age,person.height)
rate.sleep()
订阅方实现:
#! /usr/bin/env python
import rospy
from plumbing_pub_sub.msg import Person
def doperson(person):
rospy.loginfo("订阅的数据为:%s,%d,%f",person.name,person.age,person.height)
if __name__ == "__main__":
rospy.init_node("daye")
sub = rospy.Subscriber("person",Person,doperson)
rospy.spin()