00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "Imu6DofSensor.h"
00021 #include <iostream>
00022 #include <iomanip>
00023 #include "uvsim/utilities/utilities.h"
00024 #include "uvsim/utilities/constants.h"
00025 #include <boost/numeric/ublas/io.hpp>
00026
00027 using namespace boost::numeric::ublas;
00028
00029 namespace uvsim
00030 {
00031
00032
00033 Imu6DofSensor::Imu6DofSensor(std::string port, vector<double> freqCutMb,
00034 vector<double> freqCutFb, vector<double> freqCutWb):
00035 fb(3), wb(3), mb(3), fbRaw(3), wbRaw(3), mbRaw(3), freqCutMb(freqCutMb),
00036 freqCutFb(freqCutFb), freqCutWb(freqCutWb)
00037 {
00038 isStarted = false;
00039
00040
00041 serialPort.Open(port);
00042 serialPort.SetBaudRate(SerialStreamBuf::BAUD_115200);
00043 serialPort.SetCharSize(SerialStreamBuf::CHAR_SIZE_8);
00044 serialPort.SetParity(SerialStreamBuf::PARITY_NONE);
00045 serialPort.SetNumOfStopBits(1);
00046 serialPort.SetFlowControl(SerialStreamBuf::FLOW_CONTROL_NONE);
00047 serialPort.unsetf(std::ios_base::skipws);
00048 if (!serialPort.good())
00049 {
00050 std::cerr << "Error: IMU Serial port not setup correctly." << std::endl;
00051 exit(1);
00052 }
00053 else
00054 {
00055 std::clog << "IMU Serial port setup complete." << std::endl;
00056 }
00057 }
00058
00059 Imu6DofSensor::~Imu6DofSensor()
00060 {
00061 if (isStarted) stop();
00062 serialPort.Close();
00063 }
00064
00065
00066 bool Imu6DofSensor::read()
00067 {
00068 char c, c_prev = 0;
00069 int A, B;
00070 unsigned short array[10];
00071 bool dataOk;
00072
00073 while (1)
00074 {
00075
00076 dataOk = true;
00077
00078
00079 c = serialPort.get();
00080
00081
00082
00083
00084
00085
00086 if (c_prev == 'Z' && c == 'A')
00087 {
00088 for (int i = 0; i < 10; i++)
00089 {
00090
00091 A = serialPort.get();
00092 B = serialPort.get();
00093 array[i] = (A << 8) | B;
00094
00095
00096 if ((i != 0) && array[i] > 1024)
00097 {
00098 std::cout << "rejected: " << i << " : " << array[i] << std::endl;
00099 dataOk = false;
00100 break;
00101 }
00102 }
00103 if (dataOk)
00104 {
00105
00106 for (int i=0; i<3; i++)
00107 {
00108 mbRaw(i) = array[1+i];
00109 fbRaw(i) = array[4+i];
00110 wbRaw(i) = array[7+i];
00111 }
00112 return true;
00113 }
00114 }
00115 c_prev = c;
00116 }
00117 return false;
00118 }
00119
00120 void Imu6DofSensor::update()
00121 {
00122 if (!isStarted) std::cerr << "Error: you must start the imu before calling update" << std::endl;
00123 read();
00124 lowPass(freq,freqCutMb,mbRaw,mb);
00125 lowPass(freq,freqCutFb,fbRaw,fb);
00126 lowPass(freq,freqCutWb,wbRaw,wb);
00127 }
00128
00129 void Imu6DofSensor::stop()
00130 {
00131 isStarted = false;
00132 serialPort.write(&stopCmd, 1);
00133 }
00134
00135 void Imu6DofSensor::start(double frequency)
00136 {
00137 freq = frequency;
00138 serialPort.write(&exitMenuCmd, 1);
00139 serialPort.write(&startCmd, 1);
00140 read();
00141 mb = mbRaw;
00142 fb = fbRaw;
00143 wb = wbRaw;
00144 isStarted = true;
00145 }
00146
00147 void Imu6DofSensor::print()
00148 {
00149 std::cout << std::setprecision(3) << "mb: " << mb << " fb: " << fb << " wb: " << wb << std::endl;
00150 }
00151
00152 }
00153
00154