У меня есть сборка ros, которая работает довольно хорошо. Я беру DataFrame координат (x, y, z) и преобразую их, по одному, в список из 4 углов. Затем этот список публикуется в одной теме, и каждый из 4 абонентских узлов берет свой угол из этого списка. Как только абоненты получают свои углы, они вызывают функцию для перемещения двигателя на этот угол.
Проблема, с которой я сталкиваюсь (меньше проблем, а больше желаний) состоит в том, что я хотел бы, чтобы 4 узла сообщили издателю, когда они закончили, и как только все четыре скажут, что они сделаны, тогдаИздатель отправит следующий набор ракурсов. В противном случае я должен предусмотреть максимально возможное время вращения, даже если операция займет часть этого времени.
Я изучил как службы, так и издателя / подписчика в одной системе и, похоже, не могу найти разумного решения.
Я приложил копию моего издателя и одного из моих подписчиков. Любые предложения?
ИЗДАТЕЛЬ:
def motorMaster():
'''
The Master Node defined as a function. Using a multiarray message, the 4 angles are calculated
by the functions brought in from motorControls and then published to a single topic. Each motor
pulls its respective command from that multiarray.
'''
angPub = Publisher('motAngs', Float32MultiArray, queue_size=10)
init_node('master', anonymous=True)
rate = Rate(.5)
while not is_shutdown():
for i in dataFrame.values:
angles = genAngles(list(i))
loginfo(angles)
angPub.publish(data=angles)
rate.sleep()
if __name__ == '__main__':
try:
motorMaster()
except ROSInterruptException:
pass
ПОДПИСЧИК:
def baseAngCall(data):
'''
Logs the angle calculated by the master and feeds it to the base motor.
'''
loginfo(data.data[0])
baseAng = data.data[0]
baseMotor.moveToAngle(baseAng)
def baseMotNode():
'''
Subscriber Node for the base motor.
'''
init_node('baseMotor', anonymous=True)
Subscriber('motAngs', Float32MultiArray, baseAngCall)
spin()
if __name__ == '__main__':
gpioInit(11, 12)
baseMotNode()
ПРИМЕЧАНИЕ. Многие из используемых функций размещены в другом файле Python, используемом в качестве модуля для хранения. узлы чистые.