BeoIMU.C
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include "Robots/Beobot2/Hardware/BeoIMU.H"
00039 #include "Ice/BeobotEvents.ice.H"
00040
00041
00042 BeoIMU::BeoIMU(OptionManager& mgr,
00043 const std::string& descrName, const std::string& tagName) :
00044 RobotBrainComponent(mgr, descrName, tagName),
00045 itsIMU(new IMU_MicroStrain_3DM_GX2(mgr)),
00046
00047 itsTimer(1000000),
00048 itsCurrMessageID(0)
00049 {
00050 addSubComponent(itsIMU);
00051
00052 itsTimer.reset();
00053 }
00054
00055
00056 void BeoIMU::configureSerial(std::string dev)
00057 {
00058 itsIMU->configureSerial(dev);
00059 }
00060
00061
00062 bool BeoIMU::setDataRequested(DataRequested dataRequested)
00063 {
00064 return itsIMU->setDataRequested(dataRequested);
00065 }
00066
00067
00068 BeoIMU::~BeoIMU()
00069 { }
00070
00071
00072 void BeoIMU::registerTopics()
00073 {
00074 this->registerPublisher("IMUMessageTopic");
00075 }
00076
00077
00078 void BeoIMU::evolve()
00079 {
00080
00081 if(itsIMU->newData())
00082 {
00083 DataRequested dr = itsIMU->getDataRequested();
00084
00085
00086 BeobotEvents::IMUMessagePtr msg =
00087 new BeobotEvents::IMUMessage;
00088 msg->RequestID = itsCurrMessageID;
00089
00090
00091 switch(dr)
00092 {
00093 case ACCEL_AND_ANG_RATE:
00094 {
00095
00096 AccelAndAngRateRecord record;
00097 itsIMU->getAccelerationAndAngularRate(record);
00098 LINFO("Acceleration x:%15.6f y:%15.6f z:%15.6f",
00099 record.accelX, record.accelY, record.accelZ);
00100 LINFO("Angular Rate x:%15.6f y:%15.6f z:%15.6f",
00101 record.angRateX , record.angRateY, record.angRateZ);
00102
00103 msg->validAccAndAng = true;
00104 msg->accelX = record.accelX;
00105 msg->accelY = record.accelY;
00106 msg->accelZ = record.accelZ;
00107
00108 msg->angRateX = record.angRateX;
00109 msg->angRateY = record.angRateY;
00110 msg->angRateZ = record.angRateZ;
00111
00112 msg->validMagnetometer = false;
00113 msg->validRollPitchYaw = false;
00114 }
00115 break;
00116
00117 case DELTA_ANG_AND_VEL:
00118
00119 break;
00120
00121 case MAGNETOMETER:
00122 {
00123
00124 MagnetometerRecord record;
00125 itsIMU->getMagnetometer(record);
00126 LINFO("Magnetometer x:%15.6f y:%15.6f z:%15.6f",
00127 record.magX, record.magY, record.magZ);
00128
00129 msg->validMagnetometer = true;
00130 msg->magX = record.magX;
00131 msg->magY = record.magY;
00132 msg->magZ = record.magZ;
00133
00134 msg->validAccAndAng = false;
00135 msg->validRollPitchYaw = false;
00136 }
00137 break;
00138
00139 case ORIENTATION_MATRIX:
00140
00141 break;
00142
00143 case ROLL_PITCH_YAW:
00144 {
00145
00146 RollPitchYawRecord rpyRecord;
00147 itsIMU->getRollPitchYaw(rpyRecord);
00148
00149 msg->validRollPitchYaw = true;
00150
00151
00152
00153 msg->roll = rpyRecord.roll;
00154 msg->pitch = rpyRecord.pitch;
00155 if(rpyRecord.yaw < 0)
00156 msg->yaw = rpyRecord.yaw + M_PI;
00157 else
00158 msg->yaw = rpyRecord.yaw - M_PI;
00159
00160 msg->validAccAndAng = false;
00161 msg->validMagnetometer = false;
00162
00163 LINFO("Euler Angle r:%15.6f p:%15.6f y:%15.6f",
00164 msg->roll, msg->pitch, msg->yaw);
00165 }
00166 break;
00167
00168 case TEMPERATURE:
00169
00170 break;
00171
00172 default: LERROR("Unknown data requested: %d", dr);
00173 }
00174
00175 LINFO("[%6d] Publishing IMUMessage", itsCurrMessageID);
00176 publish("IMUMessageTopic", msg);
00177
00178
00179 itsTimer.reset();
00180 itsCurrMessageID++;
00181 }
00182 }
00183
00184
00185 void BeoIMU::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg,
00186 const Ice::Current&)
00187 { }
00188
00189
00190
00191
00192
00193