We are having a peculiar issue with our arcade drive, when we drive forward or backward everything works normally, but when we try turning only the right side of our robot turns, whether we are turning left or right, while the left side doesn’t move at all.
This is the code we have for driving in teleop:
myRobot.arcadeDrive(stick);
So this code works normally for going forward or backwards, which is why I don’t think it is a wiring issue, but somewhere in the code.
Ether
January 23, 2016, 3:08pm
2
Team5119Dmitri:
We are having a peculiar issue with our arcade drive, when we drive forward or backward everything works normally, but when we try turning only the right side of our robot turns, whether we are turning left or right, while the left side doesn’t move at all.
This is the code we have for driving in teleop:
myRobot.arcadeDrive(stick);
So this code works normally for going forward or backwards, which is why I don’t think it is a wiring issue, but somewhere in the code.
Sounds like it might be Cheezy drive? I seem to recall seeing something about WPILib incorporating Cheezy Drive into their Arcade code. Or maybe I just imagined that…
Cheezy Drive is split arcade on steroids. It can best be described as making your robot drive like a car. This has the side effect of not letting you turn in place , so there is a button that when held bypasses the car steering part and switches back to split arcade. This button is called ‘Quick Turn’.
adjusted_wheel = SensitivityRemap(wheel);
Vl = throttle + adjusted_wheel * abs(throttle) + inertia compensation terms;
Vr = throttle - adjusted_wheel * abs(throttle) - inertia compensation terms;
The end result is that when the robot is tuned properly, it feels consistent through a wide range of motions. The robot reacts the same to the joystick inputs at high and low speeds. Arcade has the problem that when you want to drive in an arc at slower speeds, you end up over-steering since you need to only use a small range of stick movements to get the turns you want. The inertia compensation terms add extra power to start the robot turning and stop it again when the wheel angle changes. This helps the robot feel ‘psychic’ and start turning as the driver starts demanding a turn, not after.
Arhowk
January 23, 2016, 3:23pm
3
The implementation in wpilibj does not appear to be cheezy drive…
public void arcadeDrive(double moveValue, double rotateValue, boolean squaredInputs) {
// local variables to hold the computed PWM values for the motors
if (!kArcadeStandard_Reported) {
UsageReporting.report(tResourceType.kResourceType_RobotDrive, getNumMotors(),
tInstances.kRobotDrive_ArcadeStandard);
kArcadeStandard_Reported = true;
}
double leftMotorSpeed;
double rightMotorSpeed;
moveValue = limit(moveValue);
rotateValue = limit(rotateValue);
if (squaredInputs) {
// square the inputs (while preserving the sign) to increase fine control
// while permitting full power
if (moveValue >= 0.0) {
moveValue = (moveValue * moveValue);
} else {
moveValue = -(moveValue * moveValue);
}
if (rotateValue >= 0.0) {
rotateValue = (rotateValue * rotateValue);
} else {
rotateValue = -(rotateValue * rotateValue);
}
}
if (moveValue > 0.0) {
if (rotateValue > 0.0) {
leftMotorSpeed = moveValue - rotateValue;
rightMotorSpeed = Math.max(moveValue, rotateValue);
} else {
leftMotorSpeed = Math.max(moveValue, -rotateValue);
rightMotorSpeed = moveValue + rotateValue;
}
} else {
if (rotateValue > 0.0) {
leftMotorSpeed = -Math.max(-moveValue, rotateValue);
rightMotorSpeed = moveValue + rotateValue;
} else {
leftMotorSpeed = moveValue - rotateValue;
rightMotorSpeed = -Math.max(-moveValue, -rotateValue);
}
}
setLeftRightMotorOutputs(leftMotorSpeed, rightMotorSpeed);
}
Can you try using the stick’s move and rotate axes so you can print those off as you send them? (and post the output here)
The robot is currently being re-assembled, I will be able to post the output on monday.
After the robot was rebuilt the issue disappeared. Thanks for all your help though guys.