def test_aggregation_newframe(self):
        """
        test aggregation_newframe method
        :return:
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.NEWFRAME})

        now = rospy.Time(secs=500000)

        testlist = {'robot': []}

        # replaced by fourth robot1 message
        msg = SoMessage(Header(None, now - rospy.Duration(10), 'robot'),
                        'robot1', Vector3(2.1, 2.2, 0), Quaternion(),
                        Vector3(), 1, 4.0, 1.0, 0.8, 5, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now - rospy.Duration(5), 'robot'),
                        'robot5', Vector3(2.1, 2.2, 0), Quaternion(),
                        Vector3(), 1, 4.0, 1.0, 0.8, 5, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'robot'), 'robot3',
                        Vector3(2.1, 2.2, 0), Quaternion(), Vector3(), 1, 4.0,
                        1.0, 0.8, 5, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'robot'), 'robot1',
                        Vector3(2.1, 2.2, 0), Quaternion(), Vector3(), 1, 4.0,
                        1.0, 0.8, 5, None, False, [])
        testlist['robot'].append(msg)
        bffr.store_data(msg, now)

        self.assertEqual(bffr._static, testlist)
Exemplo n.º 2
0
    def test_morphogenesis(self):
        """
        test class morphogenesis barycenter
        """

        bffr = SoBuffer()
        morph = MorphogenesisBarycenter(bffr, 'morphogenesis', 'dist')

        bffr._moving = {
            'morphogenesis': {
                'robot1': [
                    SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                              Vector3(), 1, 1.0, 1.0, 1.0, 0, None, True,
                              {'dist': 7.0})
                ],
                'robto2': [
                    SoMessage(None, None, Vector3(1, 2, 0), Quaternion(),
                              Vector3(), 1, 2.0, 1.0, 1.0, 0, None, True,
                              {'dist': 4.0})
                ]
            }
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 0), Quaternion(), Vector3(), 1,
                      1.0, 1.0, 1.0, 0, None, False, {'dist': 5.0})
        ]

        self.assertEqual(morph.state, 'None')
        self.assertEqual(morph.calc_value()[0], np.sqrt(2) + 1)
        self.assertEqual(morph.calc_value()[1], 'Center')
Exemplo n.º 3
0
    def test_gossip(self):
        """
        test class gossip max
        """

        bffr = SoBuffer()
        gossip = GossipMax(bffr, 'gossip', 'max')

        bffr._moving = {
            'gossip': {
                'robot1': [
                    SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                              Vector3(), 1, 1.0, 1.0, 1.0, 0, None, True,
                              {'max': 1.0})
                ],
                'robot2': [
                    SoMessage(None, None, Vector3(1, 2, 0), Quaternion(),
                              Vector3(), 1, 2.0, 1.0, 1.0, 0, None, True,
                              {'max': 4.0})
                ],
                'robot4': [
                    SoMessage(None, None, Vector3(5, 6, 0), Quaternion(),
                              Vector3(), 1, 2.0, 1.0, 1.0, 0, None, True,
                              {'max': 8.9})
                ]
            }
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 0), Quaternion(), Vector3(), 1,
                      1.0, 1.0, 1.0, 0, None, False, {'max': '3.0'})
        ]

        self.assertEqual(gossip.calc_value()[0], 4.0)
Exemplo n.º 4
0
    def test_goal_gradient(self):
        """
        test goal gradient method of chemotaxisBalch Behaviour
        :return:
        """
        bffr = SoBuffer()
        chem = ChemotaxisBalch(bffr, moving=False, static=True, maxvel=np.inf)

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 2, 3), Quaternion(), Vector3(),
                      -1, 3.0, 0.0, 1.0, 0, None, False, [])
        ]

        bffr._static = {
            'gradient': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(2, 2, 2), Quaternion(),
                          Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False, [])
            ],
            'None': [
                SoMessage(None, None, Vector3(0, 3, 2), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 10, 0, None, False, []),
                SoMessage(None, None, Vector3(5, 6, 3), Quaternion(),
                          Vector3(), 1, 2.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        self.assertEqual(calc.vector_length(chem.goal_gradient()),
                         np.sqrt(2) - 1)

        # no gradient within view
        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, None)
Exemplo n.º 5
0
    def test_follow_all(self):
        """
        test aggregate all method
        :return:
        """
        bffr = SoBuffer()
        chem = FollowAll(bffr, moving=False, static=True, maxvel=np.inf)

        bffr._static = {
            'gradient': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(2, 2, 2), Quaternion(),
                          Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False, [])
            ],
            'None': [
                SoMessage(None, None, Vector3(0, 3, 2), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(5, 6, 3), Quaternion(),
                          Vector3(), 1, 2.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 2, 3), Quaternion(), Vector3(),
                      -1, 3.0, 0.0, 1.0, 0, None, False, [])
        ]

        # only one frameID + repulsive gradient is not considered as outside
        # view distance
        chem.frames = ['gradient']
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(0.29, 0.0, -0.29))

        # all frameIDs - everything within view is aggregated
        chem.frames = []
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(0.73, -0.44, 0.14))

        # noe gradient within view
        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, None)

        bffr._static = {
            'test': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, Vector3())
    def test_evaporation_msg(self):
        """
        test the evaporation of one specified message
        :return:
        """
        bffr = SoBuffer(min_diffusion=1.0)
        now = rospy.Time(secs=500000)

        # with goal radius --> should be kept
        msg = SoMessage(Header(None, now - rospy.Duration(45), 'None'), None,
                        Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, now - rospy.Duration(45), False, [])
        result = SoMessage(Header(None, now - rospy.Duration(45), 'None'),
                           None, Vector3(1, 1, 0), Quaternion(), Vector3(), 1,
                           4.0 * (0.8 ** 9), 1.0, 0.8, 5, now, False, [])
        self.assertEqual(bffr._evaporate_msg(msg, now), result)

        # following tests do not seem to be valid!
        # ########################################
        # without goal radius --> should be deleted
        # msg = SoMessage(Header(None, now - rospy.Duration(45), 'None'), None,
        #                 Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
        #                 0.8, 5, now - rospy.Duration(45), False, [])
        # msg = bffr._evaporate_msg(msg)
        # self.assertEqual(msg, None)

        # without goal radius & ev time is 0, ev factor < 1
        # --> should be deleted
        # msg = SoMessage(Header(None, now - rospy.Duration(45), 'None'), None,
        #                 Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
        #                 0.8, 0, now - rospy.Duration(45), False, [])
        # msg = bffr._evaporate_msg(msg)
        # self.assertEqual(msg, None)

        # without goal radius & ev time is 0, ev factor == 1.0
        # --> kept as it is
        msg = SoMessage(Header(None, now - rospy.Duration(45), 'None'), None,
                        Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                        1.0, 0, now - rospy.Duration(45), False, [])
        result = SoMessage(Header(None, now - rospy.Duration(45), 'None'),
                           None, Vector3(1, 1, 0), Quaternion(), Vector3(), 1,
                           4.0, 0.0, 1.0, 0, now - rospy.Duration(45), False,
                           [])
        self.assertEqual(bffr._evaporate_msg(msg, now), result)

        # with goal radius & ev time is 0, ev factor < 1.0
        msg = SoMessage(Header(None, now - rospy.Duration(45), 'None'), None,
                        Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.0, 0, now - rospy.Duration(45), False, [])
        result = SoMessage(Header(None, now - rospy.Duration(45), 'None'),
                           None, Vector3(1, 1, 0), Quaternion(), Vector3(), 1,
                           0.0, 1.0, 0.0, 0, now - rospy.Duration(45), False,
                           [])
        self.assertEqual(bffr._evaporate_msg(msg, now), result)
Exemplo n.º 7
0
    def test_quorum(self):
        """
        test quorum sensing class
        :return:
        """

        bffr = SoBuffer()

        quorum = Quorum(bffr, 2)

        self.assertEqual(quorum.calc_value()[1], False)

        # 2 neighbors within view, one outside view
        bffr._moving = {
            'robot': {
                'robot1': [
                    SoMessage(),
                    SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                              Vector3(), 1, 1.0, 1.0, 1.0, 0, None, True, [])
                ],
                'robot2': [
                    SoMessage(),
                    SoMessage(None, None, Vector3(5, 6, 0), Quaternion(),
                              Vector3(), 1, 2.0, 1.0, 1.0, 0, None, True, [])
                ],
                'robot3': [
                    SoMessage(),
                    SoMessage(),
                    SoMessage(None, None, Vector3(1, 2, 0), Quaternion(),
                              Vector3(), 1, 4.0, 1.0, 1.0, 0, None, True, [])
                ],
                'robot4': []
            }
        }

        bffr._static = {
            'None': [
                SoMessage(None, None, Vector3(5, 6, 5), Quaternion(),
                          Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 1), Quaternion(), Vector3(), 1,
                      1.0, 1.0, 1.0, 0, None, False, [])
        ]

        self.assertEqual(quorum.calc_value()[1], True)

        quorum.threshold = 3
        self.assertEqual(quorum.calc_value()[1], False)
    def test_store_data_ev(self):
        """
        test store_data method, evaporation of received data
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.MAX})
        testlist = {'None': []}
        now = rospy.Time(secs=500000)

        # not to be stored - ev time is zero, no goal radius
        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        1, 4.0, 0.0, 0.3, 0, None, False, [])
        bffr.store_data(msg, now)

        # received data is older than stored one, will be evaporated
        # and than compared
        msg = SoMessage(Header(None, now - rospy.Duration(10), None), None,
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, now - rospy.Duration(10), False, [])
        result = SoMessage(Header(None, now - rospy.Duration(10), 'None'),
                           'None', Vector3(2, 2, 0), Quaternion(), Vector3(),
                           1, 4.0 * (0.8 ** 2), 1.0, 0.8, 5, now, False, [])
        testlist['None'].append(result)
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now - rospy.Duration(15), None), None,
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, now - rospy.Duration(15), False, [])
        bffr.store_data(msg, now)

        self.assertEqual(bffr._static, testlist)
