TR-mbed 1.0
Loading...
Searching...
No Matches
ChassisSubsystem.h
Go to the documentation of this file.
1#ifndef TR_EMBEDDED_CHASSIS_SUBSYSTEM_H
2#define TR_EMBEDDED_CHASSIS_SUBSYSTEM_H
3
4#include "mbed.h"
7#include "util/peripherals/encoder/MA4.h"
8
12// #include <subsystems/ChassisKalman.h>
13// #include <algorithms/WheelKalman.h>
14#include <util/algorithms/PID.h>
15// #include <algorithms/WheelSpeeds.h>
16// #include <algorithms/ChassisSpeeds.h>
17
18#define CAN_BUS_TYPE CANHandler::CANBUS_1
19#define MOTOR_TYPE M3508
20#define M3508_POST_MAX_RPM 469
21#define INPUT_THRESHOLD 0.01
22
23#define PI 3.14159265
24#define SECONDS_PER_MINUTE 60
25#define TICKS_PER_ROTATION 8192.0
26#define WHEEL_DIAMETER_METERS 0.146
27#define WHEEL_TO_CHASSIS_CENTER_LX 0.21
28#define WHEEL_TO_CHASSIS_CENTER_LY 0.14
29
30#define MAX_BEYBLADE_SPEED 1800
31#define BEYBLADE_ACCELERATION 0.05
32#define MAX_VEL 2.92
33
35{
36 double r1x, r1y, r2x, r2y, r3x, r3y, r4x, r4y;
37};
38
40{
41 double LF;
42 double RF;
43 double LB;
44 double RB;
45
46 void operator*=(double scalar)
47 {
48 LF *= scalar;
49 RF *= scalar;
50 LB *= scalar;
51 RB *= scalar;
52 }
53};
54
56{
57 double vX;
58 double vY;
59 double vOmega;
60};
61
63{
64 double max_Vel;
65 double max_vOmega;
66};
67
75{
76public:
77
78 struct Config {
83
84 const double radius;
85 const double speed_pid_ff_ks;
86
89 MA4 *encoder; // External encoder for yaw position
90 };
91
99 ChassisSubsystem(const Config &config);
100
105 {
107 COAST
108 };
109
117
124
133
139
140 float previousRPM[4] = {0, 0, 0, 0};
141
142 static float limitAcceleration(float desiredRPM, float previousRPM, int power);
143
144 static double p_theory(int LeftFrontPower, int RightFrontPower, int LeftBackPower, int RightBackPower, int LeftFrontRpm, int RightFrontRpm, int LeftBackRpm, int RightBackRpm);
145
146 float estimatePowerWatts(int torqueCounts);
147
148 static double Bisection(int LeftFrontPower, int RightFrontPower, int LeftBackPower, int RightBackPower, int LeftFrontRpm, int RightFrontRpm, int LeftBackRpm, int RightBackRpm, float chassisPowerLimit);
149
151
157
162 float setWheelSpeeds(WheelSpeeds wheelSpeeds);
163
169
174 void setWheelPower(WheelSpeeds wheelPower);
175
181
187 float setChassisSpeeds(ChassisSpeeds desiredChassisSpeeds_, DRIVE_MODE mode = ROBOT_ORIENTED);
188
195 ChassisSpeeds rotateChassisSpeed(ChassisSpeeds speeds, double yawCurrent);
196
204
212 void setMotorSpeedPID(MotorLocation location, float kP, float kI, float kD);
213
219 void setSpeedIntegralCap(MotorLocation location, double cap);
220
226 void setSpeedFeedforward(MotorLocation location, double FF);
227
228
235
241 void setBrakeMode(BrakeMode brakeMode);
242
246 void initializeImu();
247
251 void periodic(IMU::EulerAngles *imuCurr = nullptr);
252
258 static double radiansToDegrees(double radians);
259
265 static double degreesToRadians(double degrees);
266
271 int getHeadingDegrees() const;
272
273
281 double getMotorSpeed(MotorLocation location, SPEED_UNIT unit);
282
289 void setOmniKinematicsLimits(double max_Vel, double max_vOmega);
290
294 void readImu();
295
296
302 bool setOdomReference();
303
306
310
313
316
321
323 double yaw_velo_gain = 0;
324 double yawPrior; // previous yaw for yaw_align
325
326 uint32_t lastPIDTime = 0;
327
328
332 double yawOdom;
333 double imuOdom;
334 int testData[300][4];
336
337 static double radiansToTicks(double radians);
338 static double ticksToRadians(double ticks);
339
340 // /**
341 // * Gets the yaw position from encoder (PWM) input in degrees (0-360)
342 // * @return yaw position in degrees, or -1 if encoder not available
343 // */
344 // double getEncoderYawPosition();
345
346 // /**
347 // * A helper method to calculate the moving average of the encoder readings for yaw position
348 // * @return the moving average of the encoder readings for yaw position
349 // */
350 // double encoderMovingAverage();
351
357
358private:
359 DJIMotor LF, RF, LB, RB;
360 DJIMotor *yaw = 0;
361 MA4 *encoder = nullptr;
362 double yawPhase;
363 BrakeMode brakeMode;
364
365 // double beybladeSpeed;
366 // bool beybladeIncreasing;
367 IMU &imu;
368 IMU::EulerAngles imuAngles;
369
370 static double rpmToRadPerSecond(double RPM);
371 static double radPerSecondToRPM(double radPerSecond);
372
373 OmniKinematics m_OmniKinematics;
374 float chassis_radius;
375 void setOmniKinematics(double radius, HOLONOMIC_MODE mode = OMNI);
376 // Eigen::MatrixXd wheelSpeedsToChassisSpeeds(WheelSpeeds wheelSpeeds);
377
378 double FF_Ks;
379
380 void setMotorPower(MotorLocation location, double power);
381 void setMotorSpeedRPM(MotorLocation location, double speed);
382 // void setMotorSpeedTicksPerSecond(int index, double speed);
383
384 double getMotorSpeedRPM(MotorLocation location);
385 int motorPIDtoPower(MotorLocation location, double speed, uint32_t dt);
386
387 // ChassisKalman chassisKalman;
388 double testAngle;
389 int lastTimeMs;
390
391 unsigned long m_lastTorqueUs = 0;
392};
393
394#endif // TR_EMBEDDED_CHASSIS_SUBSYSTEM_H
Definition ChassisSubsystem.h:75
void periodic(IMU::EulerAngles *imuCurr=nullptr)
Definition ChassisSubsystem.cpp:468
double yawOdom
Definition ChassisSubsystem.h:332
PID pid_RF
Definition ChassisSubsystem.h:318
DRIVE_MODE
Definition ChassisSubsystem.h:126
@ YAW_ALIGN
Definition ChassisSubsystem.h:131
@ REVERSE_YAW_ORIENTED
Definition ChassisSubsystem.h:128
@ ODOM_ORIENTED
Definition ChassisSubsystem.h:130
@ ROBOT_ORIENTED
Definition ChassisSubsystem.h:129
@ YAW_ORIENTED
Definition ChassisSubsystem.h:127
void setBrakeMode(BrakeMode brakeMode)
Definition ChassisSubsystem.cpp:435
uint32_t lastPIDTime
Definition ChassisSubsystem.h:326
static double degreesToRadians(double degrees)
Definition ChassisSubsystem.cpp:479
void setOmniKinematicsLimits(double max_Vel, double max_vOmega)
Definition ChassisSubsystem.cpp:494
double yawPrior
Definition ChassisSubsystem.h:324
BrakeMode
Definition ChassisSubsystem.h:105
@ BRAKE
Definition ChassisSubsystem.h:106
@ COAST
Definition ChassisSubsystem.h:107
float setChassisSpeeds(ChassisSpeeds desiredChassisSpeeds_, DRIVE_MODE mode=ROBOT_ORIENTED)
Definition ChassisSubsystem.cpp:287
static double Bisection(int LeftFrontPower, int RightFrontPower, int LeftBackPower, int RightBackPower, int LeftFrontRpm, int RightFrontRpm, int LeftBackRpm, int RightBackRpm, float chassisPowerLimit)
Definition ChassisSubsystem.cpp:118
static double radiansToTicks(double radians)
Definition ChassisSubsystem.cpp:712
MotorLocation
Definition ChassisSubsystem.h:111
@ RIGHT_BACK
Definition ChassisSubsystem.h:115
@ RIGHT_FRONT
Definition ChassisSubsystem.h:113
@ LEFT_BACK
Definition ChassisSubsystem.h:114
@ LEFT_FRONT
Definition ChassisSubsystem.h:112
WheelSpeeds chassisSpeedsToWheelSpeeds(ChassisSpeeds chassisSpeeds)
Definition ChassisSubsystem.cpp:551
ChassisSpeeds rotateChassisSpeed(ChassisSpeeds speeds, double yawCurrent)
Definition ChassisSubsystem.cpp:378
void setWheelPower(WheelSpeeds wheelPower)
Definition ChassisSubsystem.cpp:274
float setWheelSpeeds(WheelSpeeds wheelSpeeds)
Definition ChassisSubsystem.cpp:182
static double ticksToRadians(double ticks)
Definition ChassisSubsystem.cpp:717
PID pid_align
Definition ChassisSubsystem.h:322
OmniKinematicsLimits m_OmniKinematicsLimits
Definition ChassisSubsystem.h:307
int PEAK_POWER_SINGLE
Definition ChassisSubsystem.h:315
DJIMotor & getMotor(MotorLocation location)
Definition ChassisSubsystem.cpp:387
PID pid_LF
Definition ChassisSubsystem.h:317
void setSpeedFeedforward(MotorLocation location, double FF)
Definition ChassisSubsystem.cpp:415
void setSpeedIntegralCap(MotorLocation location, double cap)
Definition ChassisSubsystem.cpp:410
WheelSpeeds desiredWheelSpeeds
Definition ChassisSubsystem.h:305
void setMotorSpeedPID(MotorLocation location, float kP, float kI, float kD)
Definition ChassisSubsystem.cpp:405
SPEED_UNIT
Definition ChassisSubsystem.h:119
@ RPM
Definition ChassisSubsystem.h:121
@ METER_PER_SECOND
Definition ChassisSubsystem.h:122
@ RAD_PER_SECOND
Definition ChassisSubsystem.h:120
int getHeadingDegrees() const
Definition ChassisSubsystem.cpp:489
void initializeImu()
Definition ChassisSubsystem.cpp:440
static double p_theory(int LeftFrontPower, int RightFrontPower, int LeftBackPower, int RightBackPower, int LeftFrontRpm, int RightFrontRpm, int LeftBackRpm, int RightBackRpm)
Definition ChassisSubsystem.cpp:95
double getMotorSpeed(MotorLocation location, SPEED_UNIT unit)
Definition ChassisSubsystem.cpp:446
float estimatePowerWatts(int torqueCounts)
Definition ChassisSubsystem.cpp:157
void updateYawPhaseFromEncoder()
Definition ChassisSubsystem.cpp:699
bool setOdomReference()
Definition ChassisSubsystem.cpp:638
static float limitAcceleration(float desiredRPM, float previousRPM, int power)
Definition ChassisSubsystem.cpp:61
float previousRPM[4]
Definition ChassisSubsystem.h:140
ChassisSpeeds getChassisSpeeds() const
Definition ChassisSubsystem.cpp:282
int PEAK_POWER_ALL
Definition ChassisSubsystem.h:314
void readImu()
Definition ChassisSubsystem.cpp:463
float power_limit
Definition ChassisSubsystem.h:150
HOLONOMIC_MODE
Definition ChassisSubsystem.h:135
@ MECANUM
Definition ChassisSubsystem.h:137
@ OMNI
Definition ChassisSubsystem.h:136
static double radiansToDegrees(double radians)
Definition ChassisSubsystem.cpp:484
ChassisSpeeds m_chassisSpeeds
Definition ChassisSubsystem.h:311
int testDataIndex
Definition ChassisSubsystem.h:335
double yaw_velo_gain
Definition ChassisSubsystem.h:323
ChassisSpeeds desiredChassisSpeeds
Definition ChassisSubsystem.h:304
WheelSpeeds normalizeWheelSpeeds(WheelSpeeds wheelSpeeds) const
Definition ChassisSubsystem.cpp:257
WheelSpeeds m_wheelSpeeds
Definition ChassisSubsystem.h:312
BrakeMode getBrakeMode()
Definition ChassisSubsystem.cpp:430
int testData[300][4]
Definition ChassisSubsystem.h:334
double imuOdom
Definition ChassisSubsystem.h:333
ChassisSpeeds wheelSpeedsToChassisSpeeds(WheelSpeeds wheelSpeeds)
Definition ChassisSubsystem.cpp:580
WheelSpeeds getWheelSpeeds() const
Definition ChassisSubsystem.cpp:56
PID pid_RB
Definition ChassisSubsystem.h:320
PID pid_LB
Definition ChassisSubsystem.h:319
Definition DJIMotor.h:48
Definition IMU.h:7
Definition PID.h:138
Definition ChassisSubsystem.h:56
double vY
Definition ChassisSubsystem.h:58
double vX
Definition ChassisSubsystem.h:57
double vOmega
Definition ChassisSubsystem.h:59
Definition ChassisSubsystem.h:78
int left_front_can_id
Definition ChassisSubsystem.h:79
const double radius
Definition ChassisSubsystem.h:84
IMU & imu
Definition ChassisSubsystem.h:88
MA4 * encoder
Definition ChassisSubsystem.h:89
int right_front_can_id
Definition ChassisSubsystem.h:80
const double speed_pid_ff_ks
Definition ChassisSubsystem.h:85
float yaw_initial_offset_ticks
Definition ChassisSubsystem.h:87
int right_back_can_id
Definition ChassisSubsystem.h:82
int left_back_can_id
Definition ChassisSubsystem.h:81
Definition IMU.h:10
Definition ChassisSubsystem.h:63
double max_Vel
Definition ChassisSubsystem.h:64
double max_vOmega
Definition ChassisSubsystem.h:65
Definition ChassisSubsystem.h:35
double r1y
Definition ChassisSubsystem.h:36
double r1x
Definition ChassisSubsystem.h:36
double r3y
Definition ChassisSubsystem.h:36
double r2x
Definition ChassisSubsystem.h:36
double r2y
Definition ChassisSubsystem.h:36
double r4x
Definition ChassisSubsystem.h:36
double r3x
Definition ChassisSubsystem.h:36
double r4y
Definition ChassisSubsystem.h:36
Definition ChassisSubsystem.h:40
double RB
Definition ChassisSubsystem.h:44
void operator*=(double scalar)
Definition ChassisSubsystem.h:46
double RF
Definition ChassisSubsystem.h:42
double LF
Definition ChassisSubsystem.h:41
double LB
Definition ChassisSubsystem.h:43