瞄准得分物(用Pixy摄像头瞄准)#

介绍#

当我们瞄准得分物时,操纵杆的旋转输入被Pixy覆盖。驾驶员可以自由地将机器人向任何方向移动,而Pixy则保持机器人对准一个球。这使得在场地远处捡球变得更加容易。由于我们在前面的进气口和后面的进气口都有一个Pixy,所以驾驶员必须选择在这种模式下使用哪一个。

这个 视频 展现了我们在2020赛题中如何运用这一技能

实现#

我们从Pixy获得两个信号。一个数字信号告诉我们视野范围内是否有目标——在这个案例中目标指的是黄色的球(2020赛季得分物)。另一个模拟信号告诉我们视野中的球在某个轴上的位置——在这个案例中是x轴。

Pixy的模拟信号输出0到3.3伏的电压。其中0伏代表摄像头视野内的最左端。在这个案例中,我们希望得分物处在视野的最中央。为此,我们创建一个定位进程来接管driver的旋转输入并计算目标与摄像头视野中央的偏移量。我们用偏移量来计算我们需要的旋转速度,直到数字信号告诉我们视野内没有更多目标了

double pixyVoltageRange = 3.3; //volts
    double pixyHFOV = 60; //degrees
    bool pixyFrontSeesBall(){
    return pixyFrontDigitalInput.Get();
}
double pixyFrontAngle(){
    return (((pixyFrontAnalogInput.GetAverageVoltage())/pixyVoltageRange) − 0.5) * pixyHFOV;
}
double pixyFrontCorrection(){
    double pixyXkP = 0.004;
    return pixyFrontAngle() * pixyXkP;
}

//In teleop
if(pixyFrontSeesBall()) {
    yawCorrection = pixyFrontCorrection();
    rot = 0;
}else{
    storedYaw = yaw;
}

move(fwd, rot + yawCorrection , str);

我们在自动阶段中会以不同的方式使用Pixy。我们会用它来确定我们相对于目标球的位置,以便在有误差的情况下进行自动调整。

if(pixyFrontSeesBall() && (abs(pixyFrontAngle() + goalYaw) > 3.0)) {
    move(0, yc, − copysignf(0.1, pixyFrontAngle()), true);
}else{
    move(0, 0, 0, true);
}

在这个案例中,我们用Pixy来让我们的机器面向得分物。如果它偏离了目标3度以上,那么它就会进行自动校正。