Exemplo n.º 9
0
    def test_de_serialization(self):

        test_str = "FoooBArr\n"

        test_float = np.pi

        test_dict = {'bla': test_str, 'foo': test_float}

        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        1, 1.0, 1.0, 1.0, 0, None, True, [])
        msg.payload = test_dict

        original_msg = deepcopy(msg)

        bffr = SoBuffer()

        broadcaster = SoBroadcaster()

        rospy.sleep(0.5)

        broadcaster.send_data(msg)

        rospy.sleep(0.5)

        gradients = bffr.all_gradients()

        self.assertEqual(gradients[0].payload, original_msg.payload)

        # other simple payload

        msg.payload = np.pi
        msg.parent_frame = 'float_msg'

        original_msg = deepcopy(msg)

        broadcaster.send_data(msg)

        rospy.sleep(0.5)

        gradients = bffr.all_gradients()

        self.assertEqual(gradients[0].payload, original_msg.payload)
    def test_gradients(self):
        """
        test gradients method
        """
        bffr = SoBuffer(view_distance=2.0)

        # 2 neighbors within view, one outside view
        bffr._moving = {
            'robot': {
                'robot1': [SoMessage(),
                           SoMessage(None, None, Vector3(2, 2, 0),
                                     Quaternion(), Vector3(), 1, 1.0, 1.0, 1.0,
                                     0, None, True, [])],
                'robot2': [SoMessage(),
                           SoMessage(None, None, Vector3(5, 6, 0),
                                     Quaternion(), Vector3(), 1, 2.0, 1.0, 1.0,
                                     0, None, True, [])],
                'robot3': [SoMessage(),
                           SoMessage(),
                           SoMessage(None, None, Vector3(1, 2, 0),
                                     Quaternion(), Vector3(), -1, 4.0, 1.0,
                                     1.0, 0, None, True, [])],
                'robot4': []
            }
        }

        bffr._static = {
            'None': [SoMessage(None, None, Vector3(2, 1, 0), Quaternion(),
                               Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False,
                               []), SoMessage()],
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 1), Quaternion(), Vector3(), 1,
                      1.0, 1.0, 1.0, 0, None, False, [])]

        result = [
            SoMessage(None, None, Vector3(1, 2, 0), Quaternion(), Vector3(),
                      -1, 4.0, 1.0, 1.0, 0, None, True, []),
            SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                      1.0, 1.0, 1.0, 0, None, True, [])
        ]

        self.assertEqual(bffr.gradients(static=False, time=self.now), result)

        result = [SoMessage(None, None, Vector3(2, 1, 0), Quaternion(),
                            Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False, []),
                  SoMessage(None, None, Vector3(1, 2, 0), Quaternion(),
                            Vector3(), -1, 4.0, 1.0, 1.0, 0, None, True, []),
                  SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                            Vector3(), 1, 1.0, 1.0, 1.0, 0, None, True, [])]

        self.assertEqual(bffr.gradients(time=self.now), result)
    def test_agent_list(self):
        """
        test agent list function
        :return:
        """
        bffr = SoBuffer(view_distance=2.0)

        self.assertEqual(bffr.agent_list([bffr.pose_frame], time=self.now), [])

        # 2 neighbors within view, one outside view
        bffr._moving = {
            'robot': {
                'robot1': [SoMessage(),
                           SoMessage(None, None, Vector3(2, 2, 0),
                                     Quaternion(), Vector3(), 1, 1.0, 1.0, 1.0,
                                     0, None, True, [])],
                'robot2': [SoMessage(),
                           SoMessage(None, None, Vector3(5, 6, 0),
                                     Quaternion(), Vector3(), 1, 2.0, 1.0, 1.0,
                                     0, None, True, [])],
                'robot3': [SoMessage(),
                           SoMessage(),
                           SoMessage(None, None, Vector3(1, 2, 0),
                                     Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0,
                                     0, None, True, [])],
                'robot4': []
            }
        }

        bffr._static = {
            'None': [SoMessage(None, None, Vector3(5, 6, 5), Quaternion(),
                               Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False,
                               []), SoMessage()],
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 1), Quaternion(), Vector3(),
                      1, 1.0, 1.0, 1.0, 0, None, False, [])]

        result = [
            SoMessage(None, None, Vector3(1, 2, 0), Quaternion(), Vector3(), 1,
                      4.0, 1.0, 1.0, 0, None, True, []),
            SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                      1.0, 1.0, 1.0, 0, None, True, [])]

        self.assertEqual(bffr.agent_list([bffr.pose_frame], time=self.now), result)
        self.assertEqual(bffr.agent_list([bffr.pose_frame], time=self.now), result)
    def test_static_list_angle(self):
        """
        test static_list_angle method
        :return:
        """

        bffr = SoBuffer(view_distance=2.0)

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 0), Quaternion(),
                      Vector3(1, 0, 0), 1, 1.0, 1.0, 1.0, 0, None, False, [])]

        bffr._static = {
            'None': [SoMessage(None, None, Vector3(2, 1, 3), Quaternion(),
                               Vector3(), 1, 1.0, 0.1, 1.0, 0, None, False,
                               []),
                     SoMessage(None, None, Vector3(3, 3, 0), Quaternion(),
                               Vector3(), -1, 0.2, 0.5, 1.0, 0, None, False,
                               []),
                     SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                               Vector3(), 1, 5.0, 0.2, 1.0, 0, None, False,
                               []),
                     ],
            'Center': [SoMessage(None, None, Vector3(1, 1.8, 0), Quaternion(),
                                 Vector3(), -1, 8.0, 1.0, 1.0, 0, None, False,
                                 []),
                       SoMessage(None, None, Vector3(0, 0, 0), Quaternion(),
                                 Vector3(), -1, 3.0, 0.1, 1.0, 0, None, False,
                                 [])]
        }

        result = [SoMessage(None, None, Vector3(1, 1.8, 0), Quaternion(),
                            Vector3(), -1, 8.0, 1.0, 1.0, 0, None, False, []),
                  SoMessage(None, None, Vector3(0, 0, 0), Quaternion(),
                            Vector3(), -1, 3.0, 0.1, 1.0, 0, None, False, [])]

        self.assertEqual(bffr.static_list_angle(['Center'], np.pi, time=self.now), result)

        self.assertEqual(bffr.static_list_angle(['Center'], np.pi/2, time=self.now),
                         [SoMessage(None, None, Vector3(1, 1.8, 0),
                                    Quaternion(), Vector3(), -1, 8.0, 1.0, 1.0,
                                    0, None, False, [])])

        self.assertEqual(bffr.static_list_angle(['Center'], 0, time=self.now), [])
    def test_max_attractive_gradient(self):
        """
        test max attractive and strongest gradient methods
        """
        bffr = SoBuffer(view_distance=2.0)

        bffr._static = {
            'None': [SoMessage(None, None, Vector3(2, 1, 3), Quaternion(),
                               Vector3(), 1, 1.0, 0.1, 1.0, 0, None, False,
                               []),
                     SoMessage(None, None, Vector3(3, 3, 0), Quaternion(),
                               Vector3(), -1, 0.2, 0.5, 1.0, 0, None, False,
                               []),
                     SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                               Vector3(), 1, 5.0, 0.2, 1.0, 0, None, False,
                               []),
                     ],
            'Center': [SoMessage(None, None, Vector3(1, 1, 1), Quaternion(),
                                 Vector3(), -1, 8.0, 1.0, 1.0, 0, None, False,
                                 []),
                       SoMessage(None, None, Vector3(3, 1, 2), Quaternion(),
                                 Vector3(), -1, 3.0, 0.1, 1.0, 0, None, False,
                                 [])]
        }

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 1, 1), Quaternion(), Vector3(), 1,
                      1.0, 0, 1.0, 0, None, False, [])]

        self.assertEqual(bffr.max_attractive_gradient(time=self.now),
                         SoMessage(None, None, Vector3(2, 2, 0), Quaternion(),
                                   Vector3(), 1, 5.0, 0.2, 1.0, 0, None, False,
                                   []))

        self.assertEqual(bffr.min_attractive_gradient(time=self.now),
                         SoMessage(None, None, Vector3(2, 1, 3), Quaternion(),
                                   Vector3(), 1, 1.0, 0.1, 1.0, 0, None, False,
                                   []))

        self.assertEqual(bffr.strongest_gradient(time=self.now),
                         SoMessage(None, None, Vector3(1, 1, 1), Quaternion(),
                                   Vector3(), -1, 8.0, 1.0, 1.0, 0, None,
                                   False, []))
