Как переместить двух роботов одновременно с помощью MultiProcessing Python? - PullRequest
0 голосов
/ 26 апреля 2020

Здравствуйте. Я создал файл запуска, в котором я сгруппировал два ur5 с ns "robot1" и "robot2". Я публикую sh углы соединения в topi c "/ robot1 / arm_controller / command /" и "/ robot2 / arm_controller / command /", и оба робота двигаются нормально. Скажем, я выполнил две функции, которые отвечают за перемещение публикации углов соединения в соответствующих темах. т. е.

script.py

class MoveRobot(object):
    def __init__(self):
          rospy.init_node('move_robot')
          pass
    def publish_angles(self):
          reset_robot = JointTrajectoryPoint()
          reset_joint_values = self.joints
          reset_robot.positions = reset_joint_values
          reset_robot.time_from_start = rospy.Duration(0.5)
          self.traj.points = [reset_robot]
          self.action_pub.publish(self.traj)  
          rospy.sleep(2)

class Robot1(MoveRobot):
    def __init__(self):
         super(Robot1, self).__init__()
         self.action_pub = rospy.Publisher("robot1/arm_controller/command", JointTrajectory, queue_size=1)
         self.joints = [1.5708,-1.5708,0, 3.14159, -1.5708,0]
class Robot2(MoveRobot):
    def __init__(self):
         super(Robot2, self).__init__()
         self.action_pub = rospy.Publisher("robot2/arm_controller/command", JointTrajectory, queue_size=1)
         self.joints = [1.5708,-1.5708,0, 3.14159, -1.5708,0]

multiPro c .py

Итак, здесь я порождаю два процессора, чтобы одновременно публиковать sh объединенные значения в роботах и переместите их

import multiprocessing as mp
from script import MoveRobot, Robot1, Robot2

class Workers(mp.Process):
    def __init__(self, agent):
        super(Workers, self).__init__()
        self.agent = agent
    def run(self):
        self.agent.publish_angles()

class make_vectorized_agents():
    def __init__(self, robots):
        workers = []
        for r in (robots):
            w = Workers(r)
            workers.append(r)
            w.daemon = True
            w.start()
        for w in workers:
            w.join()
r1 = Robot1()
r2 = Robot2()
m = make_vectorized_agents([r1, r2])
Unfortunately, when I do it I get error as,

Process Worker-2:
Traceback (most recent call last):
    rospy.sleep(0.01)
  File "/opt/ros/melodic/lib/python2.7/dist-packages/rospy/timer.py", line 165, in sleep
    raise rospy.exceptions.ROSInterruptException("ROS shutdown request")
ROSInterruptException: ROS shutdown request
Process Worker-1:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 267, in _bootstrap
    self.run()
    raise rospy.exceptions.ROSInterruptException("ROS shutdown request")
ROSInterruptException: ROS shutdown request

Кажется, что rosnode не может работать с несколькими процессорами, потому что он отключается, когда два процесса работают одновременно. Или мне нужно что-то еще настроить?

...