Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
--- 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
--- 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
--- 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
