降落命令

方法1:发送以下降落命令

MAV_CMD_NAV_LAND 21

返回消息:COMMAND_ACK
返回值 command 21 执行命令id
返回值 result 0或4 0:执行成功,4:执行失败


方法2:使用切换飞行模式将飞行模式切换至LAND

详见切换飞行模式页

取消降落命令

方法1:使用切换飞行模式将飞行模式切换至POSCTL
详见切换飞行模式页


方法2:发送以下COMMAND_LONG命令

MAV_CMD_DO_REPOSITION 192

command = MAV_CMD_DO_REPOSITION
param4,param5,param6 = NaN
param7 = 0

返回消息:COMMAND_ACK
返回值 command 192 执行命令id
返回值 result 0或4 0:执行成功,4:执行失败

python测试脚本

发送降落命令(方法1)

import time
from pymavlink import mavutil

timestamp = int(time.time() * 1000)
millis = int(time.time() * 1000)

master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
master.wait_heartbeat()
boot_time = time.time()

def land():
    master.mav.command_long_send(
        master.target_system,
        master.target_component,
        mavutil.mavlink.MAV_CMD_NAV_LAND,
        0,
        0, 0, 0, 0, 0, 0, 0
    )

land()

发送取消降落命令(方法2)

import time
from pymavlink import mavutil
import math


def get_current_millis():
    """获取当前时间(毫秒级)"""
    return int(time.time() * 1000)


# MAVLink 命令常量
MAV_CMD_DO_REPOSITION = 192
DEFAULT_TIMEOUT = 5.0


def send_reposition_command(master, ground_speed, yaw, flags=0):
    """发送重新定位命令到无人机

    Args:
        master: MAVLink 连接对象
        ground_speed: 地速 (单位: m/s)
        yaw: 偏航角 (单位: 度, 0-360)
        flags: 标志位 (保留, 默认为0)
    """
    nan_value = math.nan
    send_time = get_current_millis()
    print(f"[{send_time}] 发送重新定位命令")
    print(f"  地速 = {ground_speed} m/s, 偏航角 = {yaw}°")

    master.mav.command_long_send(
        master.target_system,
        master.target_component,
        mavutil.mavlink.MAV_CMD_DO_REPOSITION,
        0,  # 确认标志
        ground_speed,   # param1: 地速 (单位: m/s)
        yaw,            # param2: 偏航角 (单位: 度)
        0,              # param3: 保留
        nan_value,      # param4: NaN
        nan_value,      # param5: NaN
        nan_value,      # param6: NaN
        0               # param7: 0
    )

    return send_time


def wait_for_ack(master, send_time, timeout=DEFAULT_TIMEOUT):
    """等待命令确认响应"""
    print("等待重新定位命令响应...")

    ack = master.recv_match(
        type='COMMAND_ACK',
        blocking=True,
        timeout=timeout
    )

    if ack:
        ack_time = get_current_millis()
        delay = ack_time - send_time
        print(f"[{ack_time}] 收到命令应答 (MAV_CMD_DO_REPOSITION)")
        print(f" 命令ID: {ack.command}, 结果: {ack.result}, 延迟: {delay}ms")
    else:
        print(f"[{get_current_millis()}] 超时:未收到重新定位命令应答")


def main():
    """主函数:连接无人机并发送重新定位命令"""
    # 连接无人机(UDP端口14550)
    master = mavutil.mavlink_connection('udpin:0.0.0.0:14550')
    print("等待无人机心跳...")
    master.wait_heartbeat()
    print("无人机已连接,开始发送重新定位命令")

    # 发送重新定位命令(示例参数,请根据实际情况修改)
    ground_speed = 5.0   # 地速 5 m/s
    yaw = 90.0           # 偏航角 90° (东向)
    send_time = send_reposition_command(master, ground_speed, yaw)

    # 等待响应
    wait_for_ack(master, send_time)

    print("重新定位命令发送完成")


if __name__ == "__main__":
    main()

执行降落脚本

结果

作者:孙渝泓  创建时间:2024-09-14 16:05
最后编辑:sfd  更新时间:2026-03-31 18:47