Esempio n. 1
0
    def test_should_use_minimum_steer_time_if_time_calculation_returns_small_value(self):
        self.listen(EventName.after)
        waypoint = Waypoint(Position(53.0001,-1.9999),5)
        fake_gps = FakeMovingGPS([self.current_position, waypoint.position])
        fake_gps.speed = 100

        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))

        self.assertEqual(self.last_event.seconds,MIN_TIME_TO_STEER)
Esempio n. 2
0
    def test_should_use_a_minimum_speed_for_calculation_preventing_divide_by_zero_error(self):
        self.listen(EventName.after)
        waypoint = Waypoint(Position(53.001,-2.001),5)
        fake_gps = FakeMovingGPS([self.current_position, waypoint.position])
        fake_gps.speed = 0
        expected_time = expected_time_to_steer(self.current_position,waypoint.position,0.01)

        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))

        self.assertEqual(self.last_event.seconds,expected_time)
Esempio n. 3
0
    def test_should_use_maximum_steer_time_if_its_a_long_way_to_go(self):
        self.listen(EventName.after)
        waypoint = Waypoint(Position(60.0001,10),5)
        fake_gps = FakeMovingGPS([self.current_position, waypoint.position])
        fake_gps.speed = 1
        expected_bearing = self.globe.bearing(self.current_position,waypoint.position)

        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))

        self.assertEqual(self.last_event.seconds,MAX_TIME_TO_STEER)
Esempio n. 4
0
    def test_should_navigate_to_next_waypoint_with_kink_in_route(self):
        destination = Waypoint(Position(10.03, 10.03), 10)
        gps = FakeMovingGPS([
            Position(10, 10),
            Position(10.01, 10.01),
            Position(10.025, 10.015),
            Position(10.03, 10.03)
        ])
        sensors = FakeSensors(gps, 1, 45)
        steerer = Steerer(self.servo, self.logger, CONFIG['steerer'])
        helm = Helm(self.exchange, sensors, steerer, self.logger,
                    CONFIG['helm'])
        navigator = Navigator(sensors, Globe(), self.exchange, self.logger,
                              CONFIG['navigator'])

        self.exchange.publish(Event(EventName.navigate, waypoint=destination))
        self.ticks(number=14, duration=200)

        self.logger.info.assert_has_calls([
            call(
                'Navigator, steering to +10.030000,+10.030000, bearing  44.6, distance 4681.8m, review after 600s'
            ),
            call(
                'Navigator, steering to +10.030000,+10.030000, bearing  44.6, distance 3121.2m, review after 600s'
            ),
            call(
                'Navigator, steering to +10.030000,+10.030000, bearing  71.3, distance 1734.0m, review after 600s'
            ),
            call('Navigator, arrived at +10.030000,+10.030000')
        ])
Esempio n. 5
0
    def test_should_steer_repeatedly_during_navigation(self):
        logger = Mock()
        destination = Waypoint(Position(10.0003, 10.0003), 10)
        gps = FakeMovingGPS([
            Position(10, 10),
            Position(10.0001, 10.00015),
            Position(10.00025, 10.0002),
            Position(10.0003, 10.0003)
        ])
        sensors = FakeSensors(gps, 1, 45)
        steerer = Steerer(self.servo, logger, CONFIG['steerer'])
        helm = Helm(self.exchange, sensors, steerer, logger, CONFIG['helm'])
        navigator = Navigator(sensors, Globe(), self.exchange, logger,
                              CONFIG['navigator'])

        self.exchange.publish(Event(EventName.navigate, waypoint=destination))
        self.ticks(number=7, duration=20)

        logger.debug.assert_has_calls([
            call(
                'Navigator, distance from waypoint +46.819018, combined tolerance +10.000000'
            ),
            call(
                'Navigator, distance from waypoint +27.647432, combined tolerance +10.000000'
            ),
            call(
                'Steerer, steering 36.4, heading 45.0, rate of turn +1.0, rudder +0.0, new rudder +4.6'
            ),
            call(
                'Steerer, steering 36.4, heading 45.0, rate of turn +1.0, rudder +4.6, new rudder +9.2'
            ),
            call(
                'Navigator, distance from waypoint +12.281099, combined tolerance +10.000000'
            ),
            call(
                'Steerer, steering 63.1, heading 45.0, rate of turn +1.0, rudder +9.2, new rudder +0.4'
            ),
            call(
                'Navigator, distance from waypoint +0.000000, combined tolerance +10.000000'
            ),
            call(
                'Steerer, steering 63.1, heading 45.0, rate of turn +1.0, rudder +0.4, new rudder -8.3'
            ),
            call(
                'Steerer, steering 63.1, heading 45.0, rate of turn +1.0, rudder -8.3, new rudder -17.1'
            )
        ])

        logger.info.assert_has_calls([
            call(
                'Navigator, steering to +10.000300,+10.000300, bearing  44.6, distance 46.8m, review after 23s'
            ),
            call(
                'Navigator, steering to +10.000300,+10.000300, bearing  36.4, distance 27.6m, review after 13s'
            ),
            call(
                'Navigator, steering to +10.000300,+10.000300, bearing  63.1, distance 12.3m, review after 6s'
            ),
            call('Navigator, arrived at +10.000300,+10.000300')
        ])
