问题描述
让我试着描述一下我在做什么。
我正在尝试为吸尘机器人编写控制器代码。整个项目是在 Webots 平台内完成的。它的工作原理是当机器人碰到墙壁时,它会随机旋转一个角度并继续清洁房屋。
问题:我发现它转的金额不准确。如果我指定它转 90 度,它只转 60 度。如果我指定它转 360 度,它只转 240 度左右(视觉猜测)。
我找到了一个解决方法 - 一个临时的解决方法。我发现将角度乘以一定量 (1.2275) 会使角度非常接近问题中指定的真实角度。因此,如果我将要转动的角度指定为 180,并将其乘以 1.2275,我得到的值可能是 175 或 177(同样来自视觉猜测)。
问题是这个错误会随着时间的推移而累积。所以最初它可能只是 2-3 度的偏移,这没什么,但运行模拟超过 30 分钟,它可能会建立相对较高的数字。这是不可接受的。
我问了一个朋友,他建议我随着模拟的进行调整偏移量,这样偏移量就会随着错误而变化,但我觉得这是一个临时的解决方法。
我希望能在物理方面得到一些帮助,因为我不太了解或不太了解它所涉及的机械领域。任何帮助将不胜感激。
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
这一行可能有问题。有小费吗?也许有人可以验证它的物理/力学方面是否正确?
解决方法
您能细分出所需角度与实际(视觉)角度之间差异的原因吗?我似乎潜入并修复这会比修补补丁更好地利用时间。