Source code for base.external_force_testing

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

import sys
import math
from morse.testing.testing import MorseTestCase
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]def send_force_x(actuator, fx): actuator.publish({'force': [fx, 0.0, 0.0], 'torque': [0.0, 0.0, 0.0]})
[docs]class ExternalForceTest(MorseTestCase):
[docs] def setUpEnv(self): """ Defines the test scenario, using the Builder API. """ robot_ref = ATRV() # Make sure there is no friction with ground and it won't fall robot_ref.translate(z = 1.0) robot_ref._bpy_object.game.lock_location_z = True force = ForceTorque() robot_ref.append(force) force.add_stream('socket') accel = Accelerometer() robot_ref.append(accel) accel.add_stream('socket') robot = ATRV() robot.translate(y = 5.0) # Make sure there is no friction with ground and it won't fall robot.translate(z = 1.0) robot._bpy_object.game.lock_location_z = True force2 = ForceTorque() robot.append(force2) force2.name = 'force' force2.add_stream('socket') accel2 = Accelerometer() robot.append(accel2) accel2.name = 'accel' accel2.add_stream('socket') wind = ExternalForce() robot.append(wind) wind.add_stream('socket') env = Environment('empty', fastmode = True)
[docs] def test_external_force(self): """ The idea between the test is to verify that a robot against the wind is going slower than another one, using the same force. The acceleration stay positive in both case. """ with Morse() as morse: delta = 0.15 force_ref = morse.robot_ref.force accel_ref = morse.robot_ref.accel force = morse.robot.force accel = morse.robot.accel wind = morse.robot.wind morse.sleep(0.01) acc_ref = accel_ref.get() acc = accel.last() self.assertAlmostEqual(acc['acceleration'][0], 0.0, delta = delta) self.assertAlmostEqual(acc['acceleration'][1], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['acceleration'][0], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['acceleration'][1], 0.0, delta = delta) self.assertAlmostEqual(acc['velocity'][0], 0.0, delta = delta) self.assertAlmostEqual(acc['velocity'][1], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['velocity'][0], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['velocity'][1], 0.0, delta = delta) send_force_x(force_ref, 100) send_force_x(force, 100) morse.sleep(1) acc_ref = accel_ref.get() acc = accel.last() self.assertAlmostEqual(acc['acceleration'][0], 4.80, delta = delta) self.assertAlmostEqual(acc['acceleration'][1], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['acceleration'][0], 4.80, delta = delta) self.assertAlmostEqual(acc_ref['acceleration'][1], 0.0, delta = delta) self.assertAlmostEqual(acc['velocity'][0], 5.0, delta = delta) self.assertAlmostEqual(acc['velocity'][1], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['velocity'][0], 5.0, delta = delta) self.assertAlmostEqual(acc_ref['velocity'][1], 0.0, delta = delta) send_force_x(wind, -30.0) morse.sleep(1) acc_ref = accel_ref.get() acc = accel.last() # Acceleration for robot_ref is constant, as the same force # is applied. The acceleration of robot is constant, but # smaller, as it must now fight against wind self.assertAlmostEqual(acc['acceleration'][0], 3.30, delta = delta) self.assertAlmostEqual(acc['acceleration'][1], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['acceleration'][0], 4.80, delta = delta) self.assertAlmostEqual(acc_ref['acceleration'][1], 0.0, delta = delta) self.assertAlmostEqual(acc['velocity'][0], 8.5, delta = delta) self.assertAlmostEqual(acc['velocity'][1], 0.0, delta = delta) self.assertAlmostEqual(acc_ref['velocity'][0], 10.0, delta = delta) self.assertAlmostEqual(acc_ref['velocity'][1], 0.0, delta = delta) pass ########################## Run these tests ##########################
if __name__ == "__main__": from morse.testing.testing import main main(ExternalForceTest)