Я не получаю правильное выходное местоположение. Х, у взаимозаменяемы. Я не вижу, что я делаю не так - PullRequest
0 голосов
/ 20 октября 2019

(для контекста) Мы попросили: Определить метод с именем move (). Он должен принять объект Movement и соответствующим образом обновить местоположение. Предположим, что линейная скорость в метрах в секунду, а угловая скорость в радианах в секунду. Чтобы упростить задачу, рассмотрим робота как безразмерную точку на плоскости. Кроме того, предположим, что угловая скорость оценивается в первую очередь так, что робот вращается первым, прежде чем двигаться вперед или назад.

import math

class Movement(object):
    """A class describing a TurtleBot's movement

    @param linear_velocity in the range [-0.22, 0.22]
    @param angular_velocity in the range [-2.84, 2.84]
    @param duration in seconds, [0, +inf)
    """

    MAX_LIN_VEL = 5.0
    MAX_ANG_VEL = 2*math.pi

    def __init__(self, linear_velocity=0, angular_velocity=0, duration=1):
        # Check inputs
        self._linear_velocity = linear_velocity
        self._angular_velocity = angular_velocity
        self._duration = duration

        if not abs(linear_velocity) <= self.MAX_LIN_VEL:
            print('Invalid linear_velocity, set to 0')
            self._linear_velocity = 0
        if not abs(angular_velocity) <= self.MAX_ANG_VEL:
            print('Invalid angular_velocity, set to 0')
            self._angular_velocity = 0
        if duration <= 0:
            print('Invalid duration, set to 0')
            self._duration = 0

    def __str__(self):
        return "Movement(linear_velocity=" + str(self._linear_velocity) + ", angular_velocity=" + str(self._angular_velocity) + ", duration=" + str(self._duration) + ")"

    def get_linear_velocity(self):
        return self._linear_velocity

    def get_angular_velocity(self):
        return self._angular_velocity

    def get_duration(self, unit="s"):
        if unit == "ms":
            return self._duration * 1000
        elif unit == "m":
            return self._duration / 60
        else:
            if not unit == "s":
                print("Invalid unit. Unit set to seconds.")
            return self._duration


class MobileRobot:
    def __init__(self, x=0, y=0, angle=0):
        self._x = x
        self._y = y
        self._angle = math.pi/2

    def step_right(self):
        self._x += 1

    def step_left(self):
        self._x -= 1

    def step_up(self):
        self._y += 1

    def step_down(self):
        self._y -= 1

    def get_current_location(self):
        return 'Location = (' + str(self._x) + ','+ str(self._y) + ')'

    def return_to_origin(self):
        self._x= 0
        self._y= 0
        self._angle=  math.pi/2

    def move(self, Movement):
        duration = Movement.get_duration()
        angular_velocity = Movement.get_angular_velocity()
        self._angle += angular_velocity * duration + self._angle

        distance = Movement.get_linear_velocity() * Movement.get_duration()
        self._x += (distance * math.cos(self._angle))
        self._y += (distance * math.sin(self._angle))

print(Movement(0.1))
robot1 = MobileRobot()
move1 = Movement(1,math.pi/2,1)
robot1.move(move1)
print(robot1.get_current_location())

Вывод должен был быть:

Movement(linear_velocity=0.1, angular_velocity=0, duration=1)
None
(-1.0, 1.2246467991473532e-16)

Но я получаю следующее:

Movement(linear_velocity=0.1, angular_velocity=0, duration=1)
Location = (-1.8369701987210297e-16,-1.0)

Я совершенно сбит с толку, почему хи у меня взаимозаменяемо, и я не могу точно определить ошибку.

Ответы [ 2 ]

0 голосов
/ 20 октября 2019

Вы повернули слишком сильно, что заставило вас двигаться по оси Y, а не по оси X.

Эта строка является вашей проблемой:

self._angle += angular_velocity * duration + self._angle

Это должно быть просто:

self._angle += angular_velocity * duration
0 голосов
/ 20 октября 2019
self._angle += angular_velocity * duration + self._angle

Это эквивалентно self._angle = self._angle + angular_velocity * duration + self._angle;т.е. предыдущее значение считается дважды в дополнение к повороту, указанному Движением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...