Main Page | Class Hierarchy | Alphabetical List | Data Structures | Directories | File List | Data Fields | Globals | Related Pages | Examples

HeadExample.cc

This example shows how to use the AiboHead class... It moves the head to the joint coordinates 0.0 , 0.0 , 0.0 for pan tilt and roll.

#include "HeadExample.h"

#include <OPENR/ODataFormats.h>
#include <OPENR/OPENRAPI.h>
#include <OPENR/OSyslog.h>
#include <OPENR/core_macro.h>


HeadExample::HeadExample() : State(SYSTEM_IDLE)
{
  OSYSDEBUG(("HeadExample()\n"));
  counter = 0;
};

OStatus HeadExample::DoInit(const OSystemEvent& event)
{
  OSYSDEBUG(("HeadExample::DoInit() \n"));
  
  NEW_ALL_SUBJECT_AND_OBSERVER;
  REGISTER_ALL_ENTRY;
  SET_ALL_READY_AND_NOTIFY_ENTRY;

  Head.OpenPrimitives();

  Head.NewCommandVectorData();
  
  // done in LedsExample
  // MotorPowerOn();
  
  
  return oSUCCESS;
};

OStatus HeadExample::DoStart(const OSystemEvent& event)
{
  OSYSDEBUG(("HeadExample::DoStart()Neu\n"));
  

  if (subject[sbjHEADTEST]->IsReady()){
    OSYSDEBUG(("---Joints ready to set\n"));
    Head.RefreshCommandVector(0);
    subject[sbjHEADTEST]->SetData(Head.Region[0]);
    subject[sbjHEADTEST]->NotifyObservers();

    Head.SetState(J_START);
  }

  State = SYSTEM_START;
  
  ENABLE_ALL_SUBJECT;
  ASSERT_READY_TO_ALL_OBSERVER;

  OSYSDEBUG(("---DoStart:END!! \n"));

  return oSUCCESS;
};

OStatus HeadExample::DoStop(const OSystemEvent& event)
{
  
  OSYSDEBUG(("HeadExample::DoStop()\n"));

  DISABLE_ALL_SUBJECT;
  DEASSERT_READY_TO_ALL_OBSERVER;
  return oSUCCESS;
};

OStatus HeadExample::DoDestroy(const OSystemEvent& event)
{
  OSYSDEBUG(("HeadExample::DoDestroy()\n"));
  
  DELETE_ALL_SUBJECT_AND_OBSERVER;
  return oSUCCESS;
};


void HeadExample::NotifyHead(const OReadyEvent& event)
{
  //OSYSDEBUG(("HeadExample::NotifyJoints()\n"));

  switch (State) {
  case SYSTEM_START:
    
    if(counter == 0){
      //OSYSDEBUG(("---HEAD_STATE INIT\n"));
      
      Head.SetJointGain();
      
      counter++;
      MoveToZeroPos();
    }
    else{
      
      MoveToZeroPos();
      
      counter++;
      
      if(counter >= ZERO_POS_MAX_COUNTER)
        State = SYSTEM_IDLE;
    }
    
    break;
    
  case (SYSTEM_IDLE):
    OSYSDEBUG(("---IDLE\n"));
    break;
    
  }
};


void HeadExample::MoveToZeroPos()
{
  OSYSDEBUG(("HeadExample::MoveToZeroPos()\n"));

    static double start, d_tilt;
    static double d_pan;
    static double d_roll;
    double dummy = 0.0; 
    static bool initialized = false;

    if (!initialized) {

        // multiplication with radtodeg and degtorad is only done to 
        // emphasize types and formats!
        start = RADTODEG *  Head.GetJointValue(HT);
        d_tilt = DEGTORAD * ((0.0 - start) / (double)ZERO_POS_MAX_COUNTER);

        start = Head.GetJointValue(HP);
        d_pan = ((0.0 - start) / (double)ZERO_POS_MAX_COUNTER);

        start = Head.GetJointValue(HR);
        d_roll = ((0.0 - start) / (double)ZERO_POS_MAX_COUNTER);

        initialized = true;
    } 

    int rgn = Head.FindFreeRegionIndex();
    
    Head.SetJointRel(d_tilt, HT, rgn);
    Head.SetJointRel(d_pan,  HP, rgn);
    Head.SetJointRel(d_roll, HR, rgn);
    subject[sbjHEADTEST]->SetData(Head.Region[rgn]);
    subject[sbjHEADTEST]->NotifyObservers();
};


tams Tim Baier AiboLib v0.2.4
Generated Thu Jan 19 11:54:28 2006 by doxygen 1.4.3