2021-05-21 22:34:16 -07:00
|
|
|
// Copyright (c) FIRST and other WPILib contributors.
|
|
|
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
|
|
|
// the WPILib BSD license file in the root directory of this project.
|
|
|
|
|
|
2025-11-07 19:55:43 -05:00
|
|
|
package org.wpilib.drive;
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
|
|
|
|
|
|
|
|
|
import org.junit.jupiter.api.Test;
|
2025-11-07 19:57:21 -05:00
|
|
|
import org.wpilib.hardware.motor.MockPWMMotorController;
|
2021-05-21 22:34:16 -07:00
|
|
|
|
2024-01-12 08:46:21 -08:00
|
|
|
@SuppressWarnings("resource")
|
2021-05-21 22:34:16 -07:00
|
|
|
class DifferentialDriveTest {
|
2022-02-17 18:03:59 -08:00
|
|
|
@Test
|
|
|
|
|
void testArcadeDriveIK() {
|
|
|
|
|
// Forward
|
2026-03-06 14:19:15 -08:00
|
|
|
var velocities = DifferentialDrive.arcadeDriveIK(1.0, 0.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.5, 0.5, false);
|
|
|
|
|
assertEquals(0.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.5, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.5, -0.5, false);
|
|
|
|
|
assertEquals(0.5, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-1.0, 0.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.5, 0.5, false);
|
|
|
|
|
assertEquals(-0.5, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.5, -0.5, false);
|
|
|
|
|
assertEquals(0.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-0.5, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Left turn (xVelocity with negative sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.0, 1.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Left turn (xVelocity with positive sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.0, 1.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Right turn (xVelocity with negative sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.0, -1.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Right turn (xVelocity with positive sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.0, -1.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testArcadeDriveIKSquared() {
|
|
|
|
|
// Forward
|
2026-03-06 14:19:15 -08:00
|
|
|
var velocities = DifferentialDrive.arcadeDriveIK(1.0, 0.0, true);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.5, 0.5, true);
|
|
|
|
|
assertEquals(0.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.25, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.5, -0.5, true);
|
|
|
|
|
assertEquals(0.25, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-1.0, 0.0, true);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.5, 0.5, true);
|
|
|
|
|
assertEquals(-0.25, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.5, -0.5, true);
|
|
|
|
|
assertEquals(0.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-0.25, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Left turn (xVelocity with negative sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.0, 1.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Left turn (xVelocity with positive sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.0, 1.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Right turn (xVelocity with negative sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(-0.0, -1.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
|
|
|
|
|
|
|
|
|
// Right turn (xVelocity with positive sign)
|
|
|
|
|
velocities = DifferentialDrive.arcadeDriveIK(0.0, -1.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCurvatureDriveIK() {
|
|
|
|
|
// Forward
|
2026-03-06 14:19:15 -08:00
|
|
|
var velocities = DifferentialDrive.curvatureDriveIK(1.0, 0.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(0.5, 0.5, false);
|
|
|
|
|
assertEquals(0.25, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.75, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(0.5, -0.5, false);
|
|
|
|
|
assertEquals(0.75, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.25, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(-1.0, 0.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(-0.5, 0.5, false);
|
|
|
|
|
assertEquals(-0.75, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-0.25, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(-0.5, -0.5, false);
|
|
|
|
|
assertEquals(-0.25, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-0.75, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCurvatureDriveIKTurnInPlace() {
|
|
|
|
|
// Forward
|
2026-03-06 14:19:15 -08:00
|
|
|
var velocities = DifferentialDrive.curvatureDriveIK(1.0, 0.0, true);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(0.5, 0.5, true);
|
|
|
|
|
assertEquals(0.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(0.5, -0.5, true);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(-1.0, 0.0, true);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(-0.5, 0.5, true);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.curvatureDriveIK(-0.5, -0.5, true);
|
|
|
|
|
assertEquals(0.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testTankDriveIK() {
|
|
|
|
|
// Forward
|
2026-03-06 14:19:15 -08:00
|
|
|
var velocities = DifferentialDrive.tankDriveIK(1.0, 1.0, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(0.5, 1.0, false);
|
|
|
|
|
assertEquals(0.5, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(1.0, 0.5, false);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.5, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(-1.0, -1.0, false);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(-0.5, -1.0, false);
|
|
|
|
|
assertEquals(-0.5, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(-0.5, 1.0, false);
|
|
|
|
|
assertEquals(-0.5, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testTankDriveIKSquared() {
|
|
|
|
|
// Forward
|
2026-03-06 14:19:15 -08:00
|
|
|
var velocities = DifferentialDrive.tankDriveIK(1.0, 1.0, true);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(0.5, 1.0, true);
|
|
|
|
|
assertEquals(0.25, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(1.0, 0.5, true);
|
|
|
|
|
assertEquals(1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(0.25, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(-1.0, -1.0, true);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(-0.5, -1.0, true);
|
|
|
|
|
assertEquals(-0.25, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-1.0, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2026-03-06 14:19:15 -08:00
|
|
|
velocities = DifferentialDrive.tankDriveIK(-1.0, -0.5, true);
|
|
|
|
|
assertEquals(-1.0, velocities.left, 1e-9);
|
|
|
|
|
assertEquals(-0.25, velocities.right, 1e-9);
|
2022-02-17 18:03:59 -08:00
|
|
|
}
|
|
|
|
|
|
2021-05-21 22:34:16 -07:00
|
|
|
@Test
|
|
|
|
|
void testArcadeDrive() {
|
2024-01-01 13:37:51 -08:00
|
|
|
var left = new MockPWMMotorController();
|
|
|
|
|
var right = new MockPWMMotorController();
|
2026-03-06 14:19:15 -08:00
|
|
|
var drive = new DifferentialDrive(left::setDutyCycle, right::setDutyCycle);
|
2021-05-21 22:34:16 -07:00
|
|
|
drive.setDeadband(0.0);
|
|
|
|
|
|
|
|
|
|
// Forward
|
|
|
|
|
drive.arcadeDrive(1.0, 0.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(0.5, 0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.5, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(0.5, -0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.5, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward
|
|
|
|
|
drive.arcadeDrive(-1.0, 0.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(-0.5, 0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.5, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(-0.5, -0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-0.5, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testArcadeDriveSquared() {
|
2024-01-01 13:37:51 -08:00
|
|
|
var left = new MockPWMMotorController();
|
|
|
|
|
var right = new MockPWMMotorController();
|
2026-03-06 14:19:15 -08:00
|
|
|
var drive = new DifferentialDrive(left::setDutyCycle, right::setDutyCycle);
|
2021-05-21 22:34:16 -07:00
|
|
|
drive.setDeadband(0.0);
|
|
|
|
|
|
|
|
|
|
// Forward
|
|
|
|
|
drive.arcadeDrive(1.0, 0.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(0.5, 0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.25, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(0.5, -0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.25, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward
|
|
|
|
|
drive.arcadeDrive(-1.0, 0.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(-0.5, 0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.25, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.arcadeDrive(-0.5, -0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-0.25, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCurvatureDrive() {
|
2024-01-01 13:37:51 -08:00
|
|
|
var left = new MockPWMMotorController();
|
|
|
|
|
var right = new MockPWMMotorController();
|
2026-03-06 14:19:15 -08:00
|
|
|
var drive = new DifferentialDrive(left::setDutyCycle, right::setDutyCycle);
|
2021-05-21 22:34:16 -07:00
|
|
|
drive.setDeadband(0.0);
|
|
|
|
|
|
|
|
|
|
// Forward
|
|
|
|
|
drive.curvatureDrive(1.0, 0.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(0.5, 0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.25, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.75, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(0.5, -0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.75, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.25, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward
|
|
|
|
|
drive.curvatureDrive(-1.0, 0.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(-0.5, 0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.75, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-0.25, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(-0.5, -0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.25, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-0.75, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testCurvatureDriveTurnInPlace() {
|
2024-01-01 13:37:51 -08:00
|
|
|
var left = new MockPWMMotorController();
|
|
|
|
|
var right = new MockPWMMotorController();
|
2026-03-06 14:19:15 -08:00
|
|
|
var drive = new DifferentialDrive(left::setDutyCycle, right::setDutyCycle);
|
2021-05-21 22:34:16 -07:00
|
|
|
drive.setDeadband(0.0);
|
|
|
|
|
|
|
|
|
|
// Forward
|
|
|
|
|
drive.curvatureDrive(1.0, 0.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(0.5, 0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(0.5, -0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward
|
|
|
|
|
drive.curvatureDrive(-1.0, 0.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward left turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(-0.5, 0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward right turn
|
2022-10-27 21:59:11 -07:00
|
|
|
drive.curvatureDrive(-0.5, -0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testTankDrive() {
|
2024-01-01 13:37:51 -08:00
|
|
|
var left = new MockPWMMotorController();
|
|
|
|
|
var right = new MockPWMMotorController();
|
2026-03-06 14:19:15 -08:00
|
|
|
var drive = new DifferentialDrive(left::setDutyCycle, right::setDutyCycle);
|
2021-05-21 22:34:16 -07:00
|
|
|
drive.setDeadband(0.0);
|
|
|
|
|
|
|
|
|
|
// Forward
|
|
|
|
|
drive.tankDrive(1.0, 1.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward left turn
|
|
|
|
|
drive.tankDrive(0.5, 1.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.5, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward right turn
|
|
|
|
|
drive.tankDrive(1.0, 0.5, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.5, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward
|
|
|
|
|
drive.tankDrive(-1.0, -1.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward left turn
|
|
|
|
|
drive.tankDrive(-0.5, -1.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.5, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward right turn
|
|
|
|
|
drive.tankDrive(-0.5, 1.0, false);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.5, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Test
|
|
|
|
|
void testTankDriveSquared() {
|
2024-01-01 13:37:51 -08:00
|
|
|
var left = new MockPWMMotorController();
|
|
|
|
|
var right = new MockPWMMotorController();
|
2026-03-06 14:19:15 -08:00
|
|
|
var drive = new DifferentialDrive(left::setDutyCycle, right::setDutyCycle);
|
2021-05-21 22:34:16 -07:00
|
|
|
drive.setDeadband(0.0);
|
|
|
|
|
|
|
|
|
|
// Forward
|
|
|
|
|
drive.tankDrive(1.0, 1.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward left turn
|
|
|
|
|
drive.tankDrive(0.5, 1.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(0.25, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Forward right turn
|
|
|
|
|
drive.tankDrive(1.0, 0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(0.25, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward
|
|
|
|
|
drive.tankDrive(-1.0, -1.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward left turn
|
|
|
|
|
drive.tankDrive(-0.5, -1.0, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-0.25, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-1.0, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
|
|
|
|
|
// Backward right turn
|
|
|
|
|
drive.tankDrive(-1.0, -0.5, true);
|
2026-03-06 14:19:15 -08:00
|
|
|
assertEquals(-1.0, left.getDutyCycle(), 1e-9);
|
|
|
|
|
assertEquals(-0.25, right.getDutyCycle(), 1e-9);
|
2021-05-21 22:34:16 -07:00
|
|
|
}
|
|
|
|
|
}
|