00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include <OPENR/OSyslog.h>
00013 #include "BallTrackingHead.h"
00014
00015 void
00016 BallTrackingHead::NotifySensor(const ONotifyEvent& event)
00017 {
00018 RCRegion* rgn = event.RCData(0);
00019
00020 if (initSensorIndex == false) {
00021 OSensorFrameVectorData* sv = (OSensorFrameVectorData*)rgn->Base();
00022 InitSensorIndex(sv);
00023 initSensorIndex = true;
00024 }
00025
00026 if (sensorRegions.size() == NUM_SENSOR_VECTOR) {
00027 sensorRegions.front()->RemoveReference();
00028 sensorRegions.pop_front();
00029 }
00030 rgn->AddReference();
00031 sensorRegions.push_back(rgn);
00032
00033 observer[event.ObsIndex()]->AssertReady();
00034 }
00035
00036 void
00037 BallTrackingHead::InitSensorIndex(OSensorFrameVectorData* sensorVec)
00038 {
00039
00040 for (int i = 0; i < NUM_JOINTS; i++) {
00041 for (int j = 0; j < sensorVec->vectorInfo.numData; j++) {
00042 OSensorFrameInfo* info = sensorVec->GetInfo(j);
00043 if (info->primitiveID == jointID[i]) {
00044 sensoridx[i] = j;
00045 OSYSDEBUG(("[%2d] %s\n", sensoridx[i], JOINT_LOCATOR[i]));
00046 break;
00047 }
00048 }
00049 }
00050 }
00051
00052 void
00053 BallTrackingHead::GetPanTiltAngle(longword frameNum, double* pan, double* tilt)
00054 {
00055 list<RCRegion*>::iterator iter = sensorRegions.begin();
00056 list<RCRegion*>::iterator last = sensorRegions.end();
00057 OSensorFrameVectorData* sv;
00058 OSensorFrameInfo* info;
00059 OSensorFrameData* data;
00060
00061 while (iter != last) {
00062
00063 sv = (OSensorFrameVectorData*)(*iter)->Base();
00064 info = sv->GetInfo(sensoridx[PAN_INDEX]);
00065 longword fn = info->frameNumber;
00066
00067 for (int i = 0; i < info->numFrames; i++) {
00068
00069 if (fn == frameNum) {
00070
00071 data = sv->GetData(sensoridx[PAN_INDEX]);
00072 *pan = degrees((double)data->frame[i].value / 1000000.0);
00073
00074 data = sv->GetData(sensoridx[TILT_INDEX]);
00075 *tilt = degrees((double)data->frame[i].value / 1000000.0);
00076
00077 return;
00078 }
00079
00080 fn++;
00081 if (fn > oframeMAX_NUMBER) fn = 1;
00082 }
00083
00084 ++iter;
00085 }
00086
00087
00088
00089
00090 RCRegion* rgn = sensorRegions.back();
00091 sv = (OSensorFrameVectorData*)rgn->Base();
00092 info = sv->GetInfo(sensoridx[PAN_INDEX]);
00093
00094 data = sv->GetData(sensoridx[PAN_INDEX]);
00095 *pan = degrees((double)data->frame[info->numFrames-1].value / 1000000.0);
00096
00097 data = sv->GetData(sensoridx[TILT_INDEX]);
00098 *tilt = degrees((double)data->frame[info->numFrames-1].value / 1000000.0);
00099 }