had this very problem, had to build px4 to browse the source code to figure it all out. Here are my notes so far.
To get the current flight mode, listen to heartbeat. PX4’s mode is encoded in custom_mode field of heartbeat message as:
0x####0000
^^ main mode
^^ sub mode
to set the mode, you can either use a deprecated SET_MODE mavlink message, or COMMAND_LONG
in SET_MODE:
base_mode = ? (use 1?)
custom_mode = same as heartbeat.custom_mode
in COMMAND_LONG:
MAV_CMD_DO_SET_MODE:
param1 = ? (using 1.0 works)
param2 = main mode
param3 = sub mode
The mode numbers are:
src/modules/commander/px4_custom_mode.h:
enum PX4_CUSTOM_MAIN_MODE {
PX4_CUSTOM_MAIN_MODE_MANUAL = 1,
PX4_CUSTOM_MAIN_MODE_ALTCTL, // = 2
PX4_CUSTOM_MAIN_MODE_POSCTL, // = 3
PX4_CUSTOM_MAIN_MODE_AUTO, // = 4
PX4_CUSTOM_MAIN_MODE_ACRO, // = 5
PX4_CUSTOM_MAIN_MODE_OFFBOARD, // = 6
PX4_CUSTOM_MAIN_MODE_STABILIZED, // = 7
PX4_CUSTOM_MAIN_MODE_RATTITUDE_LEGACY, // = 8
PX4_CUSTOM_MAIN_MODE_SIMPLE, /* unused, but reserved for future use */
PX4_CUSTOM_MAIN_MODE_TERMINATION // = 10
};
enum PX4_CUSTOM_SUB_MODE_AUTO {
PX4_CUSTOM_SUB_MODE_AUTO_READY = 1,
PX4_CUSTOM_SUB_MODE_AUTO_TAKEOFF, // = 2
PX4_CUSTOM_SUB_MODE_AUTO_LOITER, // = 3 //hold mode?
PX4_CUSTOM_SUB_MODE_AUTO_MISSION, // = 4
PX4_CUSTOM_SUB_MODE_AUTO_RTL, // = 5
PX4_CUSTOM_SUB_MODE_AUTO_LAND, // = 6
PX4_CUSTOM_SUB_MODE_AUTO_RESERVED_DO_NOT_USE, // was PX4_CUSTOM_SUB_MODE_AUTO_RTGS, deleted 2020-03-05
PX4_CUSTOM_SUB_MODE_AUTO_FOLLOW_TARGET, // = 8
PX4_CUSTOM_SUB_MODE_AUTO_PRECLAND, // = 9
PX4_CUSTOM_SUB_MODE_AUTO_VTOL_TAKEOFF, // = 10
PX4_CUSTOM_SUB_MODE_EXTERNAL1, // = 11
PX4_CUSTOM_SUB_MODE_EXTERNAL2,
PX4_CUSTOM_SUB_MODE_EXTERNAL3,
PX4_CUSTOM_SUB_MODE_EXTERNAL4,
PX4_CUSTOM_SUB_MODE_EXTERNAL5,
PX4_CUSTOM_SUB_MODE_EXTERNAL6,
PX4_CUSTOM_SUB_MODE_EXTERNAL7,
PX4_CUSTOM_SUB_MODE_EXTERNAL8,
};
enum PX4_CUSTOM_SUB_MODE_POSCTL {
PX4_CUSTOM_SUB_MODE_POSCTL_POSCTL = 0,
PX4_CUSTOM_SUB_MODE_POSCTL_ORBIT, // = 1
PX4_CUSTOM_SUB_MODE_POSCTL_SLOW // = 2
};
see also Commander::custom_command function in /src/modules/commander/Commander.cpp