教程为赵虚左的天地良心ROS课程:link
话题通讯
话题通讯自定义msg调用
在第二节中我们使用的通讯内容是std_msgs里面的String格式,也就是字符串格式,现在我们可以定义任意组合类型的消息去发送接收。
需求
编写发布订阅实现,要求发布方以1HZ(每秒1次)的频率发布自定义消息,订阅方订阅自定义消息并将消息内容打印输出。
大致流程不变,只不过将String改为我们自己定义的数据类型
代码实现如下
0.vscode配置
为了方便代码提示以及误抛异常,需要先配置 vscode,将前面生成的 python 文件路径配置进 settings.json(可以在vscode左侧打开相应目录,右键点击在集成终端中打开
,输入pwd,复制地址)
{
"python.autoComplete.extraPaths": [
"/opt/ros/noetic/lib/python3/dist-packages",
"/xxx/yyy工作空间/devel/lib/python3/dist-packages"
]
}
PS:这里我后面将下面analysis的加上之后才能自动提示
1.发布方
#! /usr/bin/env python
import rospy
from pub_sub.msg import ShoppingLists
if __name__ =="__main__":
#初始化ros节点
rospy.init_node("buyer")
#创建发布者
pub = rospy.Publisher("egg",ShoppingLists,queue_size=10)
#创建数据,组织消息
msg1 = ShoppingLists()
msg1.product1_name = "egg"
msg1.product2_name = 'tomato'
#创建发布频率
rate = rospy.Rate(1)
count =0
while not rospy.is_shutdown():
count += 1
msg1.num1 += 1
msg1.num2 += 2
#发布数据
pub.publish(msg1)
rate.sleep()
#打印数据
rospy.loginfo("买了%s %d个,%s %d个.",msg1.product1_name,msg1.num1,msg1.product2_name,msg1.num2)
2.订阅方
#! /usr/bin/env python
import rospy
from pub_sub.msg import ShoppingLists
def doMsg(msg):
if msg.product1_name == "egg":
rospy.loginfo("我要%d个鸡蛋",msg.num2)
else:
rospy.loginfo("我要%d个鸡蛋",msg.num2)
if __name__ == "__main__":
#初始化ros节点
rospy.init_node("egg_cook")
#创建接受对象
sub = rospy.Subscriber("egg_buy",ShoppingLists,doMsg,queue_size=10)
#回调
rospy.spin()
之后不要忘记添加可执行权限,配置CMakeLists,启动roscore,启动文件。