odometry

Odometry.cpp

Committer:
zatakon
Date:
2015-08-11
Revision:
0:402f8c75d394
Child:
1:1765665581cc

File content as of revision 0:402f8c75d394:

#include "Odometry.h"

Robot::Robot(float wheelbase, float width, float countPerMeter)
{
    _whbs = wheelbase;
    _w = width;
    _countPerMeter = countPerMeter;
    
    _odom.resize(3);
    _ratio.resize(2);
}

float Robot::getRadius(float servoAngle)
{    
    if( abs(servoAngle - (M_PI/2) ) < 0.05 )
        _R = 999.9;       
    else {
        float alfa = servoAngle;
        float beta = alfa - (M_PI/2);
        _R = (_whbs / sin(beta)) * sin(alfa);         
    }
    return _R;
}

void Robot::countRadius(float servoAngle)
{    
    if( abs(servoAngle - (M_PI/2) ) < 0.05 )
        _R = 999.9;       
    else {
        float alfa = servoAngle;
        float beta = alfa - (M_PI/2);
        _R = (_whbs / sin(beta)) * sin(alfa);         
    }
}

float Robot::getServoAngle(float R)
{    
    R = -R;
    float beta = atan(_whbs / R);
    float servoAngle = (M_PI / 2) - beta;
    return servoAngle;
}

std::vector<float> Robot::getSpeed(std::vector<int> encoders) 
{    
    std::vector<float> data(3);
    float v, v1, v2, fi;
    
    v1 =  ((float)encoders[0] * 125.0)/(_countPerMeter); // left wheel
    v2 =  ((float)encoders[1] * 125.0)/(_countPerMeter); // right wheel
    
    v = (v1+v2)/2;
    
    if( abs(v) < 0.001 ) {
        _odom[0] = 0.0;
        _odom[1] = 0.0;
        _odom[2] = 0.0;
    }
    else {
        fi = v/_R;
        _odom[0] = _R*sin(fi);
        _odom[1] = _R*(1-cos(fi));
        _odom[2] = fi;
    }

    data[0] = _odom[0];
    data[1] = _odom[1];
    data[2] = _odom[2];
    
    return data;
}


std::vector<float> Robot::getMotorRatio()
{
  _ratio[0] = (1 - (_w/(2*_R)));
  _ratio[1] = (1 + (_w/(2*_R)));

  return _ratio;
}

std::vector<float> Robot::getMotorRatio(float R)
{
  _ratio[0] = (1 - (_w/(2*R)));
  _ratio[1] = (1 + (_w/(2*R)));

  return _ratio;
}