ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange |
1 | initial version |
I managed to solve this problem (Note to self: Read the python docs). Turns out that a new process thread creates a copy of all the data from the parent, and I had not taken care of this properly.
The way I solved it was thus: I called the Popen
(listen_stat in this case) from the device method get_status:
def get_status(self):
varnum = 0 # for testing only
while not rospy.is_shutdown():
self.response_line = self.listen_stat.stdout.readline().split()
self.new_detect.value = int(self.response_line[varnum])
The important detail was declaring the variable new_detect
as a multiprocessing.Value() and then calling this function instead for the multiprocess.
stat_procs = []
for device in device_props:
sp = multiprocessing.Process(target=device.get_status)
stat_procs.append(sp)
sp.start()
The actual publisher then was just called in a normal loop:
try:
while not rospy.is_shutdown():
for device in device_props:
device.device_talker()
except (KeyboardInterrupt,rospy.ROSInterruptException,IOError) as e:
for p in stat_procs:
p.join()
Hope this helps the others.