My Publisher is not publishing continuously, can you please tell me how can I subscribe/publish and advertise services in the same time? thanks in advance.
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import rospy
from std_msgs.msg import String, Bool
from state_controller.srv import ActorChange, ActorChangeResponse
class StateController:
def __init__(self):
self.accum_plan = {}
rospy.init_node("state_controller", anonymous=True, log_level=rospy.INFO)
self.accPlan_pub = rospy.Publisher("accumulated_plan", String, queue_size=10)
self.stateReader()
def stateReader(self):
"""
subscribe to model/lego_map/yumi_motion_status
"""
self.accPlan_pub.publish(json.dumps(self.accum_plan))
rospy.Subscriber("model", String, self.modelRec)
rospy.Service("change_actor", ActorChange, self.changeActor)
rospy.sleep(3)
rospy.spin()
## Subscriber CallBacks
def modelRec(self, data):
""" """
model = json.loads(data.data)
if model != self.old_model:
self.old_model = model
def changeActor(self, req):
""" """
lego = req.data
return ActorChangeResponse(True)
if __name__ == "__main__":
try:
controller_ = StateController()
except rospy.ROSInterruptException:
logging.error("Error in the State Controller")
You probably meant to do something like
#! /usr/bin/env python3
# -*- coding: utf-8 -*-
import json
import rospy
from std_msgs.msg import String, Bool
from state_controller.srv import ActorChange, ActorChangeResponse
class StateController:
def __init__(self):
self.accum_plan = {}
rospy.init_node("state_controller", anonymous=True, log_level=rospy.INFO)
self.accPlan_pub = rospy.Publisher("accumulated_plan", String, queue_size=10)
rospy.Subscriber("model", String, self.modelRec)
rospy.Service("change_actor", ActorChange, self.changeActor)
self.stateReader()
def stateReader(self):
"""
subscribe to model/lego_map/yumi_motion_status
"""
r = rospy.Rate(3) # 10hz
while not rospy.is_shutdown():
self.accPlan_pub.publish(json.dumps(self.accum_plan))
r.sleep()
## Subscriber CallBacks
def modelRec(self, data):
""" """
model = json.loads(data.data)
if model != self.old_model:
self.old_model = model
def changeActor(self, req):
""" """
lego = req.data
return ActorChangeResponse(True)
if __name__ == "__main__":
try:
controller_ = StateController()
except rospy.ROSInterruptException:
logging.error("Error in the State Controller")
Where your publishers/subscribers/services are set up in the constructor, and then using another method to trigger the loop of the publishing topic