mavlink id 147 BATTERY_STATUS

电池信息。更新 GCS 并结合飞行控制器的电池状态。

返回字段名称
类型
单位
描述
id
uint8_t

电池编号
battery_function
uint8_t
MAV_BATTERY_FUNCTION
电池所负载的功能模块
temperature
int16_t

当前电池温度。INT16_MAX:温度未知。
voltages
uint16_t[10]
mV
电池 1 至 10 的电池电压。如果单个电池的电压未知或未测量到,则整体电池电压填充在 0 号电池,其他电压设为 UINT16_MAX。
current_battery
int16_t
A
当前电量多少安。-1:自动驾驶仪无法测量电量。
current_consumed
int32_t
mAh
消耗电量。-1:自动驾驶无法提供耗电估计。
battery_remaining
int8_t
%
剩余电池电量百分比。数值:[0-100],-1:自动驾驶仪不会估算剩余电池。

MAV_BATTERY_FUNCTION

电池所负载的功能模块类型枚举。

Value

Field Name

Description

0

MAV_BATTERY_FUNCTION_UNKNOWN

电池负载功能未知

1

MAV_BATTERY_FUNCTION_ALL

电池支持全部飞行系统

2

MAV_BATTERY_FUNCTION_PROPULSION

推进系统电池

3

MAV_BATTERY_FUNCTION_AVIONICS

航空电子设备电池

4

MAV_BATTERY_FUNCTION_PAYLOAD

载荷设备电池

结果(使用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