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;
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){