目的地へたどり着くアルゴリズム
Dependencies: MPU9250_SPI TA7291P mbed
main.cpp
- Committer:
- tomoya123
- Date:
- 2017-03-17
- Revision:
- 0:5fef60d1a47e
File content as of revision 0:5fef60d1a47e:
#include "mbed.h" #include "HeptaGPS.h" #include "MPU9250.h" #include "ta7291p.h" #define MORTOR_LOW_SPEED 0.6 #define MORTOR_HIGH_SPEED 1.0 #define LATITUDE 35.72593 #define LONGITUDE 140.05737 #define MAGNET_CALIB_X 3.227 #define MAGNET_CALIB_Y -14.7 #define EQUATORIAL_RADIUS 6738137 Serial pc(USBTX, USBRX);//(tx,rx) Serial xbee(p9,p10); SPI spi(p5, p6, p7); mpu9250_spi imu(spi,p8); HeptaGPS gps(p13,p14);//(tx,rx) ta7291p mortor1(p25,p24,p26); ta7291p mortor2(p22,p21,p23); int flag; void Cmd_rx(){ char cmd; xbee.printf("interrupt!!\r"); cmd = xbee.getc(); if(cmd == 's'){ flag = 1; } else if(cmd == 'q'){ flag = 2; } }//割り込み関数 int Azimuthcal(float lat1,float log1){ float dlog,dlat,dx,dy,azimuth; dlog=(LONGITUDE - log1)*3.1415/180; dlat=(LATITUDE - lat1)*3.1415/180; dx=EQUATORIAL_RADIUS*dlog*cos(lat1*3.1415/180); dy=EQUATORIAL_RADIUS*dlat; azimuth = atan2(dx,dy)*180/3.1415; return azimuth; }//GPSからの方位角 int readCompas(float mx,float my){ float MagBear,ma,mb; imu.read_all(); ma = (mx - MAGNET_CALIB_X)*cos(7*3.1415/180); mb = (my - MAGNET_CALIB_Y)*cos(7*3.1415/180); MagBear = atan2(mb,ma)*180/3.1415; return MagBear; } //地磁気センサーからの磁方位角 void setup_MPU9250(void){ if(imu.init(1,BITS_DLPF_CFG_188HZ)){ //INIT the mpu9250 printf("\nCouldn't initialize MPU9250 via SPI!"); } imu.whoami(); //output the I2C address to know if SPI is working, it should be 104 wait(1); imu.set_gyro_scale(BITS_FS_2000DPS); //Set full scale range for gyros wait(1); imu.set_acc_scale(BITS_FS_16G); //Set full scale range for accs wait(1); imu.AK8963_whoami(); wait(0.1); imu.AK8963_calib_Magnetometer(); imu.calib_acc(); }//9軸センサーの前処理 void straight(void){ mortor1.rotf(MORTOR_HIGH_SPEED); mortor2.rotf(MORTOR_HIGH_SPEED); } void turn_left(void){ mortor1.rotf(MORTOR_LOW_SPEED); mortor2.rotf(MORTOR_HIGH_SPEED); } void turn_right(void){ mortor1.rotf(MORTOR_HIGH_SPEED); mortor2.rotf(MORTOR_LOW_SPEED); } void stop_mortor(void){ mortor1.rotstop(); mortor2.rotstop(); } int calc_distance(float lat1_s,float log1_s ){ float x1=(LONGITUDE - log1_s)*3.1415/180; float y1=(LATITUDE - lat1_s)*3.1415/180; float dx1=EQUATORIAL_RADIUS*x1*cos(lat1_s*3.1415/180); float dy1=EQUATORIAL_RADIUS*y1; float distance = sqrt(dx1*dx1 + dy1*dy1); if((distance > 0)&&(distance < 1)){ return flag = 2; } else{ return flag =1; } }//距離計算 void setup_GPS(float lat2,float log2){ xbee.printf("lat %2.5f,log %2.5f\r",lat2,log2); } int main() { float lat,log; float magx,magy; int Az,Com,attitudeAngle; setup_MPU9250(); xbee.attach(Cmd_rx,Serial::RxIrq); while(1){ gps.sensing(&lat,&log); setup_GPS(lat,log); if(flag == 1){ break; } } while(1){ gps.sensing(&lat,&log); xbee.printf("lat=%2.5f,log=%2.5f\r\n",lat,log); Az = Azimuthcal(lat,log); calc_distance(lat,log); magx = imu.Magnetometer[0]; magy = imu.Magnetometer[1]; Com = readCompas(magx,magy); attitudeAngle = Az + Com; if(flag==1){ if((attitudeAngle >= -30 )&&(attitudeAngle <= 30)){ straight(); } else if(attitudeAngle > 30){ turn_right(); }else{ turn_left(); } } else if(flag == 2){ xbee.printf("flag=2\r"); stop_mortor(); } else{ xbee.printf("stop\r"); stop_mortor(); } } }