Esempio n. 6
0
    def test_should_return_minimum_review_time_if_time_calculation_results_in_NaN(self):
        self.listen(EventName.after)
        waypoint = Waypoint(Position(-60,22),0)
        no_position = Position(NaN,NaN,NaN,NaN)
        fake_gps = FakeMovingGPS([self.current_position, no_position, waypoint.position])
        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))

        self.assertEqual(self.last_event.seconds,MAX_TIME_TO_STEER)
        self.exchange.publish(Event(EventName.navigate_review,waypoint))

        self.assertEqual(self.event_count(EventName.after),2,"expected 1 'after' events")
        self.assertEqual(self.last_event.seconds,MIN_TIME_TO_STEER)
Esempio n. 7
0
    def test_should_signal_review_after_half_way_to_way_point_based_on_speed(self):
        self.listen(EventName.after)
        waypoint = Waypoint(Position(53.0001,-1.999699),5) #23m from current position
        bearing = self.globe.bearing(self.current_position,waypoint.position)
        fake_gps = FakeMovingGPS([self.current_position, waypoint.position])
        for_expected_seconds = int(0.5 * time_to_destination(self.current_position,waypoint.position,fake_gps.speed))

        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))

        self.assertEqual(self.event_count(EventName.after),1,"expected 1 'after' event")
        self.assertEqual(self.last_event.name,EventName.after)
        self.assertEqual(self.last_event.seconds,for_expected_seconds)
        self.assertEqual(self.last_event.next_event.name,EventName.navigate_review)
Esempio n. 8
0
    def test_should_not_fire_a_steer_event_if_no_GPS_signal(self):
        self.listen(EventName.set_course)
        waypoint = Waypoint(Position(-60,22),0)
        no_position = Position(NaN,NaN,NaN,NaN)
        first_bearing = self.globe.bearing(self.current_position,waypoint.position)
        fake_gps = FakeMovingGPS([self.current_position, no_position, waypoint.position])

        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))
        self.exchange.publish(Event(EventName.navigate_review))

        steer_events = self.event_count(EventName.set_course)
        self.assertEqual(steer_events,1,"expected only 1 set course event, got {0}".format(steer_events))
        self.assertEqual(self.last_event.heading,first_bearing)
Esempio n. 9
0
    def test_at_intermediate_point_should_adjust_heading(self):
        self.listen(EventName.set_course)
        waypoint = Waypoint(Position(11,11),0)
        intermediate_position = Position(12,12)
        fake_gps = FakeMovingGPS([self.current_position, intermediate_position, waypoint.position])
        bearing1 = self.globe.bearing(self.current_position,waypoint.position)
        bearing2 = self.globe.bearing(intermediate_position,waypoint.position)

        navigator = self.new_navigator(fake_gps)
        self.exchange.publish(Event(EventName.navigate,waypoint))

        self.assertEqual(self.last_event.heading,bearing1)

        self.exchange.publish(Event(EventName.navigate_review))
        self.assertEqual(self.event_count(EventName.set_course),2,"expected 2 set course events")
        self.assertEqual(self.last_event.heading,bearing2)
Esempio n. 10
0
 def setUp(self):
     self.mock_logger = Mock()
     self.mock_logger.error = Mock(side_effect=print_msg)
     self.exchange = Exchange(self.mock_logger)
     self.timer = StubTimer()
     self.timeshift = TimeShift(self.exchange, self.timer.time)
     self.event_source = EventSource(self.exchange, self.timer,
                                     self.mock_logger,
                                     {'tick interval': 0.2})
     gps = FakeMovingGPS([
         Position(10, 10),
         Position(11, 11),
         Position(12, 12),
         Position(13, 13)
     ])
     self.navigator = Navigator(gps, Globe(), self.exchange,
                                self.mock_logger, {
                                    'min time to steer': 5,
                                    'max time to steer': 20
                                })