【发布时间】:2021-04-26 10:50:54
【问题描述】:
让我试着描述一下我在做什么。
我正在尝试为吸尘机器人编写控制器代码。整个项目是在 Webots 平台内完成的。它的工作原理是当机器人撞到墙壁时,它会随机转动一个角度并继续打扫房子。
问题:我发现它的转数不准确。如果我指定它转 90 度,它只会转 60 度。如果我指定它转 360 度,它只会转 240 度左右(视觉猜测)。
我找到了一种解决方法 - 一种临时解决方法。我发现将角度乘以一定的量(1.2275)会使角度非常接近问题中指定的实际角度。因此,如果我指定要转动的角度为 180,并将其乘以 1.2275,我得到的值可能是 175 或 177(同样来自视觉猜测)。
问题是这个错误会随着时间的推移而累积。所以最初它可能只是 2-3 度的偏移,这没什么,但是运行模拟超过 30 分钟,它可能会建立相对较高的数字。这是不可接受的。
我问了一个朋友,他建议我随着模拟的进行缩放偏移量,以便偏移量随误差缩放,但我觉得这是一个临时的解决方法。
如果我对它的物理原理不太了解或了解不多,我将不胜感激。任何帮助都将不胜感激。
下面提供的是turn函数的代码。
static void turn(double angle) {
double l_offset = wb_position_sensor_get_value(left_position_sensor);
double r_offset = wb_position_sensor_get_value(right_position_sensor);
double orient;
stop();
angle = angle * ANGLE_OFFSET; //the important part
double neg = (angle < 0.0) ? -1.0 : 1.0;
step();
wb_motor_set_velocity(left_motor, neg * HALF_SPEED);
wb_motor_set_velocity(right_motor, -neg * HALF_SPEED);
do {
double l = wb_position_sensor_get_value(left_position_sensor) - l_offset;
double r = wb_position_sensor_get_value(right_position_sensor) - r_offset;
double dl = l * WHEEL_RADIUS; // distance covered by left wheel in meter
double dr = r * WHEEL_RADIUS; // distance covered by right wheel in meter
orient = neg * (dl - dr) / AXLE_LENGTH; // delta orientation in radian
step();
} while (orient < neg * angle);
stop();
step();
}
让我对代码进行一些解释。 angle 显然指定了机器人转动的角度。第二行显示了我当前正在使用的解决方法。阅读接下来的几行,您可以看到机器人通过向后移动左轮和向前移动右轮来转动。它不断获取车轮所覆盖的距离并检查状况。当该条件为真时,它会停止转动。
我的猜测是orient = neg * (dl - dr) / AXLE_LENGTH; // delta orientation in radian 这一行可能有问题。有小费吗?也许有人可以验证它的物理/力学方面是否正确?
【问题讨论】:
-
你的采样周期是无限的吗?
-
@stark 它本质上是无限的,是的。机器人在任何适当的测试周期内都会转动 100 秒。
-
当您以相同的速度运行两个电机时,在更简单的测试中会发生什么?机器人是否线性移动并保持其方向?它会移动一段距离
l * WHEEL_RADIUS吗? -
step()函数的时间步长是多少,即每次调用时电机将以指定的速度转动多长时间?
标签: c rotation physics robotics webots