展示会用です 内容をすっきりさせました
Dependencies: ADXL345 AigamozuControlPackets_展示会 HMC5843 ITG3200 MBed_Adafruit-GPS-Library XBee agzIDLIST mbed
Fork of Aigamozu_Robot_ver4 by
Revision 38:5cd6d4964f65, committed 2016-10-24
- Comitter:
- s1200058
- Date:
- Mon Oct 24 08:15:16 2016 +0000
- Parent:
- 37:19a9a37a5658
- Commit message:
- ??????
Changed in this revision
diff -r 19a9a37a5658 -r 5cd6d4964f65 AigamozuControlPackets.lib --- a/AigamozuControlPackets.lib Thu Oct 29 07:52:14 2015 +0000 +++ b/AigamozuControlPackets.lib Mon Oct 24 08:15:16 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/aigamozu/code/AigamozuControlPackets/#b33b8b2a92b0 +https://developer.mbed.org/teams/aigamozu/code/AigamozuControlPackets_/#fbf8f617a6ab
diff -r 19a9a37a5658 -r 5cd6d4964f65 Kalman/Kalman.cpp
diff -r 19a9a37a5658 -r 5cd6d4964f65 Kalman/Kalman.h
diff -r 19a9a37a5658 -r 5cd6d4964f65 agzIDLIST.lib --- a/agzIDLIST.lib Thu Oct 29 07:52:14 2015 +0000 +++ b/agzIDLIST.lib Mon Oct 24 08:15:16 2016 +0000 @@ -1,1 +1,1 @@ -http://mbed.org/teams/aigamozu/code/agzIDLIST/#059b11d3e5d5 +http://mbed.org/teams/aigamozu/code/agzIDLIST/#cf7d54d395de
diff -r 19a9a37a5658 -r 5cd6d4964f65 main.cpp --- a/main.cpp Thu Oct 29 07:52:14 2015 +0000 +++ b/main.cpp Mon Oct 24 08:15:16 2016 +0000 @@ -4,43 +4,16 @@ // // Program name: Aigamozu ROBOT // Author: Mineta Kizuku -// +// Yokokawa // // /**********************************************/ /**********************************************/ //更新情報 -//2015/05/11 -//ロボットプログラムの作成 -// -//2015/05/13 -//カルマンフィルタの共分散の値を0.0001以下にならないようにした -//共分散の値を10進数に変換するようにした -// -//2015/05/13 Yokokawa -//何回目のGPSでとられたGPSか確認するようにしました。 -// -//2015/05/15 -//プログラムcreateReceiveStatusCommand()にて -//Aigamozu_collect_dataにinかoutかを送るためにstate関連をいじったので必要に応じて直してください。 -// -//2015/05//17 -//Send_Status関数内を変更:基地局への送信データのみ現在のモードを入れるパケットの部分に内外判定の結果を入れるようにした -//基地局以外には現在のモードを送信するようにしてある -//要確認!!!! -// -//2015/05/17 -//Get_GPS()の中身longitudeの範囲138〜140に変更 -// -//2015/05/19 -//autoモードのとき、三十秒前進・三秒右に転回に変更した。 -// -//2015/05/24 -//Kalmanフィルターを十進数で計算するようにした。 -//Kalmanフィルターの計算式を変更した。 -//set_kalmanを追加した。 -// +//展示会用プログラム +//中身をすっきりさせました。 +//Automodeの際のプログラムはgpsAuto()の中身を変更すれば大丈夫です。 /**********************************************/ #include "mbed.h" @@ -49,19 +22,8 @@ #include "AigamozuControlPackets.h" #include "agzIDLIST.h" #include "aigamozuSetting.h" -#include "Kalman.h" #include "math.h" -#define SIGMA_MIN 0.0001 - -//************ID Number***************** -//Robot ID: 'A' ~ 'Z' -//Base ID: 'a' ~ 'a' -//manager ID: '0'(数字のゼロ) -// -const char MyID = 'D'; -//************ID Number***************** - ///////////////////////////////////////// // //Pin Setting @@ -92,26 +54,9 @@ AigamozuControlPackets agz(agz_motorShield); -///////////////////////////////////////// -// -//For Kalman data -// -///////////////////////////////////////// -#define FIRST_S2 0.000001 -#define COUNTER_MAX 10000 -double x_cur,x_prev,y_cur,y_prev;//緯度と経度の時刻tと時刻t-1での推定値 -double s2x_cur=FIRST_S2,s2x_prev=FIRST_S2,s2y_cur=FIRST_S2,s2y_prev=FIRST_S2;//緯度経度のの時刻tと時刻t-1での共分散 -double s2_R=FIRST_S2;//GPSセンサの分散 -double Kx=0,Ky=0;//カルマンゲイン -double zx,zy;//観測値 -void Kalman(double Latitude,double Longitude); + int change = 0; -/* -LocalFileSystem local("local"); // マウントポイントを定義(ディレクトリパスになる) -FILE *fp; -char filename[16] = "/local/out0.txt"; -*/ ///////////////////////////////////////// // //Plus Speed @@ -126,112 +71,7 @@ } -///////////////////////////////////////// -// -//Send Status -// -//リクエストがきたとき、自分の位置情報などを返信する -///////////////////////////////////////// -void Send_Status(char SenderIDc){ - XBeeAddress64 send_Address; - if(SenderIDc == '0'){ - send_Address = manager_Address; - agz.createReceiveStatusCommand(MyID,SenderIDc, agz.nowMode, - agz.get_agzPoint_lati(),agz.get_agzPoint_longi(), - agz.get_agzPointKalman_lati(),agz.get_agzPointKalman_longi(), - agz.get_agzCov_lati(),agz.get_agzCov_longi()); - } - if(SenderIDc >= 'A' && SenderIDc <= 'Z'){ - send_Address = robot_Address[SenderIDc - 'A']; - //Create GPS Infomation Packet - agz.createReceiveStatusCommand(MyID,SenderIDc, agz.nowMode, - agz.get_agzPoint_lati(),agz.get_agzPoint_longi(), - agz.get_agzPointKalman_lati(),agz.get_agzPointKalman_longi(), - agz.get_agzCov_lati(),agz.get_agzCov_longi()); - } - if(SenderIDc >= 'a' && SenderIDc <= 'z'){ - send_Address = base_Address[SenderIDc - 'a']; - agz.createReceiveStatusCommand(MyID,SenderIDc, (int)agz.gpsAuto(), - agz.get_agzPoint_lati(),agz.get_agzPoint_longi(), - agz.get_agzPointKalman_lati(),agz.get_agzPointKalman_longi(), - agz.get_agzCov_lati(),agz.get_agzCov_longi()); - } - //send normal data - - /* - //debug*************************************************** - printf("latitude:%f,longitude:%f\nlatitudeK:%f,longitudeK:%f\nCovlat:%f,Covlongi:%f\n", - agz.get_agzPoint_lati(),agz.get_agzPoint_longi(), - agz.get_agzPointKalman_lati(),agz.get_agzPointKalman_longi(), - agz.get_agzCov_lati(),agz.get_agzCov_longi() - ); - for(int i = 0; i < RECEIVE_STATUS_COMMNAD_LENGTH; ++i) printf("%d ",agz.packetData[i]); - printf("\n"); - //debug end*************************************************** - */ - //Select Destination - ZBTxRequest tx64request(send_Address,agz.packetData,agz.getPacketLength()); - //Send -> Base - xbee.send(tx64request); - -} - -///////////////////////////////////////// -// -//Get GPS function -// -///////////////////////////////////////// - -void Get_GPS(Adafruit_GPS *myGPS){ - static int flag = 0; -// static int save_counter = 0; - - if (myGPS->fix) { - - agz.nowStatus = GPS_AVAIL; - agz.reNewRobotPoint(myGPS->latitudeH,myGPS->latitudeL,myGPS->longitudeH,myGPS->longitudeL); - - if(flag < COUNTER_MAX){ - flag++; - } - if(flag == 15){ - x_prev = agz.get_agzPoint_lati(); - y_prev = agz.get_agzPoint_longi(); - } - - if(flag >= 16){ - if(abs(x_prev - agz.get_agzPoint_lati()) < 0.001 && abs(y_prev - agz.get_agzPoint_longi()) < 0.001){ - Kalman(agz.get_agzPoint_lati(), agz.get_agzPoint_longi()); - change = 1; - } - else{ - change = 0; - } -/* if(save_counter < 10){ - fp = fopen(filename, "a"); - fprintf(fp, "%d %.14lf %.14lf %.14lf %.14lf %.14le %.14le \n", - change, agz.get_agzPoint_lati(),agz.get_agzPoint_longi(), - agz.get_agzPointKalman_lati(),agz.get_agzPointKalman_longi(), - agz.get_agzCov_lati(),agz.get_agzCov_longi()); - fclose(fp); - - if((flag - 16) % 500 == 0){ - filename[10]++; - save_counter++; - } - } -*/ - } - - printf("%.14lf %.14lf %.14lf %.14lf %.14le %.14le \n", - agz.get_agzPoint_lati(),agz.get_agzPoint_longi(), - agz.get_agzPointKalman_lati(),agz.get_agzPointKalman_longi(), - agz.get_agzCov_lati(),agz.get_agzCov_longi()); - } - else agz.nowStatus = GPS_UNAVAIL; - -} ///////////////////////////////////////// // @@ -245,154 +85,7 @@ agz.changeMode(packetdata); } - -///////////////////////////////////////// -// -//Get Status -// -///////////////////////////////////////// -void Get_Status(char SenderIDc,uint8_t *packetdata){ - - //マネージャからデータが来たとき - if(SenderIDc == '0'){ - printf("get manager Status\n"); - } - //他のロボットからデータが来たとき - if(SenderIDc >= 'A' && SenderIDc <= 'Z'){ - printf("get other robots Status\n"); - } - //基地局からデータが来たとき - if(SenderIDc >= 'a' && SenderIDc <= 'z'){ - printf("Get Base data\n"); - int id = SenderIDc - 'a'; - agz.reNewBasePoint(id,&packetdata[13],&packetdata[21]); - agz.reNewBasePointKalman(id,&packetdata[29],&packetdata[37]); - - //debug - for(int i = 0;i < 4;i++){ - printf("BASE:%d\n",i); - printf("latitude:%f,longitude:%f\nlatitudeK:%f,longitudeK:%f\n", - agz.get_basePoint_lati(i),agz.get_basePoint_longi(i), - agz.get_basePointKalman_lati(i),agz.get_basePointKalman_longi(i) - ); - } - } -} -void Get_Status_Kalman(char SenderIDc,uint8_t *packetdata){ - - //マネージャからデータが来たとき - if(SenderIDc == '0'){ - printf("get manager Status Kalman\n"); - } - //他のロボットからデータが来たとき - if(SenderIDc >= 'A' && SenderIDc <= 'Z'){ - printf("get other robots Status Kalman\n"); - } - //基地局からデータが来たとき - if(SenderIDc >= 'a' && SenderIDc <= 'z'){ - printf("Get Base data Kalman\n"); - int id = SenderIDc - 'a'; - agz.reNewBasePointKalman(id,&packetdata[29],&packetdata[37]); - - //debug - for(int i = 0;i < 4;i++){ - printf("BASE:%d\n",i); - printf("latitudeK:%f,longitudeK:%f\n", - agz.get_basePointKalman_lati(i),agz.get_basePointKalman_longi(i)); - } - } -} - -///////////////////////////////////////// -// -//Send_Request_to_base -// -///////////////////////////////////////// -void Send_Request_Base(int basenumber){ - printf("send\n"); - agz.createRequestCommand(MyID, basenumber); - //Select Destination - ZBTxRequest tx64request(base_Address[basenumber],agz.packetData,agz.getPacketLength()); - //Send -> Base - xbee.send(tx64request); -} - -///////////////////////////////////////// -// -//auto_Move -// -//InAreaかOutAreaの判定 -//Kalmanを通した値を出力(Baseと自分) -///////////////////////////////////////// - -void auto_Move(){ - - bool result; - int i; - - result = agz.gpsAuto(); - //agz.set_agzAutoGPS(); - //agz.set_agzKalmanGPS(); - - if(result == true){ - printf("Out Area\n"); - } -else if(result == false){ - printf("In Area\n"); -} -for(i = 0; i < 4; i++){ - printf("%d: %f, %f\n", i, agz.get_basePointKalman_lati(i), agz.get_basePointKalman_longi(i)); - } - printf("robot: %f, %f\n", agz.get_agzPointKalman_lati(), agz.get_agzPointKalman_longi()); - -} - -void print_gps(int count){ - - printf("%d times:\n", count); - printf("%f, %f\n", agz.get_agzPointKalman_lati(), agz.get_agzPointKalman_longi()); - -} - - -///////////////////////////////////////// -// -//Kalman Processing -// -///////////////////////////////////////// -void calc_Kalman(){ - //calc Kalman gain - Kx = s2x_prev/(s2x_prev+s2_R); - Ky = s2y_prev/(s2y_prev+s2_R); - //estimate - x_cur = x_prev + Kx*(zx-x_prev); - y_cur = y_prev + Ky*(zy-y_prev); - //calc sigma - s2x_cur = s2x_prev-Kx*s2x_prev; - s2y_cur = s2y_prev-Ky*s2y_prev; - -} - -void Kalman(double Latitude,double Longitude){ - - zx = Latitude; - zy = Longitude; - - calc_Kalman(); - - //更新 - x_prev = x_cur; - y_prev = y_cur; - s2x_prev = s2x_cur; - s2y_prev = s2y_cur; - - //agzPontKalmanとagzCovに格納する - agz.set_agzPointKalman_lati(x_cur); - agz.set_agzPointKalman_longi(y_cur); - agz.set_agzCov(s2x_cur,s2y_cur); - -} ///////////////////////////////////////// // @@ -411,33 +104,15 @@ //GPS setting gps_Serial = new Serial(p28,p27); Adafruit_GPS myGPS(gps_Serial); - Timer refresh_Timer; - const int refresh_Time = 1000; //refresh time in ms + Timer auto_Timer; const int auto_Time = 2000; //refresh time in ms - int count = 0; - - const int straight = 30000, turning = 34000, wait = 31000; - - myGPS.begin(GPS_BAUD_RATE); - - Timer collect_Timer; - const int collect_Time = 2000; //when we collect 4 GPS point, we use - int collect_flag = 0; - - char SenderIDc; - //GPS Send Command - myGPS.sendCommand(PMTK_SET_NMEA_OUTPUT_RMCONLY); - myGPS.sendCommand(PMTK_SET_NMEA_UPDATE_1HZ); - myGPS.sendCommand(PGCMD_ANTENNA); wait_ms(2000); //interrupt start - refresh_Timer.start(); auto_Timer.start(); agz.Move_Timer.start(); - collect_Timer.start(); printf("start\n"); @@ -453,8 +128,6 @@ if (xbee.getResponse().getApiId() == ZB_RX_RESPONSE) { xbee.getResponse().getZBRxResponse(zbRx); uint8_t *buf = zbRx.getFrameData();//フレームデータを格納する - uint8_t *buf1 = &buf[11];//データの部分のみを格納する - SenderIDc = buf1[5];//送信元のIDを取得する char Command_type = agz.checkCommnadType(buf);//コマンドタイプを取得する //Check Command Type @@ -464,9 +137,7 @@ Plus_Speed(buf); break; } - case STATUS_REQUEST:{ - Send_Status(SenderIDc); - printf("%c\n", SenderIDc); + case STATUS_REQUEST:{ break; } case CHANGE_MODE:{ @@ -474,7 +145,6 @@ break; } case RECEIVE_STATUS:{ - Get_Status(SenderIDc,buf1); break; } default:{ @@ -483,60 +153,12 @@ }//endswitch }//endifZB_RX_RESPONSE }//endifisAvailable - - myGPS.read(); - //recive gps module - //check if we recieved a new message from GPS, if so, attempt to parse it, - if ( myGPS.newNMEAreceived() ) { - if ( !myGPS.parse(myGPS.lastNMEA()) ) { - continue; - } - else{ - count++; - } - } - //一定時間ごとに自分のGPSデータを取得し、AigamozuControlPacketsないのagzPointとagzPointKalmanに格納する - if (refresh_Timer.read_ms() >= refresh_Time) { - refresh_Timer.reset(); - //print_gps(count); - Get_GPS(&myGPS); - - } - - //get base GPS - if( collect_Timer.read_ms() >= collect_Time){ - collect_Timer.reset(); - - Send_Request_Base(collect_flag); - - collect_flag++; - - if(collect_flag == 4){ - collect_flag = 0; - } - } - - if(agz.nowMode == AUTO_GPS_MODE && auto_Timer.read_ms() >= auto_Time){ + + if(agz.nowMode == AUTO_GPS_MODE && auto_Timer.read_ms() >= auto_Time){ auto_Timer.reset(); - auto_Move(); + agz.gpsAuto(); } - if(agz.nowMode == AUTO_GPS_MODE){ - if(agz.Move_Timer.read_ms() < straight){ - agz.test_Auto(0); //straight - } - if(agz.Move_Timer.read_ms() > straight && agz.Move_Timer.read_ms() < wait){ - agz.test_Auto(1); - } - if(agz.Move_Timer.read_ms() > wait && agz.Move_Timer.read_ms() < turning){ - agz.test_Auto(2); //Turn Right - } - if(agz.Move_Timer.read_ms() > turning){ - agz.test_Auto(3); - wait_ms(200); - agz.Move_Timer.reset(); - } - } } } \ No newline at end of file