保持你的方向(又称不旋转……又称驾驶 “直线”),同时以场地为中心#

介绍#

“走直线”并不像你想象的那么容易,是吗?当我们说 “直行 “时,我们的意思是机器在移动时不会无意地转向。我们都经历过这种情况。”为什么我告诉它要直线行驶,它却向左/向右转向!?” 这也是困扰了我们很久的事情。不幸的是,单个车轮或传动系统的两边之间总是存在物理差异。这也是为什么我们总是需要一个驱动 “直行”的PID。

而当我们采用矢量底盘时,“直走”变得更加复杂。我们希望机器人不只是前后行走,我们希望它能够在任意一个方向上都毫无偏移地直走。机器人应该总是面向同一个方向,除非我们让它旋转。当它旋转后,它的新的朝向也应当被正确地保持。

现在事情就变得有趣起来了。既然我们已经有了其他的PID进程(即:以玩家朝向为原点,以得分框为原点),我们该如何保证机器在以得分框为原点,以场地为原点和以玩家朝向为原点之间无缝切换呢?

保持不转可没有你想得那么简单,不是吗?不用担心,我们将尽我们所能帮助你理解这一过程。

实现#

你需要有一个变量来存储你的目标航向。我们一般把这个变量命名为storedYaw。每当你有一个新的角度要面对时,这个变量必须被更新。

不仅如此,你还需要一个变量来储存你目前的方向。一般我们将其命名为yaw。这个变量必须在每个循环中用你的陀螺仪进行更新

之后你还需要一个简单的控制转向的PID,它大概是像这个样子的。

double calcYawStraight(double targetAngle, double curentAngle, double kP){
    double errorAngle = remainderf((targetAngle − currentAngle), 360);
    double correction = tx * kP;
    return correction;
}

你一般会在手动阶段这么调用你的函数

if(rot ! = 0){
    storedYaw = yaw;
}else{
if( abs(speed) > 0 || abs(strafe) > 0 ){
    yawCorrection = calcYawStraight(storedYaw, yaw, 0.004);
    }
}
move(fwd, rot + yawCorrection , str);

从本质上讲,只要我们不旋转,我们就希望机器一直面向同一个方向。当我们不想旋转时,我们想在移动时保持我们的方向。然而,如果我们没有移动,我们就不想用PID控制我们的角度(出于安全考虑)。

为了与其他PID循环相结合,请确保保持你的朝向是你的 “默认 “状态。达成以“得分框为原点”和以“场地为原点”就只需要修改你的yawCorrection和storeYaw(或同等的变量)。