|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- #include "control_module.h"
-
- ControlModule::ControlModule(): ControlModule(0.0, 1.0, 1.0)
- {
- }
-
- ControlModule::ControlModule(double maxSpeed, double rotateSpeed, double moveSideSpeed)
- {
- motors[0] = 0.0;
- motors[1] = 0.0;
- motors[2] = 0.0;
- motors[3] = 0.0;
- this->maxSpeed = maxSpeed;
- this->rotateSpeed = rotateSpeed;
- this->moveSideSpeed = moveSideSpeed;
- }
-
- ControlModule::~ControlModule()
- {
- }
-
- void ControlModule::adjustSpeed(){
- double factor = 0.0;
- if(maxSpeed > 1.0)
- {
- factor = 1.0;
- }
- else if(maxSpeed < -1.0)
- {
- factor = -1.0;
- }
- else
- {
- factor = maxSpeed;
- }
-
- for(int i = 0; i < 4; i++)
- {
- motors[i] *= factor;
- }
- };
-
- void ControlModule::moveSide(int imageColumsMiddle, int contourColumsMiddle){
- double speed = moveSideSpeed * static_cast<double>(contourColumsMiddle - imageColumsMiddle)/static_cast<double>(imageColumsMiddle);
- motors[0] += speed;
- motors[1] -= speed;
- motors[2] -= speed;
- motors[3] += speed;
- }
-
- void ControlModule::drive(double ratio)
- {
- motors[0] += ratio;
- motors[1] += ratio;
- motors[2] += ratio;
- motors[3] += ratio;
- }
-
- void ControlModule::rotate(double ratio)
- {
- motors[0] += ratio;
- motors[1] -= ratio;
- motors[2] += ratio;
- motors[3] -= ratio;
- }
-
- void ControlModule::unit(){
- double max = 1.0E-6;
- for(int i = 0; i <= sizeof(motors)/sizeof(int); i++){
- if(motors[i] > max)
- max = motors[i];
- }
-
- //Avoid dividing by zero
- if (max > 0.001)
- {
- for(int i = 0; i < 4; i++){
- motors[i] /= max;
- }
- }
-
- }
-
- void ControlModule::calcSpeeds(int imageColumsMiddle, int contourColumsMiddle, double angle){
- std::unique_lock<std::mutex> lock(mtx);
- double rotationRatio = ratio(angle);
- rotate(rotationRatio);
- drive(1.0-std::fabs(rotationRatio));
- unit();
- adjustSpeed();
- }
-
- std::vector<double> ControlModule::readMotors()
- {
- std::unique_lock<std::mutex> lock(mtx);
- return std::vector<double> {motors[0], motors[1], motors[2], motors[3]};
- }
-
- double ControlModule::ratio(double angle)
- {
- double minAngularSpeed = -1.0;
- double maxAngularSpeed = 1.0;
- double speedRange = maxAngularSpeed - minAngularSpeed;
-
- double minAngle = -20.0;
- double maxAngle = 20.0;
- double angularRange = maxAngle - minAngle;
-
- if(angle < minAngle)
- {
- angle = minAngle;
- }
- if(angle > maxAngle)
- {
- angle = maxAngle;
- }
- double progress = angle - minAngle;
- double progressPercent = progress/angularRange;
-
- double speed = minAngularSpeed + progressPercent*speedRange;
- return speed;
- }
|