mavlink id 147 BATTERY_STATUS
电池信息。更新 GCS 并结合飞行控制器的电池状态。
MAV_BATTERY_FUNCTION
电池所负载的功能模块类型枚举。
结果(使用QGC查看)

向飞机申请高功率供电(同步阻塞方式)
MAV_DJI_CMD_APPLY_HIGH_POWER_SYNC
发送
COMMAND_LONG
接收
| 类型 | 枚举值 | 说明 |
|---|---|---|
| bool | MAV_RESULT_ACCEPTED | 成功 |
| bool | MAV_RESULT_ACCEPTED | 失败 |
示例
import time
from pymavlink import mavutil
from enum import IntEnum
# MAV_CMD 执行结果映射
MAV_RESULT_NAMES = {
mavutil.mavlink.MAV_RESULT_ACCEPTED: "ACCEPTED",
mavutil.mavlink.MAV_RESULT_TEMPORARILY_REJECTED: "TEMPORARILY_REJECTED",
mavutil.mavlink.MAV_RESULT_DENIED: "DENIED",
mavutil.mavlink.MAV_RESULT_UNSUPPORTED: "UNSUPPORTED",
mavutil.mavlink.MAV_RESULT_FAILED: "FAILED",
mavutil.mavlink.MAV_RESULT_IN_PROGRESS: "IN_PROGRESS",
}
def recv_command_ack(timeout=5):
"""接收并显示 command_ack 消息
Args:
timeout: 超时时间(秒)
Returns:
ack 消息对象,None 表示超时
"""
print(f"等待 command_ack 响应 (超时 {timeout}s)...")
ack = master.recv_match(type='COMMAND_ACK', blocking=True, timeout=timeout)
if ack is None:
print("错误: 命令响应超时")
return None
# 获取命令名称
cmd_name = getattr(ack, 'command_name', None)
if not cmd_name:
# 尝试通过枚举查找命令名称
try:
cmd_name = mavutil.mavlink.enums.get('MAV_CMD', {}).get(ack.command, {}).name
except:
cmd_name = str(ack.command)
# 获取结果名称
result_name = MAV_RESULT_NAMES.get(ack.result, f"UNKNOWN({ack.result})")
print("=" * 50)
print(f"命令: {cmd_name} ({ack.command})")
print(f"结果: {result_name}")
print(f"进度: {ack.progress * 100:.0f}%" if ack.progress > 0 else "")
# print(f"参数2: {ack.result_param2}")
print(f"系统ID: {ack.target_system}")
print(f"组件ID: {ack.target_component}")
print("=" * 50)
return ack
class MavDjiCmd(IntEnum):
MAV_CMD_NAV_LAND = 21
MAV_DJI_CMD_TRIGGER_FFC=40 # M4TD不支持
MAV_DJI_CMD_START_RECORD_POINT_CLOUD=41 # M4TD不支持
MAV_DJI_CMD_STOP_RECORD_POINT_CLOUD=42 # M4TD不支持
MAV_DJI_CMD_RESTORE_FACTORY_SETTINGS=43 # 正常调用
MAV_DJI_CMD_APPLY_HIGH_POWER_SYNC=44 # 正常调用
MAV_DJI_CMD_APPLY_HIGH_POWER_SYNCV2=45 # 正常调用
MAV_DJI_CMD_START_CONFIRM_LANDING=46 # 不等待确认
MAV_DJI_CMD_START_FORCE_LANDING=47 # 正常
MAV_DJI_CMD_EXECUTE_EMERGENCY_BRAKE_ACTION=48 # 正常
MAV_DJI_CMD_CANCEL_EMERGENCY_BRAKE_ACTION=49 # 正常
MAV_DJI_CMD_START_SLOW_ROTATE_MOTOR=50 # 正常调用
MAV_DJI_CMD_STOP_SLOW_ROTATE_MOTOR=51 # 正常调用
MAV_DJI_CMD_ARREST_FLYING=52 # 正常
MAV_DJI_CMD_CANCEL_ARREST_FLYING=53 # 正常
MAV_DJI_CMD_OUTPUT_HIGH_POWER=54 # 正常调用
TUNNEL_PROTOCOL_ID_INJECT_HMS_ERROR=32770
timestamp = int(time.time() * 1000)
millis = int(time.time() * 1000)
master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
print("waiting for heartbeat")
master.wait_heartbeat()
print("heartbeat received")
boot_time = time.time()
def send_command(command, param1=0, param2=0, param3=0, param4=0, param5=0, param6=0, param7=0, wait_ack=True, timeout=5):
"""发送 command_long 并可选接收 command_ack
Args:
command: 命令ID (如 MavDjiCmd.TRIGGER_FFC)
param1~param7: 命令参数
wait_ack: 是否等待并显示 ACK
timeout: ACK 超时时间(秒)
Returns:
ack 消息对象,None 表示超时或未等待
"""
print(f"发送命令: {command} ({int(command)})")
master.mav.command_long_send(
master.target_system,
master.target_component,
int(command),
0, # confirmation
param1, param2, param3, param4, param5, param6, param7
)
if wait_ack:
return recv_command_ack(timeout=timeout)
return None
def ready():
send_command(MavDjiCmd.MAV_DJI_CMD_OUTPUT_HIGH_POWER)
ready()作者:孙渝泓 创建时间:2026-06-15 16:14
最后编辑:孙渝泓 更新时间:2026-06-18 18:17
最后编辑:孙渝泓 更新时间:2026-06-18 18:17