Source code for base.time_scale_testing

#! /usr/bin/env python
"""
This script tests some of the base functionalities of MORSE.
"""

import sys
import math
import time
from morse.testing.testing import MorseMoveTestCase
from pymorse import Morse

# Include this import to be able to use your test file as a regular 
# builder script, ie, usable with: 'morse [run|exec] base_testing.py
try:
    from morse.builder import *
except ImportError:
    pass


[docs]class TimeScale_Test(MorseMoveTestCase):
[docs] def setUpEnv(self): """ Defines the test scenario, using the Builder API. """ robot = ATRV() pose = Pose() pose.frequency(60) robot.append(pose) pose.add_stream('socket') motion = MotionVW() robot.append(motion) motion.add_stream('socket') teleport = Teleport() robot.append(teleport) teleport.add_stream('socket') env = Environment('empty', fastmode = True) env.add_service('socket')
[docs] def send_speed(self, s, morse, v, w, t): """ Send the speed (v, w) to the robot controller during real-time t seconds Return the simulated time elapsed (in sec) """ start = morse.time() self._count = 0 morse.robot.pose.subscribe(self.count_value) s.publish({'v' : v, 'w' : w}) time.sleep(t) s.publish({'v' : 0.0, 'w' : 0.0}) morse.robot.pose.unsubscribe(self.count_value) return morse.time() - start
[docs] def count_value(self, value): self._count += 1
[docs] def test_time_scale(self): with Morse() as simu: res = simu.rpc('time', 'set_time_scale', 1.0) if not res: logger.warning("time::set_time_scale is not supported on this Blender version") return simu.deactivate('robot.teleport') precision = 0.18 time_precision = 0.04 # Read the start position, it must be (0.0, 0.0, 0.0) self.assertAlmostEqualPositionThenFix(simu, [0.0, 0.0, 0.10, 0.0, 0.0, 0.0], precision) v_w = simu.robot.motion # Normal speed: one real-time second == one simulated second simu_time_elapsed = self.send_speed(v_w, simu, 1.0, 0.0, 2.0) # as a consequence, the robot has moved forward by 2 m self.assertAlmostEqualPositionThenFix(simu, [2.0, 0.0, 0.10, 0.0, 0.0, 0.0], precision) self.assertAlmostEqual(simu_time_elapsed, 2.0, delta=time_precision) # We expect to get 60 (default fps) * 2 (s) pose measurement self.assertAlmostEqual(self._count, 120, delta = 1) simu_time_elapsed = self.send_speed(v_w, simu, -1.0, 0.0, 2.0) self.assertAlmostEqualPositionThenFix(simu, [0.0, 0.0, 0.10, 0.0, 0.0, 0.0], precision) self.assertAlmostEqual(simu_time_elapsed, 2.0, delta=precision) self.assertAlmostEqual(self._count, 120, delta = 1) # Slow down the simulation : one real-time second == 500 ms simulated simu.rpc('time', 'set_time_scale', 0.5) simu_time_elapsed = self.send_speed(v_w, simu, 1.0, 0.0, 2.0) # as a consequence, we only have moved forward by 1m in # 2 real-second (1 simulated second) self.assertAlmostEqualPositionThenFix(simu, [1.0, 0.0, 0.10, 0.0, 0.0, 0.0], precision) self.assertAlmostEqual(simu_time_elapsed, 1.0, delta=time_precision) # and so we get only 60 measures (as we will simulate 1 sec in simulate time) self.assertAlmostEqual(self._count, 60, delta = 1) # Accelerate the simulation : one real-time second == 2 simulated second simu.rpc('time', 'set_time_scale', 2.0) simu_time_elapsed = self.send_speed(v_w, simu, -1.0, 0.0, 2.0) # as a consequence, we only have moved downward by 4m in 2 real-second (4 simulated second) self.assertAlmostEqualPositionThenFix(simu, [-3.0, 0.0, 0.10, 0.0, 0.0, 0.0], precision) self.assertAlmostEqual(simu_time_elapsed, 4.0, delta=precision) # alse, we get 240 measures (60 * 4 simulated sec) self.assertAlmostEqual(self._count, 240, delta = 2) ########################## Run these tests ##########################
if __name__ == "__main__": from morse.testing.testing import main main(TimeScale_Test, time_modes = [TimeStrategies.BestEffort])