get GPS

Dependencies:   AigamozuControlPackets XBee agz_common mbed

main.cpp

Committer:
kityann
Date:
2015-04-08
Revision:
0:25715989dbc2

File content as of revision 0:25715989dbc2:


#include "mbed.h"
#include "XBee.h"

#include "agz_common.h"
#include "AigamozuControlPackets.h"


#define MY_BASE_NUMBER 0

XBee xbee(p13,p14);
Serial pc(USBTX, USBRX); // tx, rx

Ticker timer;

//robot data
AGZ_ROBOT robot[AGZ_NUM_ROBOTS];


    double sigmaGPS[2][2] = {{250,0},{0,250}};
    double K[2][2][2]= {{{1,0},{0,1}},{{1,0},{0,1}}};
    double sigma[2][2][2]= {{{250,0},{0,250}},{{250,0},{0,250}}};
    double y[2],x[2][2];


//function
//transform packetdata to robot data
void agz_transform_papcket(uint8_t* packet_data,int id){
    //set latitude, longitude, state
    robot[id].set_state(packet_data[9]);
    robot[id].set_LatitudeH(&packet_data[13]);
    robot[id].set_LatitudeL(&packet_data[17]);
    robot[id].set_LongitudeH(&packet_data[21]);
    robot[id].set_LongitudeL(&packet_data[25]);    
}

/*---------registere robot--------------*/
/*
void agz_register_robot(uint8_*t packet_data){
    uint8_t robot_id = packet_data[5];
    robot[robot_id].set_state(0);
    send_register_ack();
}
*/

/*---------timer set----*/

void agz_send_request(){
    static uint8_t next_send_address = 0,i;
    AigamozuControlPackets agz_packet;
    
    /*------search next moving robot--------*/
    
    for(i = next_send_address;i < AGZ_NUM_ROBOTS;i++){
        if(robot[i].get_state() != 0xFF){
            next_send_address = i;
            break;
        }
    }
    if(i == AGZ_NUM_ROBOTS){
        for(i = 0;i < AGZ_NUM_ROBOTS;i++){
            if(robot[i].get_state() != 0xFF){
                next_send_address = i;
                break;
            }
        }
    }
    
    agz_packet.createRequestCommand(MY_BASE_NUMBER,next_send_address);
    
    ZBTxRequest agz_request_packet = ZBTxRequest(Agz_XBee_Remote_Address[next_send_address], agz_packet.packetData, REQUEST_COMMNAD_LENGTH );   
    
    xbee.send(agz_request_packet);
    
    next_send_address++;
}

void get_K(){
    double ad_bc = (sigma[0][0][0]+sigmaGPS[0][0])*(sigma[0][1][1]+sigmaGPS[1][1])-(sigma[0][1][0]+sigmaGPS[1][0])*(sigma[0][0][1]+sigmaGPS[0][1]);
    K[1][0][0] = sigma[0][0][0]*(1/ad_bc)*(sigma[1][1][1]+sigmaGPS[1][1]);
    K[1][1][1] = sigma[0][1][1]*(1/ad_bc)*(sigma[1][0][0]+sigmaGPS[0][0]);
}

void get_x(){
    x[1][0] = x[0][0]+K[1][0][0]*(y[0]-x[1][0]);
    x[1][1] = x[0][1]+K[1][1][1]*(y[1]-x[1][1]);
}

void get_sigma(){
    double temp[2][2];
    for(int i=0;i<2;i++) {
        for(int j=0;j<2;j++) {
            for(int k=0;k<2;k++) {
                temp[i][j]+=K[1][i][k]*sigma[0][k][j];
            }
        }
   }
    for(int i = 0;i < 2;i++){
        for(int j = 0;j < 2;j++){
            sigma[1][i][j] = sigma[0][i][j]-temp[i][j];
        }
    }   
}

void Kalman(double Latitude,double Longitude){
    y[0] = Latitude;
    y[1] = Longitude;
    //K[t+1] = sigma[t]*Inverse[sigma[t]+sigmaGPS];
    get_K();
    //x[t+1] = x[t]+K[t+1]*(y[t*1]-x[t]);
    get_x();
    //sigma[t+1] = sigma[t]-K[t+1]*sigma[t];
    get_sigma();
}


/*---------init---------*/

void agz_base_init(){
    xbee.begin(57600);
    pc.baud(57600);
    timer.attach(&agz_send_request,1.0);
    
}

void Kalman_init(){
}


int main(void){
    int sender,reciever;

    
    ZBRxResponse xbeeresponse;
    
    agz_base_init();
    
    wait(1);
    
    printf("start\n");
    
    
    robot[0].set_state(0);
    //robot[1].set_state(0);
    //robot[2].set_state(0);
    //robot[3].set_state(0);
    //robot[4].set_state(0);
    //robot[5].set_state(0);
    
    int count=0;
        
        
    while(1){
        xbee.readPacket();



        if(xbee.getResponse().isAvailable() ){ 
            xbee.getResponse(xbeeresponse);
            
            //get data packet
            if(xbee.getResponse().getApiId() == ZB_RX_RESPONSE){
                uint8_t *packet_data = xbeeresponse.getData();
                uint8_t packet_kinds = packet_data[3];
                
                //get sensor data
                if(packet_kinds == 'R'){
                    sender = packet_data[5]-1;// - 'A';
                    reciever = packet_data[7]-1;// - 'a';
                    agz_transform_papcket(packet_data,sender);
                    
                    
                    if(count==0){
                        count++;
                        x[1][0]=robot[sender].get_LatitudeL();                        
                        x[1][1]=robot[sender].get_LongitudeL();
                    }else if(count == 100){
                        printf("/////////////////////////Count = 100///////////////////////\n");
                        printf("state=%d,sender=%d,reciever=%d,latH=%ld.latL=%lf,longH=%ld.longL=%lf\n",robot[sender].get_state(),sender,reciever,
                        robot[sender].get_LatitudeH(),x[1][0],
                        robot[sender].get_LongitudeH(),x[1][1]);
                        for(int i = 0;i < 2;i++){
                            for(int j = 0;j < 2;j++){
                                printf("%lf ",sigma[0][i][j]);
                            }
                            printf("\n");
                        }
                        count = 0;          
                    }else{
                    count++;
                    Kalman(robot[sender].get_LatitudeL(),robot[sender].get_LongitudeL());
                    
                    
                    printf("%d,%d,%d,%ld.%ld,%ld.%ld\n",robot[sender].get_state(),sender,reciever,
                    robot[sender].get_LatitudeH(),robot[sender].get_LatitudeL(),
                    robot[sender].get_LongitudeH(),robot[sender].get_LongitudeL());
                    
                    
                    printf("state=%d,sender=%d,reciever=%d,latH=%ld.latL=%lf,longH=%ld.longL=%lf\n",robot[sender].get_state(),sender,reciever,
                    robot[sender].get_LatitudeH(),x[1][0],
                    robot[sender].get_LongitudeH(),x[1][1]);
                    //kousinn
                    for(int i = 0;i < 2;i++){
                        for(int j = 0;j < 2;j++){
                            K[0][i][j]=K[1][i][j];
                            x[0][i]=x[1][i];
                            sigma[0][i][j]=sigma[1][i][j];
                        }
                    }
                    }
                    
                }
                //get register packet
                if(packet_kinds == 'E'){
                    //agz_register_robot(packet_data);
                }
            }else{
                //get not rx response
            }
        }else{
          
        }
    }
}