2017-09-28 23:30:00 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
2019-07-31 22:15:22 -07:00
|
|
|
/* Copyright (c) 2008-2019 FIRST. All Rights Reserved. */
|
2017-09-28 23:30:00 -07:00
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
|
/* the project. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
2018-07-20 00:03:45 -07:00
|
|
|
#include "frc/drive/MecanumDrive.h"
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
#include <algorithm>
|
|
|
|
|
#include <cmath>
|
|
|
|
|
|
2018-07-20 00:03:45 -07:00
|
|
|
#include <hal/HAL.h>
|
2019-07-31 22:15:22 -07:00
|
|
|
#include <wpi/math>
|
2017-09-28 23:30:00 -07:00
|
|
|
|
2018-07-20 00:03:45 -07:00
|
|
|
#include "frc/SpeedController.h"
|
|
|
|
|
#include "frc/drive/Vector2d.h"
|
|
|
|
|
#include "frc/smartdashboard/SendableBuilder.h"
|
2019-09-14 15:22:54 -05:00
|
|
|
#include "frc/smartdashboard/SendableRegistry.h"
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
using namespace frc;
|
|
|
|
|
|
|
|
|
|
MecanumDrive::MecanumDrive(SpeedController& frontLeftMotor,
|
|
|
|
|
SpeedController& rearLeftMotor,
|
|
|
|
|
SpeedController& frontRightMotor,
|
|
|
|
|
SpeedController& rearRightMotor)
|
|
|
|
|
: m_frontLeftMotor(frontLeftMotor),
|
|
|
|
|
m_rearLeftMotor(rearLeftMotor),
|
|
|
|
|
m_frontRightMotor(frontRightMotor),
|
2017-12-04 23:28:33 -08:00
|
|
|
m_rearRightMotor(rearRightMotor) {
|
2019-09-14 15:22:54 -05:00
|
|
|
auto& registry = SendableRegistry::GetInstance();
|
|
|
|
|
registry.AddChild(this, &m_frontLeftMotor);
|
|
|
|
|
registry.AddChild(this, &m_rearLeftMotor);
|
|
|
|
|
registry.AddChild(this, &m_frontRightMotor);
|
|
|
|
|
registry.AddChild(this, &m_rearRightMotor);
|
2017-12-04 23:28:33 -08:00
|
|
|
static int instances = 0;
|
|
|
|
|
++instances;
|
2019-09-14 15:22:54 -05:00
|
|
|
registry.AddLW(this, "MecanumDrive", instances);
|
2017-12-04 23:28:33 -08:00
|
|
|
}
|
2017-09-28 23:30:00 -07:00
|
|
|
|
2017-11-26 18:36:51 -08:00
|
|
|
void MecanumDrive::DriveCartesian(double ySpeed, double xSpeed,
|
|
|
|
|
double zRotation, double gyroAngle) {
|
2017-09-28 23:30:00 -07:00
|
|
|
if (!reported) {
|
2019-09-29 20:35:04 -07:00
|
|
|
HAL_Report(HALUsageReporting::kResourceType_RobotDrive,
|
|
|
|
|
HALUsageReporting::kRobotDrive2_MecanumCartesian, 4);
|
2017-09-28 23:30:00 -07:00
|
|
|
reported = true;
|
|
|
|
|
}
|
|
|
|
|
|
2019-08-28 23:24:30 -07:00
|
|
|
ySpeed = std::clamp(ySpeed, -1.0, 1.0);
|
2017-11-26 18:36:51 -08:00
|
|
|
ySpeed = ApplyDeadband(ySpeed, m_deadband);
|
2017-09-28 23:30:00 -07:00
|
|
|
|
2019-08-28 23:24:30 -07:00
|
|
|
xSpeed = std::clamp(xSpeed, -1.0, 1.0);
|
2017-11-26 18:36:51 -08:00
|
|
|
xSpeed = ApplyDeadband(xSpeed, m_deadband);
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
// Compensate for gyro angle.
|
2017-11-26 18:36:51 -08:00
|
|
|
Vector2d input{ySpeed, xSpeed};
|
|
|
|
|
input.Rotate(-gyroAngle);
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
double wheelSpeeds[4];
|
2017-11-26 18:36:51 -08:00
|
|
|
wheelSpeeds[kFrontLeft] = input.x + input.y + zRotation;
|
2018-05-19 04:22:20 -04:00
|
|
|
wheelSpeeds[kFrontRight] = -input.x + input.y - zRotation;
|
2017-11-26 18:36:51 -08:00
|
|
|
wheelSpeeds[kRearLeft] = -input.x + input.y + zRotation;
|
2018-05-19 04:22:20 -04:00
|
|
|
wheelSpeeds[kRearRight] = input.x + input.y - zRotation;
|
2017-09-28 23:30:00 -07:00
|
|
|
|
|
|
|
|
Normalize(wheelSpeeds);
|
|
|
|
|
|
|
|
|
|
m_frontLeftMotor.Set(wheelSpeeds[kFrontLeft] * m_maxOutput);
|
2018-05-19 04:22:20 -04:00
|
|
|
m_frontRightMotor.Set(wheelSpeeds[kFrontRight] * m_maxOutput *
|
|
|
|
|
m_rightSideInvertMultiplier);
|
2017-09-28 23:30:00 -07:00
|
|
|
m_rearLeftMotor.Set(wheelSpeeds[kRearLeft] * m_maxOutput);
|
2018-05-19 04:22:20 -04:00
|
|
|
m_rearRightMotor.Set(wheelSpeeds[kRearRight] * m_maxOutput *
|
|
|
|
|
m_rightSideInvertMultiplier);
|
2017-09-28 23:30:00 -07:00
|
|
|
|
2018-11-22 21:15:26 -08:00
|
|
|
Feed();
|
2017-09-28 23:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
2017-11-26 18:36:51 -08:00
|
|
|
void MecanumDrive::DrivePolar(double magnitude, double angle,
|
|
|
|
|
double zRotation) {
|
2017-09-28 23:30:00 -07:00
|
|
|
if (!reported) {
|
2019-09-29 20:35:04 -07:00
|
|
|
HAL_Report(HALUsageReporting::kResourceType_RobotDrive,
|
|
|
|
|
HALUsageReporting::kRobotDrive2_MecanumPolar, 4);
|
2017-09-28 23:30:00 -07:00
|
|
|
reported = true;
|
|
|
|
|
}
|
|
|
|
|
|
2019-07-31 22:15:22 -07:00
|
|
|
DriveCartesian(magnitude * std::sin(angle * (wpi::math::pi / 180.0)),
|
|
|
|
|
magnitude * std::cos(angle * (wpi::math::pi / 180.0)),
|
|
|
|
|
zRotation, 0.0);
|
2017-09-28 23:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
2018-05-19 04:22:20 -04:00
|
|
|
bool MecanumDrive::IsRightSideInverted() const {
|
|
|
|
|
return m_rightSideInvertMultiplier == -1.0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MecanumDrive::SetRightSideInverted(bool rightSideInverted) {
|
|
|
|
|
m_rightSideInvertMultiplier = rightSideInverted ? -1.0 : 1.0;
|
|
|
|
|
}
|
|
|
|
|
|
2017-09-28 23:30:00 -07:00
|
|
|
void MecanumDrive::StopMotor() {
|
|
|
|
|
m_frontLeftMotor.StopMotor();
|
|
|
|
|
m_frontRightMotor.StopMotor();
|
|
|
|
|
m_rearLeftMotor.StopMotor();
|
|
|
|
|
m_rearRightMotor.StopMotor();
|
2018-11-22 21:15:26 -08:00
|
|
|
Feed();
|
2017-09-28 23:30:00 -07:00
|
|
|
}
|
|
|
|
|
|
2018-04-29 23:33:19 -07:00
|
|
|
void MecanumDrive::GetDescription(wpi::raw_ostream& desc) const {
|
2017-09-28 23:30:00 -07:00
|
|
|
desc << "MecanumDrive";
|
|
|
|
|
}
|
2017-12-04 23:28:33 -08:00
|
|
|
|
|
|
|
|
void MecanumDrive::InitSendable(SendableBuilder& builder) {
|
|
|
|
|
builder.SetSmartDashboardType("MecanumDrive");
|
2018-07-28 14:04:46 -07:00
|
|
|
builder.SetActuator(true);
|
|
|
|
|
builder.SetSafeState([=] { StopMotor(); });
|
2017-12-04 23:28:33 -08:00
|
|
|
builder.AddDoubleProperty("Front Left Motor Speed",
|
|
|
|
|
[=]() { return m_frontLeftMotor.Get(); },
|
|
|
|
|
[=](double value) { m_frontLeftMotor.Set(value); });
|
|
|
|
|
builder.AddDoubleProperty(
|
2018-05-19 04:22:20 -04:00
|
|
|
"Front Right Motor Speed",
|
|
|
|
|
[=]() { return m_frontRightMotor.Get() * m_rightSideInvertMultiplier; },
|
|
|
|
|
[=](double value) {
|
|
|
|
|
m_frontRightMotor.Set(value * m_rightSideInvertMultiplier);
|
|
|
|
|
});
|
2017-12-04 23:28:33 -08:00
|
|
|
builder.AddDoubleProperty("Rear Left Motor Speed",
|
|
|
|
|
[=]() { return m_rearLeftMotor.Get(); },
|
|
|
|
|
[=](double value) { m_rearLeftMotor.Set(value); });
|
2018-02-09 11:30:12 -05:00
|
|
|
builder.AddDoubleProperty(
|
2018-05-19 04:22:20 -04:00
|
|
|
"Rear Right Motor Speed",
|
|
|
|
|
[=]() { return m_rearRightMotor.Get() * m_rightSideInvertMultiplier; },
|
|
|
|
|
[=](double value) {
|
|
|
|
|
m_rearRightMotor.Set(value * m_rightSideInvertMultiplier);
|
|
|
|
|
});
|
2017-12-04 23:28:33 -08:00
|
|
|
}
|