omni wheel library

Dependents:   quadOmni_yanagi NHK2017_octopus hayatoShooter

オムニ用のライブラリです。

omni.cpp

Committer:
UCHITAKE
Date:
2017-07-05
Revision:
5:f2fc4a0b6a6f
Parent:
0:979565e955a5
Child:
6:59171f3235b6

File content as of revision 5:f2fc4a0b6a6f:

#include "omni.h"

inline double fmax(double a, double b)
{
    if(a > b) {
        return a;
    } else {
        return b;
    }
}

inline double fmin(double a, double b)
{
    if(a < b) {
        return a;
    } else {
        return b;
    }
}

inline double toRadians(double degrees) {
    return degrees * (M_PI / 180.0);
}

Omni::Omni(int wheels, double initDegree) :
    wheels(wheels), initDegree(initDegree)
{
    for(int i = 0; i < wheels; i++) {
        wheel[i] = 0;
    }
}

bool Omni::computeXY(double parallelVector[], double moment)
{
    if(wheels < 3 || wheels > 4) {
        return 0;
    }

    double polar[2];

    polar[0] = atan2(parallelVector[1], parallelVector[0]);
    polar[1] = hypot(parallelVector[0], parallelVector[1]);

    return computePolar(polar, moment);
}

bool Omni::computePolar(double parallelVector[], double moment)
{
    if(wheels < 3 || wheels > 4) {
        return 0;
    }

    if(parallelVector[1] < 0 || parallelVector[1] > 1.0) {
        return 0;
    }

    double parallel[4] = {0};
    double parallelMax = 0;
    double parallelMin = 0;

    for(int i = 0; i < wheels; i++) {
        parallel[i] = sin(toRadians(parallelVector[0] + initDegree + (360 / wheels) * i)) * parallelVector[1];
    }
    for(int i = 0; i < wheels - 1; i++) {
        parallelMax = fmax(parallel[i], parallel[i + 1]);
        parallelMin = fmin(parallel[i], parallel[i + 1]);
    }
    if(parallelMax + moment > 1.0 || parallelMin + moment < -1.0) {
        for(int i = 0; i < wheels; i++) {
            parallel[i] *= (1.0 - fabs(moment));
        }
    }
    for(int i = 0; i < wheels; i++) {
        wheel[i] = parallel[i] + moment;
    }
    return 1;
}

bool Omni::stop()
{
    for(int i = 0; i < wheels; i++) {
        wheel[i] = 0;
    }
    return 1;
}

void Omni::setWheels(int wheel)
{
    wheels = wheel;
}

void Omni::setInitDegree(double degree)
{
    initDegree = degree;
}

double Omni::getOutput(int num)
{
    return wheel[num];
}