Exemplo n.º 14
0
    def test_chemotaxis_ge(self):
        """
        test chemotaxis ge mechanism
        :return:
        """

        bffr = SoBuffer()
        chem = ChemotaxisGe(bffr, moving=False, static=True, maxvel=np.inf)

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, -2, 0), Quaternion(), Vector3(),
                      -1, 3.0, 0.0, 1.0, 0, None, False, [])
        ]

        bffr._static = {
            'gradient': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 4.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(1, 0, 0), Quaternion(),
                          Vector3(), 1, 3.0, 1.0, 1.0, 0, None, False, [])
            ],
            'None': [
                SoMessage(None, None, Vector3(4, 2, 0), Quaternion(),
                          Vector3(), -1, 4.0, 2.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(5, 6, 3), Quaternion(),
                          Vector3(), 1, 2.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        bffr._moving = {
            'robot1': {
                'None': [
                    SoMessage(None, None, Vector3(1, -2, 1), Quaternion(),
                              Vector3(), -1, 4.0, 0.0, 1.0, 0, None, False, [])
                ]
            },
            'robot2': {}
        }

        # only one frameID + repulsive gradient is not considered
        chem.frames = ['gradient']
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(0.0, 1.0, 0.0))

        # all frameIDs
        chem.frames = []
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(-0.02, 0.98, 0.0))

        # no gradient within view
        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, None)

        bffr._static = {
            'test': [
                SoMessage(None, None, Vector3(0, -1, 2), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, Vector3())
Exemplo n.º 15
0
    def test_chemotaxis_balch(self):
        """
        test chemotaxis balch mechanism
        :return:
        """
        bffr = SoBuffer()
        chem = ChemotaxisBalch(bffr, moving=False, static=True, maxvel=np.inf)
        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 2, 3), Quaternion(), Vector3(),
                      -1, 3.0, 0.0, 1.0, 0, None, False, [])
        ]

        bffr._static = {
            'gradient': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(2, 2, 2), Quaternion(),
                          Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False, [])
            ],
            'None': [
                SoMessage(None, None, Vector3(0, 3, 2), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(5, 6, 3), Quaternion(),
                          Vector3(), 1, 2.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        # only one frameID + repulsive gradient is not considered
        chem.frames = ['gradient']
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(0.29, 0.0, -0.29))

        # all frameIDs
        chem.frames = []
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(0.73, -0.44, 0.14))

        # not existing frame ID - no gradient will be followed
        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, None)

        bffr._static = {
            'test': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, Vector3())

        bffr._static = {
            'test': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        chem.frames = ['test']
        result = chem.move()
        self.assertEqual(result, Vector3())
    def test_evaporation_buffer(self):
        """
        test evaporation of buffer data using evaporate_buffer method
        """

        bffr = SoBuffer(aggregation=AGGREGATION.MAX, min_diffusion=1.0)
        now = rospy.Time(secs=500000)

        data = {'None': [  # message has goal radius - should be kept
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                      0.8, 5, now - rospy.Duration(45), False, []),
            # evaporation time is zero cases
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                      0.8, 0, now - rospy.Duration(45), False, []),
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                      1.0, 0, now - rospy.Duration(45), False, []),
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                      1.0, 0, now - rospy.Duration(45), False, []),
            # messages without goal radius - will be sorted out based on
            # min diffusion
            SoMessage(Header(None, now - rospy.Duration(20), 'None'), 'None',
                      Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                      0.75, 5, now - rospy.Duration(20), False, []),
            SoMessage(Header(None, now - rospy.Duration(5), 'None'), 'None',
                      Vector3(5, 5, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                      0.8, 3, now - rospy.Duration(5), False, []),
            SoMessage(Header(None, now, 'None'), 'None', Vector3(6, 6, 0),
                      Quaternion(), Vector3(), 1, 4.0, 0.0, 0.8, 5, now, False,
                      [])
        ], 'gradient': [
            SoMessage(Header(None, now - rospy.Duration(45), 'gradient'),
                      'None', Vector3(1, 1, 0), Quaternion(), Vector3(), 1,
                      4.0, 0.0, 0.8, 5, now - rospy.Duration(45), False, []),
            SoMessage(Header(None, now - rospy.Duration(15), 'gradient'),
                      'None', Vector3(3, 3, 0), Quaternion(), Vector3(), 1,
                      4.0, 0.0, 0.6, 5, now - rospy.Duration(15), False, [])
        ], 'robo': [
            SoMessage(Header(None, now - rospy.Duration(10), 'robo'), 'None',
                      Vector3(4, 4, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                      0.8, 4, now - rospy.Duration(10), False, [])]}

        bffr._static = deepcopy(data)
        bffr._evaporate_buffer(time=now)

        data = {'None': [
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0 *
                      (0.8 ** 9), 1.0, 0.8, 5, now, False, []),
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 0.0, 1.0,
                      0.8, 0, now - rospy.Duration(45), False, []),
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                      1.0, 0, now - rospy.Duration(45), False, []),
            SoMessage(Header(None, now - rospy.Duration(45), 'None'), 'None',
                      Vector3(1, 1, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                      1.0, 0, now - rospy.Duration(45), False, []),
            SoMessage(Header(None, now - rospy.Duration(20), 'None'), 'None',
                      Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                      4.0 * (0.75 ** 4), 0.0, 0.75, 5, now, False, []),
            SoMessage(Header(None, now - rospy.Duration(5), 'None'), 'None',
                      Vector3(5, 5, 0), Quaternion(), Vector3(), 1, 4.0 * 0.8,
                      0.0, 0.8, 3, now - rospy.Duration(2), False, []),
            SoMessage(Header(None, now, 'None'), 'None', Vector3(6, 6, 0),
                      Quaternion(), Vector3(), 1, 4.0, 0.0, 0.8, 5, now,
                      False, [])],
            'gradient': [],
            'robo': [
                SoMessage(Header(None, now - rospy.Duration(10), 'robo'),
                          'None', Vector3(4, 4, 0), Quaternion(), Vector3(), 1,
                          4.0 * (0.8 ** 2), 0.0, 0.8, 4,
                          now - rospy.Duration(2), False, [])
            ]}

        self.assertEqual(bffr._static, data)
    def test_store_data_various_aggregations(self):
        """
        test store data method with different aggregation options for
        different frame IDs
        :return:
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.MAX,
                                     'grad': AGGREGATION.AVG})
        testlist = {'None': [], 'grad': []}
        now = rospy.Time(secs=500000)

        msg = SoMessage(Header(None, now, 'None'), 'None', Vector3(2, 2, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                        False, [])
        bffr.store_data(msg=msg, time=now)

        msg = SoMessage(Header(None, now, 'grad'), 'None', Vector3(4, 5, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                        False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'None'), 'None', Vector3(3, 3, 0),
                        Quaternion(), Vector3(), 1, 3.0, 1.0, 1.0, 0, None,
                        False, [])
        testlist['None'].append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'grad'), 'None', Vector3(5, 5, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                        False, [])
        testlist['grad'].append(SoMessage(Header(None, now, 'grad'), 'None',
                                          Vector3(4.5, 5, 0), Quaternion(),
                                          Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                                          False, []))
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'None'), 'None', Vector3(2, 2, 0),
                        Quaternion(), Vector3(), 1, 5.0, 1.0, 1.0, 0, None,
                        False, [])
        testlist['None'].append(deepcopy(msg))
        bffr.store_data(msg, now)

        self.assertEqual(bffr._static, testlist)
    def test_store_data_max_aggregation_distance(self):
        """
        test store_data method aggregation option = max,
        aggregation distance = 0.0
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.MAX},
                        aggregation_distance=0.0)
        now = rospy.Time(secs=500000)
        testlist = []

        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        1, 4.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        1, 5.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        # store max value within aggregation distance!
        msg = SoMessage(None, None, Vector3(2, 1, 0), Quaternion(), Vector3(),
                        1, 6.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        # keep max of both
        msg = SoMessage(None, None, Vector3(3, 3, 0), Quaternion(), Vector3(),
                        1, 4.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(3, 3, 0), Quaternion(), Vector3(),
                        1, 3.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        # only value at this postion / area
        msg = SoMessage(None, None, Vector3(5, 5, 0), Quaternion(), Vector3(),
                        1, 4.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        for el in testlist:
            el.header.frame_id = 'None'
            el.parent_frame = 'None'

        self.assertEqual(bffr._static, {'None': testlist})
Exemplo n.º 19
0
    def test_gradient_repulsion(self):
        """
        test gradient repulsion method based on gradients
        :return:
        """

        bffr = SoBuffer(id='robot1')
        repulsion = RepulsionGradient(bffr)

        # no own position specified
        self.assertEqual(repulsion.move(), None)

        bffr._own_pos = [
            SoMessage(Header(None, rospy.Time.now(), 'None'), None,
                      Vector3(2, 4, 0), Quaternion(), Vector3(), 1, 4.0, 0.0,
                      1.0, 0, None, False, []),
            SoMessage(Header(None, rospy.Time.now(), 'None'), None,
                      Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 2.0, 0.0,
                      1.0, 0, None, False, [])
        ]

        # no neighbors specified
        self.assertEqual(repulsion.move(), None)

        bffr._moving = {
            'robot': {
                'robot2': [
                    SoMessage(Header(None, rospy.Time.now(), 'robot'),
                              'robot2', Vector3(1, 3, 0), Quaternion(),
                              Vector3(), -1, 1.0, 1.0, 1.0, 0, None, False, [])
                ],
                'robot3': [
                    SoMessage(Header(None, rospy.Time.now(),
                                     'robot'), 'robot3', Vector3(2, 2, 0),
                              Quaternion(), Vector3(), -1, 4.0, 1.0, 1.0, 0,
                              None, False, []),
                    SoMessage(Header(None, rospy.Time.now(), 'robot'),
                              'robot3', Vector3(3, 2, 0), Quaternion(),
                              Vector3(), -1, 1.0, 0.8, 1.0, 0, None, False, [])
                ]
            }
        }
        # calculate resulting vector
        result = repulsion.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        # calculate vector
        self.assertEqual(result, Vector3(-0.39, -0.41, 0.0))

        # neighbor within goal_radius - returns vector with
        # ||vector|| = repulsion_radius
        bffr._moving = {
            'robot': {
                'robot2': [
                    SoMessage(Header(None, rospy.Time.now(), 'robot'),
                              'robot2', Vector3(2, 1.5, 0), Quaternion(),
                              Vector3(), -1, 2.0, 1.0, 1.0, 0, None, False, [])
                ]
            }
        }

        d = round(so_data.calc.vector_length(repulsion.move()), 0)

        # calculate vector
        self.assertEqual(d, 2.0)
    def test_store_data_newest(self):
        """
        test store_data method aggregation option = newest
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.NEW})
        now = rospy.Time(secs=500000)
        testlist = []

        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        1, 4.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(3, 3, 0), Quaternion(), Vector3(),
                        1, 4.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(3, 3, 0), Quaternion(), Vector3(),
                        1, 3.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(5, 5, 0), Quaternion(), Vector3(),
                        1, 4.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        -1, 5.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(5, 5, 0), Quaternion(), Vector3(),
                        -1, 4.0, 1.0, 1.0, 0, None, False, [])
        testlist.append(deepcopy(msg))
        bffr.store_data(msg, now)

        for el in testlist:
            el.header.frame_id = 'None'
            el.parent_frame = 'None'

        self.assertEqual(bffr._static, {'None': testlist})
    def test_store_data_fids_selection(self):
        """
        test store_data method, only store gradients with specified frameids
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.MAX},
                        store_all=False, framestorage=['grad', 'silk'])
        testlist = {'grad': [], 'silk': []}
        now = rospy.Time(secs=500000)

        msg = SoMessage(Header(None, now, 'pheromone'), 'None',
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'grad'), 'None', Vector3(3, 3, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                        False, [])
        testlist['grad'].append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(3, 3, 0), Quaternion(), Vector3(),
                        1, 3.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'grad'), 'None', Vector3(5, 5, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                        False, [])
        testlist['grad'].append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now, 'silk'), 'None', Vector3(5, 5, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 1.0, 0, None,
                        False, [])
        testlist['silk'].append(deepcopy(msg))
        bffr.store_data(msg, now)

        msg = SoMessage(None, None, Vector3(2, 2, 0), Quaternion(), Vector3(),
                        1, 5.0, 1.0, 1.0, 0, None, False, [])
        bffr.store_data(msg, now)

        self.assertEqual(bffr._static, testlist)
