Опубликовать, когда несколько узлов закончили использовать данные? ROSPY - PullRequest
0 голосов
/ 04 октября 2019

У меня есть сборка 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, используемом в качестве модуля для хранения. узлы чистые.

...