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)
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')
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)
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)
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)
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)
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, []))
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())
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})
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)
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)
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, [])