ПИД-регуляторы для прохождения точного расстояния со скоростью

Я пытаюсь заставить робота в симуляции перемещаться на точное расстояние, отправляя сообщения с линейной скоростью. Прямо сейчас моя реализация не заставляет робота двигаться на точное расстояние. Это пример кода:

void Robot::travel(double x, double y)
{
    // px and py are the current positions (constantly gets updated as the robot moves in the simulation)
    // x and y is the target position that I want to go to
    double startx = px;
    double starty = py;
    double distanceTravelled = 0;

    align(x, y);
    // This gets the distance from the robot's current position to the target position
    double distance = calculateDistance(px, py, x, y);

    // Message with velocity
    geometry_msgs::Twist msg;
    msg.linear.x = 1;
    msg.angular.z = 0;

    ros::Rate loop_rate(10);
    while (distanceTravelled < distance)
    {
        distanceTravelled = calculateDistance(startx, starty, px, py);
        // Publishes message telling the robot to move with the linear.x velocity
        RobotVelocity_pub.publish(msg);
        ros::spinOnce();
        loop_rate.sleep();
    }
}

Я спросил, и кто-то предположил, что использование ПИД-регулятора для контура обратной связи решит эту проблему, но после прочтения страницы в Википедии я действительно не понимаю, как я буду использовать его в этом контексте. На странице Википедии есть псевдокод алгоритма PID, но я понятия не имею, что чему соответствует.

previous_error = setpoint - process_feedback
integral = 0
start:
  wait(dt)
  error = setpoint - process_feedback
  integral = integral + (error*dt)
  derivative = (error - previous_error)/dt
  output = (Kp*error) + (Ki*integral) + (Kd*derivative)
  previous_error = error
  goto start

Как бы я реализовал это в контексте скоростей и расстояний? Ошибка расстояния? Или скорость? Кто-нибудь может помочь, пожалуйста? Что такое интеграл? Производная? Кр? Ки? Кд? так далее.

Спасибо.


person Jigglypuff    schedule 17.08.2012    source источник


Ответы (1)


Для вашей задачи уставка будет (x, y). process_feedback будет (px,py). и на выходе будет скорость, с которой вам нужно двигаться. Kp, Ki и Kd — это параметры, которые вы можете настроить, чтобы получить желаемое поведение. Например, если Kd слишком низкое, вы можете выстрелить мимо цели, недостаточно замедляясь при приближении к ней.

ПИД-регулятор принимает во внимание три вещи:

ошибка: где вы хотите быть против того, где вы находитесь

Это, безусловно, большой фактор. Если вы находитесь в точке А, а ваша цель — в точке Б, то вектор из А в В многое говорит вам о том, как вам нужно управлять, но это не единственный фактор.

производная: как быстро вы приближаетесь

Если вы быстро приближаетесь к цели и находитесь близко к ней, вам действительно нужно замедлиться. Производная помогает принять это во внимание.

интеграл: ошибка выравнивания

Ваш робот может на самом деле не делать именно то, что вы ему говорите. Интеграл помогает определить, сколько вам нужно, чтобы компенсировать это.

person Vaughn Cato    schedule 17.08.2012
comment
Большое спасибо за ответ. Итак, мне нужно добавить код для измерения времени в моем коде, чтобы получить dt? - person Jigglypuff; 17.08.2012
comment
@Jigglypuff: Да, если вы еще не знаете, как часто вы сэмплируете позицию, вам нужен какой-то способ определить это. - person Vaughn Cato; 17.08.2012
comment
Итак, для всех значений K я должен использовать метод проб и ошибок при их установке или есть общее эмпирическое правило? - person Jigglypuff; 17.08.2012
comment
@Jigglypuff: Метод проб и ошибок, безусловно, один из способов. Возможно, в основе того, как оценивать хорошие значения, лежит некоторая теория, но это выходит за рамки того, что я знаю. - person Vaughn Cato; 17.08.2012
comment
У меня есть еще один вопрос, если можно. Каким будет условие выхода из цикла? Сначала я это сделал (ошибка ‹ 0), но это, очевидно, не сработает, поскольку ошибка всегда будет положительной. - person Jigglypuff; 17.08.2012
comment
@Jigglypuff: Вероятно, лучше всего, когда величина вашего результата становится ниже определенного допуска. После этого вы не добьетесь большого прогресса. - person Vaughn Cato; 17.08.2012