3

我试图通过以线速度发送消息来使模拟中的机器人移动精确的距离。现在我的实现并没有让机器人移动一个精确的距离。这是一些示例代码:

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 控制器进行反馈循环可以解决这个问题,但是在阅读了 Wikipedia 页面后,我真的不明白在这种情况下我会如何使用它。维基百科页面有 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

我将如何在速度和距离的背景下实现这一点?是距离误差吗?还是速度?有人可以帮忙吗?什么是积分?衍生物?克普?基?KD?ETC

谢谢。

4

1 回答 1

4

对于您的问题,设定点将是 (x,y)。process_feedback 将是 (px,py)。输出将是您需要行驶的速度。Kp、Ki 和 Kd 是您可以调整以获得所需行为类型的参数。例如,如果 Kd 太低,您可以通过在接近目标时没有充分减速来射过目标。

PID 控制器需要考虑三件事:

错误:你想在哪里与你在哪里

这当然是一个很大的因素。如果您在 A 点并且您的目标在 B 点,那么从 A 到 B 的向量会告诉您很多关于您需要如何驾驶的信息,但这不是唯一的因素。

导数:你接近的速度有多快

如果你正在快速接近目标并且你已经接近它,你实际上需要放慢速度。导数有助于考虑到这一点。

积分:对齐错误

您的机器人实际上可能不会完全按照您的指示去做。积分有助于确定您需要补偿多少。

于 2012-08-17T04:45:37.783 回答