anyKode Marilou
ContentsIndexHome
PreviousUpNext
DeviceAbsolutCompass

Gestion des compass.

C++
class DeviceAbsolutCompass : public Device;

ModaCpp.h

La classe DeviceAbsolutCompass ne dois pas être instanciée par le programme lui même: elle doit être obtenue par QueryDeviceAbsolutCompass de la classe RobotPHX.

 

Le capteur donne l'angle absolu entre l'axe de la géométrie qui embarque le capteur et la direction du pole nord. 

 

Comment créer cet équipement ? 

Les différents paramètres passés aux fonctions d'accès à la device sont interprétés et modifiés si nécessaire afin de respecter les contraintes imposées dans la modélisation.

///////////////////////////////////////////////////////
// Sample from Samples/Devices/AbsoluteCompass/C++
///////////////////////////////////////////////////////

#include "Modacpp.h"
#include "MyScene.h"
#include "conio.h"

#define MODASERVER "localhost"

using namespace ModaCPP;
using namespace xkode::lib;

//-------------------------------------------------------------------------------
//global vars
ModaCPP::Connection *connection;
DeviceMotor *pLeft;
DeviceMotor *pRight;
DeviceAbsolutCompass *pCompass;

DeviceLightSource *pLightN;
DeviceLightSource *pLightS;
DeviceLightSource *pLightW;
DeviceLightSource *pLightE;

//-------------------------------------------------------------------------------
float CalculateError(float currentangle,float togodeg)
    {
    currentangle=MathFunctions::Mod_MPI_PI(currentangle);
    float error=currentangle-MathFunctions::ToRad(togodeg);
    return( xkode::lib::Math::fmod_MPI_PI_FLOAT(error));
    }

//-------------------------------------------------------------------------------
void RegulateAngle(float togodeg,DeviceLightSource *pLight)
    {
    float angle,error;

    pLight->SetIntensity(0.7f);
    while(true)
        {
        angle=pCompass->GetAngleRAD();
        error=CalculateError(angle,togodeg);

        _cprintf("togo: %f currentangle: %f, error:%f\r\n",togodeg,MathFunctions::ToDeg(angle),MathFunctions::ToDeg(error));

        pLeft->SetVelocityRPS(2.0f*error);
        pRight->SetVelocityRPS(-2.0f*error);
        connection->Sleep(20);

        if( fabs(error)<=xkode::lib::Math::ToRad(5.0f))
            {
            pLight->SetIntensity(1.0f);
            pLeft->SetVelocityRPS(0);
            pRight->SetVelocityRPS(0);
            connection->Sleep(2000);
            break;
            }
        }
    pLight->SetIntensity(0.0f);
    }

//-------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
connection=new ModaCPP::Connection(true);
//Try connect to MODA server
if(connection->Connect(MODASERVER))
    {
    _cprintf("Connection ok to moda server\r\n");
    //Find the robot
    MyScene *pScene=connection->QueryRobotPHX2<MyScene>("/");

    if(pScene && pScene->IsValid() )
        {
        _cprintf("scene ok\r\n");

        pLeft=pScene->GetMotorByIndex(MyScene_MOTOR01_INDEX);
        pRight=pScene->GetMotorByIndex(MyScene_MOTOR00_INDEX);
        pCompass=pScene->GetAbsolutCompassByIndex(MyScene_ABSOLUTCOMPASS00_INDEX);

        pLightN=pScene->GetLightSourceByPath("lightN/rlight0/l");
        pLightS=pScene->GetLightSourceByPath("lightS/rlight0/l");
        pLightW=pScene->GetLightSourceByPath("lightW/rlight0/l");
        pLightE=pScene->GetLightSourceByPath("lightE/rlight0/l");

        //sitch off lights
        pLightN->SetIntensity(0);
        pLightS->SetIntensity(0);
        pLightW->SetIntensity(0);
        pLightE->SetIntensity(0);

        //force devices on state
        pCompass->On();
        pRight->On();
        pLeft->On();
        connection->Sleep(100);

        while(!_kbhit())
            {
            //rotate in north direction
            RegulateAngle(0,pLightN);

            //rotate in north west
            RegulateAngle(90,pLightW);

            //rotate in north south
            RegulateAngle(180,pLightS);

            //rotate in north east
            RegulateAngle(270,pLightE);
            }
        delete pScene;
        }
    else
        {
        _cprintf("robot not found\r\n");
        }
    }
else
    {
    _cprintf("Unable to connect to moda server\r\n");
    }
//Disconnect & delete
connection->Disconnect();
delete connection;
_getch();
return 0;
}
Documentation v4.7 (18/01/2015), Copyright (c) 2015 anyKode. All rights reserved.
What do you think about this topic? Send feedback!