118    std::string TargetIP;
 
  123 char buf[MAX_BUF_LEN+1]; 
 
  126 double GpsOrin[3]={0};
 
  129 int SelfCheckMainState=0;
 
  130 int SelfCheckSubState=0;
 
  135 double offLastTime=0;
 
  138    uint64_t m_start_time = 0;
 
  151 int recvlen=udp.RecvNoblock(buf,RecvIP,RecvPort,MAX_BUF_LEN);
 
  154 if (udp.needFilter && (RecvIP != TargetIP)){
 
  163                mavlink_message_t message;
 
  164                mavlink_status_t status;
 
  165                uint8_t msgReceived = 
false;
 
  167 if ((uint8_t)(buf[0]) == 0xEF){
 
  169                    onUdpMessage((uint8_t*)buf, recvlen);
 
  172 for(
int i = 0 ; i < recvlen ; ++i){
 
  173                        msgReceived = mavlink_parse_char(MAVLINK_COMM_1, (uint8_t)buf[i], &message, &status);
 
  175                            onMavLinkMessage(message);
 
  187 void onUdpMessage(uint8_t *buf, 
int recvlen){
 
  189            std::cout << 
"expect recvlen >=33, receive udp msg with length "<< recvlen << std::endl;
 
  193 for (
int i = 0; i < 4; i++){
 
  194 double received_double;
 
  195            memcpy(&received_double, &(buf[1+8*i]), 
sizeof(
double));
 
  196            mavState.obstacle[i] = received_double;
 
  203 void onMavLinkMessage(mavlink_message_t message){
 
  205 switch (message.msgid){
 
  206 case MAVLINK_MSG_ID_HEARTBEAT:{
 
  207                mavlink_heartbeat_t MavHartt;
 
  208                mavlink_msg_heartbeat_decode(&message, &MavHartt);
 
  210 if (MavHartt.custom_mode == 0)
 
  212 if (!mavState.isHeartRec){
 
  213                    mavState.isHeartRec = 
true;
 
  214                    mavState.TargetSysID = message.sysid;
 
  215                    mavState.TargetCompID = message.compid;
 
  216                    std::cout<<
"Drone #"<<CopterID<<
": "<<
"Heartbeat for SysID "<<std::to_string(message.sysid)<<
" and CompID "<<std::to_string(message.compid)<<std::endl;
 
  219                mavState.base_mode = MavHartt.base_mode;
 
  220                mavState.custom_mode = MavHartt.custom_mode;
 
  221                mavState.system_status = MavHartt.system_status;
 
  223 if(mavState.system_status==3){
 
  224                    mavState.isStanby=
true;
 
  226                    mavState.isStanby=
false;
 
  229 if(mavState.system_status==4){
 
  230                    mavState.isActive=
true;
 
  232                    mavState.isActive=
false;
 
  235 if ((mavState.base_mode & 
static_cast<uint8_t
>(MAV_MODE_FLAG::MAV_MODE_FLAG_SAFETY_ARMED)) > 0) {
 
  236 if(!mavState.isArmed){
 
  237                        mavState.isArmed = 
true;
 
  238                        std::cout<<
"Drone #"<<CopterID<<
": "<<
"PX4 Armed "<<std::endl;
 
  241 if(mavState.isArmed){
 
  242                        mavState.isArmed = 
false;
 
  243                        std::cout<<
"Drone #"<<CopterID<<
": "<<
"PX4 Disamed. "<<std::endl;
 
  248                getFlightMode_px4(MavHartt.custom_mode,fm);
 
  249 if(fm!=mavState.flyMode){
 
  250                    std::string qstr=getFlightModeName_px4(fm);
 
  251                    std::cout<<
"Drone #"<<CopterID<<
": "<<qstr<<std::endl;
 
  254 if(fm==PX4_FLIGHTMODE_OFFBOARD){
 
  255                    mavState.isOffboard=
true;
 
  258                    mavState.isOffboard=
false;
 
  264 case MAVLINK_MSG_ID_SYS_STATUS:{
 
  265                mavlink_msg_sys_status_decode(&message, &mavState.sysStatus);
 
  266                mavState.batteryInfo[0] = mavState.sysStatus.battery_remaining;
 
  267                mavState.batteryInfo[1] = mavState.sysStatus.voltage_battery;
 
  268                mavState.batteryInfo[2] = mavState.sysStatus.current_battery;
 
  270 if(mavState.sysStatus.battery_remaining>=0 && mavState.sysStatus.battery_remaining<10){
 
  271 if (!mavState.isLowBatt){
 
  272                        mavState.isLowBatt=
true;
 
  273                        std::cout<<
"Drone #"<<CopterID<<
": "<<
"Low battery."<<std::endl;
 
  276 if(mavState.sysStatus.load>900){
 
  277 if (!mavState.isHighLoad){
 
  278                        mavState.isHighLoad=
true;
 
  279                        std::cout<<
"Drone #"<<CopterID<<
": "<<
"High CPU load."<<std::endl;
 
  283 if(mavState.sysStatus.drop_rate_comm>80){
 
  284 if (!mavState.isDropComm){
 
  285                        mavState.isDropComm=
true;
 
  286                        std::cout<<
"Drone #"<<CopterID<<
": "<<
"Communication high drop rate."<<std::endl;
 
  292 case MAVLINK_MSG_ID_EXTENDED_SYS_STATE:{
 
  293                mavlink_extended_sys_state_t mss;
 
  294                mavlink_msg_extended_sys_state_decode(&message, &mss);
 
  297 if(mavState.landed_state!=mss.landed_state){
 
  298                    mavState.landed_state=mss.landed_state;
 
  299 switch(mss.landed_state){
 
  300 case MAV_LANDED_STATE_ON_GROUND:
 
  301                            std::cout<<
"Drone #"<<CopterID<<
": "<<
"On ground."<<std::endl;
 
  303 case MAV_LANDED_STATE_IN_AIR:
 
  304                            std::cout<<
"Drone #"<<CopterID<<
": "<<
"In air."<<std::endl;
 
  306 case MAV_LANDED_STATE_TAKEOFF:
 
  307                            std::cout<<
"Drone #"<<CopterID<<
": "<<
"Takeoff."<<std::endl;
 
  309 case MAV_LANDED_STATE_LANDING:
 
  310                            std::cout<<
"Drone #"<<CopterID<<
": "<<
"Landing."<<std::endl;
 
  317 case MAVLINK_MSG_ID_LOCAL_POSITION_NED:{
 
  318                mavlink_local_position_ned_t lpn;
 
  319                mavlink_msg_local_position_ned_decode(&message, &lpn);
 
  320                data.localPos[0]=lpn.x;
 
  321                data.localPos[1]=lpn.y;
 
  322                data.localPos[2]=lpn.z;
 
  323                data.localVel[0] = lpn.vx;
 
  324                data.localVel[1] = lpn.vy;
 
  325                data.localVel[2] = lpn.vz;
 
  326                data.time_boot_ms = lpn.time_boot_ms;
 
  328 if(!mavState.isLocalNed){
 
  329                    mavState.isLocalNed=
true;
 
  330                    std::cout<<
"Drone #"<<CopterID<<
": Got local pos x,y,z "<<data.localPos[0]<<
","<<data.localPos[1]<<
","<<data.localPos[2]<<
","<<std::endl;
 
  335 if(mavState.isGpsHome){
 
  336 if(data.calcGlobalPos(GpsOrin)){
 
  337 if(!mavState.isGlobPos){
 
  338                            mavState.isGlobPos=
true;
 
  339                            std::cout<<
"Drone #"<<CopterID<<
": Got global pos x,y,z "<<data.GlobalPos[0]<<
","<<data.GlobalPos[1]<<
","<<data.GlobalPos[2]<<
","<<std::endl;
 
  346 case MAVLINK_MSG_ID_ATTITUDE:{
 
  347                mavlink_attitude_t att;
 
  348                mavlink_msg_attitude_decode(&message, &att);
 
  351                data.AngEular[0]=att.roll;
 
  352                data.AngEular[1]=att.pitch;
 
  353                data.AngEular[2]=att.yaw;
 
  354                data.AngRate[0]=att.rollspeed;
 
  355                data.AngRate[1]=att.pitchspeed;
 
  356                data.AngRate[2]=att.yawspeed;
 
  357                data.time_boot_ms = att.time_boot_ms;
 
  366 case MAVLINK_MSG_ID_BATTERY_STATUS:{
 
  367                mavlink_battery_status_t bat;
 
  368                mavlink_msg_battery_status_decode(&message, &bat);
 
  369                mavState.batteryInfo[0] = (double)bat.battery_remaining;
 
  372 case MAVLINK_MSG_ID_GLOBAL_POSITION_INT:{
 
  373                mavlink_global_position_int_t gp;
 
  374                mavlink_msg_global_position_int_decode(&message, &gp);
 
  378                data.GpsPos[0]=gp.lat;
 
  379                data.GpsPos[1]=gp.lon;
 
  380                data.GpsPos[2]=gp.alt;
 
  381                data.relative_alt = gp.relative_alt;
 
  382                data.GpsVel[0]=gp.vx;
 
  383                data.GpsVel[1]=gp.vy;
 
  384                data.GpsVel[2]=gp.vz;
 
  388 case MAVLINK_MSG_ID_GPS_RAW_INT:{
 
  390                mavlink_gps_raw_int_t gri;
 
  391                mavlink_msg_gps_raw_int_decode(&message, &gri);
 
  393                data.fix_type = gri.fix_type;
 
  395                data.satellites_visible = gri.satellites_visible;
 
  399 case MAVLINK_MSG_ID_ESTIMATOR_STATUS:{
 
  402                mavlink_estimator_status_t es;
 
  403                mavlink_msg_estimator_status_decode(&message, &es);
 
  406                data.pos_horiz_accuracy = es.pos_horiz_accuracy;
 
  407                data.pos_vert_accuracy = es.pos_vert_accuracy;
 
  413 case  MAVLINK_MSG_ID_HOME_POSITION:{
 
  416                mavlink_home_position_t hm;
 
  417                mavlink_msg_home_position_decode(&message, &hm);
 
  418                data.gpsHome[0] = hm.latitude;
 
  419                data.gpsHome[1] = hm.longitude;
 
  420                data.gpsHome[2] = hm.altitude;
 
  422                mavState.isGpsHome=
true;
 
  425 case MAVLINK_MSG_ID_STATUSTEXT:{
 
  426                mavlink_statustext_t mavStatusText;
 
  427                mavlink_msg_statustext_decode(&message, &mavStatusText);
 
  428                std::string mystr(mavStatusText.text);
 
  429                std::cout<<
"Drone #"<<CopterID<<
" STATUSTEXT: "<< mystr << std::endl;
 
  430                stringToLower(mystr);
 
  431 if (mystr.find(
"failsafe mode enabled") != std::string::npos) {
 
  432                    mavState.isFailSafeEn=
true;
 
  436 case MAVLINK_MSG_ID_COMMAND_ACK:{
 
  437                mavlink_command_ack_t mck;
 
  438                mavlink_msg_command_ack_decode(&message, &mck);
 
  446                        qstrt=
"TEMPORARILY_REJECTED";
 
  465                        cmdName = 
"ARM/DISARM";
 
  468                        cmdName = 
"SET_MODE";
 
  471                        cmdName = 
"REBOOT/SHUTDOWN";
 
  474                        cmdName = 
"REQUEST_MAVLINK_VERSION";
 
  477                        cmdName = 
"REQUEST_AUTOPILOT_VERSION";
 
  480                    cmdName = 
"NAV_GUIDED_ENABLE";
 
  483                        cmdName = 
"NAV_LAND";
 
  486                        cmdName = 
"NAV_TAKEOFF";
 
  489                        cmdName = 
"DO_REPOSITION";
 
  492                        cmdName = 
"ID: "+ std::to_string(mck.command);
 
  496                std::cout<<
"Drone #"<<CopterID<<
": "<<
"Command "<<cmdName<<
" "<<qstrt<<std::endl;
 
  505 void stringToLower(std::string& str)
 
  507        std::transform(str.begin(), str.end(), str.begin(), [](
char& c){
 
  508            return std::tolower(c);
 
  512 void SendMsg(mavlink_message_t mess){
 
  513 unsigned int length = mavlink_msg_to_send_buffer((uint8_t*)buf, &mess);
 
  516            udp.SendTo((
const char *)buf,length,TargetIP,TargetPort);
 
  521 void SendHeartbeat(){
 
  522        mavlink_message_t mess;
 
  523        mavlink_heartbeat_t MavHartt;
 
  524        MavHartt.autopilot = MAV_AUTOPILOT_INVALID;
 
  525        MavHartt.base_mode = 0;
 
  526        MavHartt.custom_mode = 0;
 
  527        MavHartt.system_status = MAV_STATE_ACTIVE;
 
  528        MavHartt.type = MAV_TYPE_GCS;
 
  529        mavlink_msg_heartbeat_encode(mavState.sysID, mavState.compID, &mess, &MavHartt);
 
  533 void SendMavCmdLong(uint16_t command, 
float param1, 
float param2=0, 
float param3=0,
float param4=0,
float param5=0,
float param6=0,
float param7=0)
 
  535        mavlink_message_t mess;
 
  536        mavlink_command_long_t command_long;
 
  537        command_long.target_system = mavState.TargetSysID;
 
  538        command_long.target_component = mavState.TargetCompID;
 
  539        command_long.confirmation = 0;
 
  540        command_long.command = command;
 
  541        command_long.param1 = param1;
 
  542        command_long.param2 = param2;
 
  543        command_long.param3 = param3;
 
  544        command_long.param4 = param4;
 
  545        command_long.param5 = param5;
 
  546        command_long.param6 = param6;
 
  547        command_long.param7 = param7;
 
  548        mavlink_msg_command_long_encode(mavState.sysID, mavState.compID, &mess, &command_long);
 
  553 void SendMavArm(
int isArm)
 
  557            SendMavCmdLong(MAV_CMD_COMPONENT_ARM_DISARM, 1);
 
  561            SendMavCmdLong(MAV_CMD_COMPONENT_ARM_DISARM, 0, 21196.0f);
 
  567 void SendSetMode(
int mainMode, 
int customMode=0)
 
  569        uint16_t baseMode = MAV_MODE_FLAG_MANUAL_INPUT_ENABLED | MAV_MODE_FLAG_CUSTOM_MODE_ENABLED;
 
  570        SendMavCmdLong(MAV_CMD_DO_SET_MODE, baseMode, mainMode, customMode);
 
  573 void SendPositionTarget(uint16_t type_mask, uint8_t coordinate, 
float *data){
 
  574        mavlink_message_t mess;
 
  575 if (coordinate == MAV_FRAME_LOCAL_NED) {
 
  576            mavlink_set_position_target_local_ned_t m_target_ned;
 
  578            m_target_ned.target_system = mavState.TargetSysID;
 
  579            m_target_ned.target_component = mavState.TargetCompID;
 
  580            m_target_ned.coordinate_frame = coordinate;
 
  581            m_target_ned.type_mask = type_mask;
 
  582            m_target_ned.x = data[0];
 
  583            m_target_ned.y = data[1];
 
  585            m_target_ned.z = data[2];
 
  586            m_target_ned.vx = data[3];
 
  587            m_target_ned.vy = data[4];
 
  589            m_target_ned.vz = data[5];
 
  590            m_target_ned.afx = data[6];
 
  591            m_target_ned.afy = data[7];
 
  593            m_target_ned.afz = data[8];
 
  594            m_target_ned.yaw = data[11];
 
  596            m_target_ned.yaw_rate = data[14];
 
  602            mavlink_msg_set_position_target_local_ned_encode(mavState.sysID, mavState.compID, &mess, &m_target_ned);
 
  604 else if (coordinate == MAV_FRAME_GLOBAL_INT){
 
  605            mavlink_set_position_target_global_int_t m_target_global;
 
  607            m_target_global.target_system = mavState.TargetSysID;
 
  608            m_target_global.target_component = mavState.TargetCompID;
 
  609            m_target_global.coordinate_frame = coordinate;
 
  610            m_target_global.type_mask = type_mask;
 
  611            m_target_global.lat_int = (int32_t)(data[0]*1e7);
 
  612            m_target_global.lon_int = (int32_t)(data[1]*1e7);
 
  613            m_target_global.alt = data[2];
 
  614            m_target_global.vx = data[3];
 
  615            m_target_global.vy = data[4];
 
  616            m_target_global.vz = data[5];
 
  617            m_target_global.afx = data[6];
 
  618            m_target_global.afy = data[7];
 
  619            m_target_global.afz = data[8];
 
  620            m_target_global.yaw = data[11];
 
  621            m_target_global.yaw_rate = data[14];
 
  622            mavlink_msg_set_position_target_global_int_encode(mavState.sysID, mavState.compID, &mess, &m_target_global);
 
  628 void SendAttitudeTarget(uint8_t type_mask, 
float *data){
 
  629        mavlink_message_t mess;
 
  630        mavlink_set_attitude_target_t m_target_att;
 
  632        m_target_att.target_system = mavState.TargetSysID;
 
  633        m_target_att.target_component = mavState.TargetCompID;
 
  634        m_target_att.type_mask = type_mask;
 
  636 float roll = data[9];
 
  637 float pitch = data[10];
 
  638 float yaw = data[11];
 
  639 float sp2 = sin(pitch/2);
 
  640 float sy2 = sin(yaw/2);
 
  641 float cr2 = cos(roll/2);
 
  642 float cp2 = cos(pitch/2);
 
  643 float cy2 = cos(yaw/2);
 
  644 float sr2 = sin(roll/2);
 
  646 float qx = sp2*sy2*cr2+cp2*cy2*sr2;
 
  647 float qy = sp2*cy2*cr2+cp2*sy2*sr2;
 
  648 float qz = cp2*sy2*cr2-sp2*cy2*sr2;
 
  649 float qw = cp2*cy2*cr2-sp2*sy2*sr2;
 
  651        m_target_att.q[0] = qw;
 
  652        m_target_att.q[1] = qx;
 
  653        m_target_att.q[2] = qy;
 
  654        m_target_att.q[3] = qz;
 
  655        m_target_att.body_roll_rate = data[12];
 
  656        m_target_att.body_pitch_rate = data[13];
 
  657        m_target_att.body_yaw_rate = data[14];
 
  658        m_target_att.thrust = data[15];
 
  659        mavlink_msg_set_attitude_target_encode(mavState.sysID, mavState.compID, &mess, &m_target_att);
 
  663 void SendParamInt(std::string 
id, 
int value){
 
  664        mavlink_message_t mess;
 
  665        mavlink_param_set_t param;
 
  667        param.target_system = mavState.TargetSysID;
 
  668        param.target_component = mavState.TargetCompID;
 
  669        param.param_value = float(value)/7.13622e+44; 
 
  670        param.param_type = MAV_PARAM_TYPE_INT32;
 
  671        strcpy(param.param_id, 
id.c_str());
 
  673        mavlink_msg_param_set_encode(mavState.sysID, mavState.compID, &mess, ¶m);
 
  677 void SendParamFloat(std::string 
id, 
float value){
 
  678        mavlink_message_t mess;
 
  679        mavlink_param_set_t param;
 
  681        param.target_system = mavState.TargetSysID;
 
  682        param.target_component = mavState.TargetCompID;
 
  683        param.param_value = value;
 
  684        param.param_type = MAV_PARAM_TYPE_REAL32;
 
  685        strcpy(param.param_id, 
id.c_str());
 
  687        mavlink_msg_param_set_encode(mavState.sysID, mavState.compID, &mess, ¶m);
 
  691 void SendRccTarget(
float *data)
 
  693        mavlink_message_t mess;
 
  694        mavlink_rc_channels_override_t rcc;
 
  695        uint16_t middle_rc = 1500;
 
  697        rcc.target_system = mavState.TargetSysID;
 
  698        rcc.target_component = mavState.TargetCompID;
 
  699        rcc.chan1_raw = (uint16_t)data[13];
 
  700        rcc.chan2_raw = (uint16_t)data[14];
 
  701        rcc.chan3_raw = (uint16_t)data[16];
 
  702        rcc.chan4_raw = (uint16_t)data[15];
 
  704        rcc.chan5_raw = middle_rc;
 
  705        rcc.chan6_raw = middle_rc;
 
  706        rcc.chan7_raw = middle_rc;
 
  707        rcc.chan8_raw = middle_rc;
 
  708        mavlink_msg_rc_channels_override_encode(mavState.sysID, mavState.compID, &mess, &rcc);
 
  712        mavlink_manual_control_t manual;
 
  713        manual.target = mavState.sysID;
 
  714        manual.x = (rcc.chan2_raw-1500)*2;
 
  715        manual.y = (rcc.chan1_raw-1500)*2;
 
  716        manual.z = rcc.chan3_raw-1000;
 
  717        manual.r = (rcc.chan4_raw-1500)*2;
 
  719        mavlink_msg_manual_control_encode(mavState.sysID, mavState.compID, &mess, &manual);
 
  725 void SendVisionPosition(uint64_t time_usec, 
float x, 
float y, 
float z, 
float roll, 
float pitch, 
float yaw)
 
  727        mavlink_message_t mess;
 
  728        mavlink_vision_position_estimate_t vision_position;
 
  729        vision_position.usec = time_usec;
 
  730        vision_position.x = x;
 
  731        vision_position.y = y;
 
  732        vision_position.z = z;
 
  733        vision_position.roll = roll;
 
  734        vision_position.pitch = pitch;
 
  735        vision_position.yaw = yaw;
 
  737        mavlink_msg_vision_position_estimate_encode(mavState.sysID, mavState.compID, &mess, &vision_position);
 
  759 void Send3DShow(
double y[30])
 
  762        uint64_t time_usec = y[0]*1000000+y[1];
 
  764            m_start_time=time_usec;
 
  766 double runTime = (time_usec-m_start_time)/1000000.0; 
 
  767        m_show3d.checksum=123456789;
 
  768        m_show3d.copterID = CopterID;
 
  769        m_show3d.runnedTime = runTime;
 
  770        m_show3d.vehicleType = 600251; 
 
  771 for (
int i = 0; i < 3; i++) {
 
  772            m_show3d.PosE[i] = y[2+i];
 
  773            m_show3d.AngEuler[i] = y[19+i];
 
  774            m_show3d.VelE[i]= y[11+i];
 
  775            m_show3d.PosGPS[i]=0;
 
  777            m_show3d.AccB[i]=y[16+i];
 
  778            m_show3d.AngQuatern[i]=y[5+i];
 
  780        m_show3d.AngQuatern[3]=y[8];
 
  783 if(m_show3d.runnedTime>1 && m_show3d.PosE[2]<-0.1){
 
  784 for (
int i = 0; i < 4; i++) {
 
  785                m_show3d.MotorRPMS[i] = 500; 
 
  786                m_show3d.MotorRPMS[4+i] = 0;
 
  791        udp.SendTo((
const char *)&m_show3d,
sizeof(m_show3d),
"127.0.0.1",20010);
 
  859 case PX4_FLIGHTMODE_MANUAL:
 
  860            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_MANUAL;
 
  861            outdata.sub_mode = 0;
 
  863 case PX4_FLIGHTMODE_ALT:
 
  864            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_ALTCTL;
 
  865            outdata.sub_mode = 0;
 
  867 case PX4_FLIGHTMODE_POS:
 
  868            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_POSCTL;
 
  869            outdata.sub_mode = 0;
 
  871 case PX4_FLIGHTMODE_TAKEOFF:
 
  872            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_AUTO;
 
  873            outdata.sub_mode = PX4_CUSTOM_SUB_MODE_AUTO_TAKEOFF;
 
  875 case PX4_FLIGHTMODE_LAND:
 
  876            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_AUTO;
 
  877            outdata.sub_mode = PX4_CUSTOM_SUB_MODE_AUTO_LAND;
 
  879 case PX4_FLIGHTMODE_MISSION:
 
  880            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_AUTO;
 
  881            outdata.sub_mode = PX4_CUSTOM_SUB_MODE_AUTO_MISSION;
 
  883 case PX4_FLIGHTMODE_RTL:
 
  884            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_AUTO;
 
  885            outdata.sub_mode = PX4_CUSTOM_SUB_MODE_AUTO_RTL;
 
  888 case PX4_FLIGHTMODE_STABILIZED:
 
  889            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_STABILIZED;
 
  890            outdata.sub_mode = 0;
 
  893 case PX4_FLIGHTMODE_OFFBOARD:
 
  894            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_OFFBOARD;
 
  895            outdata.sub_mode = 0;
 
  898 case PX4_FLIGHTMODE_AUTO_READY:
 
  899            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_AUTO;
 
  900            outdata.sub_mode = PX4_CUSTOM_SUB_MODE_AUTO_LOITER;
 
  903 case PX4_FLIGHTMODE_AUTO_LOITER:
 
  904            outdata.main_mode = PX4_CUSTOM_MAIN_MODE_AUTO;
 
  905            outdata.sub_mode = PX4_CUSTOM_SUB_MODE_AUTO_LOITER;
 
  911        outCustomMode = outdata.data;
 
 
  914 void getFlightMode_px4(uint32_t inCustomMode, PX4_FLIGHTMODE& outMode){
 
  916        indata.data = inCustomMode;
 
  918 if (indata.main_mode == PX4_CUSTOM_MAIN_MODE_MANUAL){
 
  919            outMode = PX4_FLIGHTMODE_MANUAL;
 
  921 else if (indata.main_mode == PX4_CUSTOM_MAIN_MODE_ALTCTL){
 
  922            outMode = PX4_FLIGHTMODE_ALT;
 
  924 else if (indata.main_mode == PX4_CUSTOM_MAIN_MODE_POSCTL){
 
  925            outMode = PX4_FLIGHTMODE_POS;
 
  927 else if (indata.main_mode == PX4_CUSTOM_MAIN_MODE_OFFBOARD){
 
  928            outMode = PX4_FLIGHTMODE_OFFBOARD;
 
  930 else if (indata.main_mode == PX4_CUSTOM_MAIN_MODE_STABILIZED){
 
  931            outMode = PX4_FLIGHTMODE_STABILIZED;
 
  933 else if (indata.main_mode == PX4_CUSTOM_MAIN_MODE_AUTO)
 
  935 if (indata.sub_mode == PX4_CUSTOM_SUB_MODE_AUTO_MISSION){
 
  936                outMode = PX4_FLIGHTMODE_MISSION;
 
  938 else if (indata.sub_mode == PX4_CUSTOM_SUB_MODE_AUTO_TAKEOFF){
 
  939                outMode = PX4_FLIGHTMODE_TAKEOFF;
 
  941 else if (indata.sub_mode == PX4_CUSTOM_SUB_MODE_AUTO_LAND){
 
  942                outMode = PX4_FLIGHTMODE_LAND;
 
  944 else if (indata.sub_mode == PX4_CUSTOM_SUB_MODE_AUTO_RTL){
 
  945                outMode = PX4_FLIGHTMODE_RTL;
 
  947 else if (indata.sub_mode == PX4_CUSTOM_SUB_MODE_AUTO_READY){
 
  948                outMode = PX4_FLIGHTMODE_AUTO_READY;
 
  950 else if (indata.sub_mode == PX4_CUSTOM_SUB_MODE_AUTO_LOITER){
 
  951                outMode = PX4_FLIGHTMODE_AUTO_LOITER;
 
  956    std::string getFlightModeName_px4(PX4_FLIGHTMODE fm){
 
  965            qstr=
"Altitude Mode";
 
  968            qstr=
"Position Mode";
 
  983            qstr=
"Stablized Mode";
 
  986            qstr=
"Offboard Mode";
 
  989            qstr=
"Auto Ready Mode";
 
  992            qstr=
"Auto Loiter Mode";
 
 1002 bool isBitTrue(uint32_t value, 
int bitIndex) {  
 
 1003 return (value & (1U << bitIndex)) != 0;
 
 1007 void SendMavlinkFull(
double **u, 
double t){
 
 1009 if(offCtrlState==0){
 
 1010            SendVelNED(0,0,0,0);
 
 1014 if(offCtrlState==1){
 
 1015            SendVelNED(0,0,0,0);
 
 1016 if(t-offLastTime>1.1){
 
 1017                sendMavEnableGuided(
true);
 
 1022 if(offCtrlState==2){
 
 1023 if(t-offLastTime>1.1){
 
 1028 if(offCtrlState==3){
 
 1032            hil.time_boot_ms = (uint32_t)*u[0];
 
 1033            hil.copterID=(uint32_t)*u[1];
 
 1034            hil.modes=(uint32_t)*u[2];
 
 1035            hil.flags=(uint32_t)*u[3];
 
 1036 for(
int j=0;j<11;j++){
 
 1037                hil.ctrls[j]=(float)*u[4+j];
 
 1039            uint16_t type_mask =  hil.modes & 0xFFF;
 
 1040            uint8_t coordinate_frame = hil.flags & 0xFF;
 
 1041            sendMavOffboardCmd(type_mask,coordinate_frame,hil.ctrls[0],hil.ctrls[1],hil.ctrls[2],hil.ctrls[3],hil.ctrls[4],hil.ctrls[5],hil.ctrls[6],hil.ctrls[7],hil.ctrls[8],hil.ctrls[9],hil.ctrls[10]);
 
 1049 void SendMavlinkSimple(
double **u, 
double t){
 
 1051 if(offCtrlState==0){
 
 1052            SendVelNED(0,0,0,0);
 
 1056 if(offCtrlState==1){
 
 1057            SendVelNED(0,0,0,0);
 
 1058 if(t-offLastTime>1.1){
 
 1059                sendMavEnableGuided(
true);
 
 1064 if(offCtrlState==2){
 
 1065 if(t-offLastTime>1.1){
 
 1070 if(offCtrlState==3){
 
 1071 int ctrlMode=(int)*u[0];
 
 1079 for(
int j=0; j<4; j++){ 
 
 1080                ctrls[j] = (float)*u[1+j];
 
 1083            SendOffSimp(ctrlMode,ctrls);
 
 1093 void sendHILCtrlMessage(
double **u, 
double t)
 
 1096        uint64_t flags=(uint64_t)*u[1];
 
 1097 double idx=(double)*u[2];
 
 1106        mavlink_hil_actuator_controls_t hilctrl;
 
 1107        hilctrl.mode = modes;
 
 1108        hilctrl.flags = flags;
 
 1109 for(
int i=0;i<16;i++){
 
 1110            hilctrl.controls[i]=(float)*u[i+8];
 
 1112        mavlink_message_t mess;
 
 1113        mavlink_msg_hil_actuator_controls_encode(mavState.sysID, mavState.compID, &mess, &hilctrl);
 
 1119 void SendMavlinkReal(
double **u, 
double t){
 
 1122        ird.cmdBitmap = (uint32_t)*u[1];
 
 1123        ird.typeMask = (uint16_t)*u[2];
 
 1126 for(
int j=0; j<20; j++){ 
 
 1127            ird.controls[j] = (float)*u[8+j];
 
 1131 if (isBitTrue(ird.cmdBitmap, 0)){
 
 1133 if (isBitTrue(ird.cmdBitmap, 2))
 
 1135 else if (isBitTrue(ird.cmdBitmap, 7))
 
 1139 if (isBitTrue(ird.cmdBitmap, 3)){
 
 1140                SendSetMode(PX4_CUSTOM_MAIN_MODE_OFFBOARD);
 
 1143 if (isBitTrue(ird.cmdBitmap, 28)){
 
 1144                SendSetMode(PX4_CUSTOM_MAIN_MODE_MANUAL);
 
 1147 if (isBitTrue(ird.cmdBitmap, 29)){
 
 1148                SendSetMode(PX4_CUSTOM_MAIN_MODE_ALTCTL);
 
 1151 if (isBitTrue(ird.cmdBitmap, 30)){
 
 1152                SendSetMode(PX4_CUSTOM_MAIN_MODE_POSCTL);
 
 1155 if (isBitTrue(ird.cmdBitmap, 31)) {
 
 1156                SendSetMode(MAV_MODE_FLAG_AUTO_ENABLED, PX4_CUSTOM_SUB_MODE_AUTO_LOITER);
 
 1161 if (isBitTrue(ird.cmdBitmap, 16)) {
 
 1162            uint8_t coordinate = MAV_FRAME_LOCAL_NED;
 
 1163 if (isBitTrue(ird.cmdBitmap, 18))
 
 1164                coordinate = MAV_FRAME_GLOBAL_INT;
 
 1165 else if (isBitTrue(ird.cmdBitmap, 19))
 
 1166                coordinate = MAV_FRAME_BODY_NED;
 
 1167            SendPositionTarget(ird.typeMask, coordinate, ird.controls);
 
 1169 else if (isBitTrue(ird.cmdBitmap, 17)){
 
 1170            SendAttitudeTarget(ird.typeMask, ird.controls);
 
 1172 else if (isBitTrue(ird.cmdBitmap, 23)){
 
 1174                SendParamInt(
"NAV_RCL_ACT", 0);
 
 1175                SendParamInt(
"NAV_DLL_ACT", 0);
 
 1177                SendSetMode(PX4_CUSTOM_MAIN_MODE_MANUAL);
 
 1179            SendRccTarget(ird.controls);
 
 1184 void mavlinkSetCmd(uint16_t command,
float param1=0,
float param2=0,
float param3=0){
 
 1185        SendMavCmdLong(command,param1,param2,param3);
 
 1188 void sendMavSetParam(
char param_id[], 
float param_value, MAV_PARAM_TYPE param_type)
 
 1191        mavlink_param_set_t ps;
 
 1192        ps.target_system = mavState.TargetSysID;
 
 1193        ps.target_component = mavState.TargetCompID;
 
 1194        ps.param_value = param_value;
 
 1195        ps.param_type = param_type;
 
 1196 for(
int i=0;i<16;i++){
 
 1197            ps.param_id[i] = param_id[i];
 
 1199        mavlink_message_t mess;
 
 1200        mavlink_msg_param_set_encode(mavState.sysID, mavState.compID, &mess, &ps);
 
 1205 void sendMavEnableGuided(
bool isEnable)
 
 1208            setMavModel(PX4_CUSTOM_MAIN_MODE_OFFBOARD);
 
 1209 char cmd[17] = 
"NAV_RCL_ACT";
 
 1210            sendMavSetParam(cmd,0,MAV_PARAM_TYPE_INT32);
 
 1211 char cmd1[17] = 
"NAV_DLL_ACT";
 
 1212            sendMavSetParam(cmd1,0,MAV_PARAM_TYPE_INT32);
 
 1213 char cmd2[17] = 
"COM_RCL_EXCEPT";
 
 1214            sendMavSetParam(cmd2,4/7.1362e+44,MAV_PARAM_TYPE_INT32);
 
 1217            setMavModel(PX4_CUSTOM_MAIN_MODE_MANUAL);
 
 1220 void setMavModel(PX4_CUSTOM_MAIN_MODE mianMode){
 
 1221        uint8_t basemode=
static_cast<uint8_t
>(MAV_MODE_FLAG::MAV_MODE_FLAG_CUSTOM_MODE_ENABLED);
 
 1223        mavlinkSetCmd(MAV_CMD_DO_SET_MODE,basemode,mianMode);
 
 1226 void setMavModel(PX4_CUSTOM_MAIN_MODE mianMode,PX4_CUSTOM_SUB_MODE_AUTO custMode){
 
 1227        uint8_t basemode=
static_cast<uint8_t
>(MAV_MODE_FLAG::MAV_MODE_FLAG_CUSTOM_MODE_ENABLED);
 
 1228        mavlinkSetCmd(MAV_CMD_DO_SET_MODE,basemode,mianMode,custMode);
 
 1231 void sendMavOffboardCmd(uint16_t type_mask, uint8_t coordinate_frame, 
float x, 
float y, 
float z, 
float vx, 
float vy, 
float vz, 
float afx, 
float afy, 
float afz, 
float yaw, 
float yaw_rate)
 
 1233        mavlink_set_position_target_local_ned_t m_target_ned;
 
 1235        m_target_ned.target_system = mavState.TargetSysID;
 
 1236        m_target_ned.target_component = mavState.TargetCompID;
 
 1237        m_target_ned.coordinate_frame = coordinate_frame;
 
 1238        m_target_ned.type_mask = type_mask;
 
 1242        m_target_ned.vx = vx;
 
 1243        m_target_ned.vy = vy;
 
 1244        m_target_ned.vz = vz;
 
 1245        m_target_ned.afx = afx;
 
 1246        m_target_ned.afy = afy;
 
 1247        m_target_ned.afz = afz;
 
 1248        m_target_ned.yaw = yaw;
 
 1249        m_target_ned.yaw_rate = yaw_rate;
 
 1251        mavlink_message_t mess;
 
 1252        mavlink_msg_set_position_target_local_ned_encode(mavState.sysID, mavState.compID, &mess, &m_target_ned);
 
 1257 void SendOffSimp(
int ctrlMode,
float controls[4]={0}){
 
 1258 float ctrls[11] = {0};
 
 1259        uint8_t coordinate_frame = 0;
 
 1260        uint16_t type_mask = 0;
 
 1264            coordinate_frame = MAV_FRAME_LOCAL_NED;
 
 1265            type_mask = 7 | 7 << 6 | 1 << 10;
 
 1266            ctrls[3] = controls[0];
 
 1267            ctrls[4] = controls[1];
 
 1268            ctrls[5] = controls[2];
 
 1269            ctrls[10] = controls[3];
 
 1272            coordinate_frame = MAV_FRAME_BODY_NED;
 
 1273            type_mask = 7 | 7 << 6 | 1 << 10;
 
 1274            ctrls[3] = controls[0];
 
 1275            ctrls[4] = controls[1];
 
 1276            ctrls[5] = controls[2];
 
 1277            ctrls[10] = controls[3];
 
 1281            coordinate_frame = MAV_FRAME_LOCAL_NED;
 
 1282            type_mask = 7 << 3 | 7 << 6 | 1 << 11;
 
 1283            ctrls[0] = controls[0];
 
 1284            ctrls[1] = controls[1];
 
 1285            ctrls[2] = controls[2];
 
 1286            ctrls[9] = controls[3];
 
 1289            coordinate_frame = MAV_FRAME_BODY_NED;
 
 1290            type_mask = 7 << 3 | 7 << 6 | 1 << 11;
 
 1291            ctrls[0] = controls[0];
 
 1292            ctrls[1] = controls[1];
 
 1293            ctrls[2] = controls[2];
 
 1294            ctrls[9] = controls[3];
 
 1298            coordinate_frame = MAV_FRAME_LOCAL_NED;
 
 1299            type_mask = 7 | 7 << 3 | 1 << 10 | 1 << 11;
 
 1300            ctrls[6] = controls[0];
 
 1301            ctrls[7] = controls[1];
 
 1302            ctrls[8] = controls[2];
 
 1306            coordinate_frame = MAV_FRAME_LOCAL_NED;
 
 1307            type_mask = 7 | 7 << 3 | 1 << 11;
 
 1308            ctrls[6] = controls[0];
 
 1309            ctrls[7] = controls[1];
 
 1310            ctrls[8] = controls[2];
 
 1311            ctrls[9] = controls[3];
 
 1315            coordinate_frame = MAV_FRAME_LOCAL_NED;
 
 1316            type_mask = 7 | 7 << 3 | 1 << 10;
 
 1317            ctrls[6] = controls[0];
 
 1318            ctrls[7] = controls[1];
 
 1319            ctrls[8] = controls[2];
 
 1320            ctrls[10] = controls[3];
 
 1325            coordinate_frame = 1;
 
 1327 float vel = controls[0];
 
 1328 float alt = controls[1];
 
 1329 float yaw = controls[2];
 
 1341        sendMavOffboardCmd(type_mask,coordinate_frame,ctrls[0],ctrls[1],ctrls[2],ctrls[3],ctrls[4],ctrls[5],ctrls[6],ctrls[7],ctrls[8],ctrls[9],ctrls[10]);
 
 1345 void SendVelNED(
float vx=0,
float vy=0,
float vz=0,
float yawrate=0){
 
 1346 float ctrls[4]={vx,vy,vz,yawrate};
 
 1347        SendOffSimp(0,ctrls);
 
 1351 bool SelfCheckProgram(
double t){
 
 1360 if((SelfCheckMainState==0) && t>2){ 
 
 1361 if(mavState.isHeartRec){
 
 1362                std::cout<<
"Drone #"<<CopterID<<
": Checking mavlink connection successfully."<<std::endl;
 
 1363                mavState.selfCheckState=1;
 
 1364                SelfCheckMainState=1; 
 
 1368 if(SelfCheckMainState==1){
 
 1369 if(mavState.isLocalNed){
 
 1370                std::cout<<
"Drone #"<<CopterID<<
": Checking local pos successfully."<<std::endl;
 
 1371                mavState.selfCheckState=2;
 
 1372                SelfCheckMainState=2; 
 
 1376 if(SelfCheckMainState==2){
 
 1378            SendVelNED(0,0,0,0);
 
 1380 if(SelfCheckSubState==0){
 
 1382                SelfCheckSubState=1;
 
 1384 if(SelfCheckSubState==1){
 
 1385                sendMavEnableGuided(
true);
 
 1386                SelfCheckSubState=2;
 
 1389 if(SelfCheckSubState==2){
 
 1391 if(mavState.isOffboard){
 
 1392                        std::cout<<
"Drone #"<<CopterID<<
": Checking offboard successfully."<<std::endl;
 
 1393                        mavState.selfCheckState=3;
 
 1394                        SelfCheckMainState=3; 
 
 1395                        SelfCheckSubState=0;
 
 1398                        SelfCheckSubState=1;
 
 1404 if(SelfCheckMainState==3){
 
 1406            SendVelNED(0,0,0,0);
 
 1408 if(SelfCheckSubState==0){
 
 1412                SelfCheckSubState=1;
 
 1415 if(SelfCheckSubState==1){
 
 1417 if(mavState.isArmed){
 
 1418                        std::cout<<
"Drone #"<<CopterID<<
": Checking arm successfully."<<std::endl;
 
 1419                        mavState.selfCheckState=4;
 
 1420                        SelfCheckMainState=4; 
 
 1422                    SelfCheckSubState = 0;
 
 1427 if(SelfCheckMainState==4){
 
 1428            SendVelNED(0,0,0,0);
 
 1430 if(SelfCheckSubState==0){
 
 1432                SelfCheckSubState=1;
 
 1433                sendMavEnableGuided(
false);
 
 1437 if(SelfCheckSubState==1){
 
 1439 if(!mavState.isArmed && !mavState.isOffboard){
 
 1440                        std::cout<<
"Drone #"<<CopterID<<
": Checking passed."<<std::endl;
 
 1441                        mavState.selfCheckState=5;
 
 1442                        SelfCheckMainState=5; 
 
 1444                    SelfCheckSubState=0;
 
 1449 if(SelfCheckMainState==5){