Exemplo n.º 22
0
    def test_follow_max_reach(self):
        """
        test FollowMin Mechanism
        :return:
        """
        bffr = SoBuffer()
        chem = FollowMaxReach(bffr, moving=False, static=True, maxvel=np.inf)

        bffr._own_pos = [
            SoMessage(None, None, Vector3(1, 2, 3), Quaternion(), Vector3(),
                      -1, 3.0, 0.0, 1.0, 0, None, False, [])
        ]

        bffr._moving = {
            'robot1': {
                'None': [
                    SoMessage(None, None, Vector3(1, 2, 3), Quaternion(),
                              Vector3(), -1, 3.0, 0.0, 1.0, 0, None, False, [])
                ]
            },
            'robot2': {}
        }

        bffr._static = {
            'gradient': [
                SoMessage(None, None, Vector3(2, 3, 1), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(2, 2, 2), Quaternion(),
                          Vector3(), 1, 1.0, 1.0, 1.0, 0, None, False, [])
            ],
            'None': [
                SoMessage(None, None, Vector3(7, 3, 2), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(5, 6, 3), Quaternion(),
                          Vector3(), 1, 2.0, 1.0, 1.0, 0, None, False, [])
            ],
            'test': [
                SoMessage(None, None, Vector3(5, 3, 2), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(7, 2, 3), Quaternion(),
                          Vector3(), -1, 3.0, 1.0, 1.0, 0, None, False, []),
                SoMessage(None, None, Vector3(1, 2, 6), Quaternion(),
                          Vector3(), 1, 4.0, 1.0, 1.0, 0, None, False, [])
            ]
        }

        # with all frameIDs
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)

        self.assertEqual(result, Vector3(0.0, 0.0, 0.5))

        # only one frameID considered - no gradient within view
        chem.frames = ['None']
        result = chem.move()
        self.assertEqual(result, None)

        # two frameIDs
        chem.frames = ['gradient']
        result = chem.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        self.assertEqual(result, Vector3(0.29, 0.0, -0.29))
    def test_store_data_neighbors(self):
        """
        test store_data method, store neighbor data and own pos
        """
        bffr = SoBuffer(aggregation={'DEFAULT':AGGREGATION.MAX}, id='robot3')
        testlist = {'robot': {'robot1': [], 'robot2': []}}
        ownpos = []
        now = rospy.Time(secs=500000)

        # replaced by fourth robot1 message
        msg = SoMessage(Header(None, now - rospy.Duration(10), 'robot'),
                        'robot1', Vector3(2.1, 2.2, 0), Quaternion(),
                        Vector3(), 1, 4.0, 1.0, 0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        # position older than newest stored position --> ignore
        msg = SoMessage(Header(None, now - rospy.Duration(15), 'robot'),
                        'robot1', Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                        4.0, 1.0, 0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        # add to position list
        msg = SoMessage(Header(None, now - rospy.Duration(5), 'robot'),
                        'robot1', Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                        4.0, 1.0, 0.8, 5, None, True, [])
        testlist['robot']['robot1'].append(msg)
        bffr.store_data(msg, now)

        # add to position list
        msg = SoMessage(Header(None, now, 'robot'), 'robot1', Vector3(2, 2, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 0.8, 5, None,
                        True, [])
        testlist['robot']['robot1'].append(msg)
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now - rospy.Duration(15), 'robot'),
                        'robot2', Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                        4.0, 1.0, 0.8, 5, None, True, [])
        testlist['robot']['robot2'].append(msg)
        bffr.store_data(msg, now)

        # own position
        msg = SoMessage(Header(None, now - rospy.Duration(15), 'robot'),
                        'robot3', Vector3(2, 2, 0), Quaternion(), Vector3(), 1,
                        4.0, 1.0, 0.8, 5, None, True, [])
        ownpos.append(msg)
        bffr.store_data(msg, now)

        self.assertEqual(bffr._moving, testlist)
        self.assertEqual(bffr._own_pos, ownpos)
Exemplo n.º 24
0
    def test_repulsion_fernandez(self):
        """
        test gradient repulsion method based on Fernandez-Marquez et al.
        :return:
        """

        # Mechanism
        bffr = SoBuffer(id='robot1', view_distance=2.0)
        repulsion = RepulsionFernandez(bffr)

        # no own position specified
        self.assertEqual(repulsion.move(), None)

        bffr._own_pos = [
            SoMessage(Header(None, rospy.Time.now(), 'None'), None,
                      Vector3(2, 4, 0), Quaternion(), Vector3(), -1, 4.0, 1.0,
                      1.0, 0, rospy.Time.now(), False, []),
            SoMessage(Header(None, rospy.Time.now(), 'None'), None,
                      Vector3(2, 2, 0), Quaternion(), Vector3(), -1, 1.0, 0.0,
                      1.0, 0, rospy.Time.now(), False, [])
        ]

        # no neighbors specified
        self.assertEqual(repulsion.move(), None)

        bffr._moving = {
            'robot': {
                'robot2': [
                    SoMessage(Header(None, rospy.Time.now(), 'None'), 'None',
                              Vector3(1, 3, 0), Quaternion(), Vector3(), -1,
                              1.0, 1.0, 1.0, 0, rospy.Time.now(), False, [])
                ],
                'robot3': [
                    SoMessage(Header(None, rospy.Time.now(), 'None'), 'None',
                              Vector3(2, 2, 0), Quaternion(), Vector3(), -1,
                              4.0, 1.0, 1.0, 0, rospy.Time.now(), False, []),
                    SoMessage(Header(None, rospy.Time.now(), 'None'), 'None',
                              Vector3(3, 2, 0), Quaternion(), Vector3(), -1,
                              1.0, 0.8, 1.0, 0, rospy.Time.now(), False, [])
                ],
                'robot4': []
            }
        }

        # calculate resulting vector
        result = repulsion.move()
        result.x = round(result.x, 2)
        result.y = round(result.y, 2)
        result.z = round(result.z, 2)
        # calculate vector
        self.assertEqual(result, Vector3(-0.88, -0.48, 0))

        # neighbor within goal_radius - returns vector with
        # ||vector|| = repulsion_radius
        bffr._moving = {
            'robot': {
                'robot2': [
                    SoMessage(Header(None, rospy.Time.now(), 'None'), None,
                              Vector3(2, 2, 0), Quaternion(), Vector3(), -1,
                              2.0, 1.0, 1.0, 0, rospy.Time.now(), False, [])
                ]
            }
        }

        d = round(so_data.calc.vector_length(repulsion.move()), 0)

        # calculate vector
        self.assertEqual(d, 1.0)
    def test_store_data_neighbors_False(self):
        """
        test store_data method, neighbor gradients will not be stored
        :return:
        """
        bffr = SoBuffer(aggregation={'DEFAULT': AGGREGATION.MAX},
                        moving_storage_size=0, id='')
        now = rospy.Time(secs=500000)

        # replaced by fourth robot1 message
        msg = SoMessage(Header(None, now - rospy.Duration(10), 'robot1'), None,
                        Vector3(2.1, 2.2, 0), Quaternion(), Vector3(), 1, 4.0,
                        1.0, 0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        # position older than newest stored position --> ignore
        msg = SoMessage(Header(None, now - rospy.Duration(15), 'robot1'), None,
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        # add to position list
        msg = SoMessage(Header(None, now - rospy.Duration(5), 'robot1'), None,
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        # add to position list
        msg = SoMessage(Header(None, now, 'robot1'), None, Vector3(2, 2, 0),
                        Quaternion(), Vector3(), 1, 4.0, 1.0, 0.8, 5, None,
                        True, [])
        bffr.store_data(msg, now)

        msg = SoMessage(Header(None, now - rospy.Duration(15), 'robot2'), None,
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        # own position
        msg = SoMessage(Header(None, now - rospy.Duration(15), 'robot3'), None,
                        Vector3(2, 2, 0), Quaternion(), Vector3(), 1, 4.0, 1.0,
                        0.8, 5, None, True, [])
        bffr.store_data(msg, now)

        self.assertEqual(bffr._moving, {})
        self.assertEqual(bffr._own_pos, [])