MAVSDK 无人机 NED 坐标系与 Offboard 控制要点

Summary

MAVSDK Python 中无人机 NED(北-东-下)坐标系统的正确用法,包括数据源选择、坐标转换、以及 offboard 模式到达判定的关键注意事项。

NED 坐标系基础

定义

  • North: 向北为正(相对 Home 点)
  • East: 向东为正(相对 Home 点)
  • Down: 向下为正(正=低于 Home 点,负=高于 Home 点)
  • Yaw: 0°=正北,90°=正东,180°=正南,270°=正西(-90°=正西)

重要概念

Down 轴方向容易混淆:

  • down > 0:在 Home 点下方(下降方向)
  • down < 0:在 Home 点上方(上升方向)
  • offboard_position_tool 中 delta_down > 0 表示下降,delta_down < 0 表示上升

正确数据源选择

telemetry.position_velocity_ned()

返回 NED 坐标:

  • position.north_m:北偏移
  • position.east_m:东偏移
  • position.down_m:下偏移

注意:此流不包含 altitude 信息。

telemetry.position()

返回 GPS 坐标:

  • latitude_deg
  • longitude_deg
  • absolute_altitude_m(MSL 海拔高度)
  • relative_altitude_m(相对地面高度)

注意:此对象不包含 NED 坐标,不能用于 north/east/down 读取。

telemetry.attitude_euler()

返回姿态角:

  • yaw_deg:朝向角
  • pitch_deg:俯仰角
  • roll_deg:横滚角

Offboard 模式要点

启动前必须注册 setpoint

# 启动前先发送当前坐标作为注册信号
await drone_inst.offboard.set_position_ned(
    PositionNedYaw(current_north, current_east, current_down, current_yaw)
)
await drone_inst.offboard.start()

否则飞控拒绝进入 offboard 模式,报错 NO_SETPOINT_SET。

到达判定(位置 + Yaw)

pos_dist = ((cn - target_north)**2 + (ce - target_east)**2 + (cd - target_down)**2)**0.5
yaw_diff = abs((cy - target_yaw + 180) % 360 - 180)  # 归一化到 [-180, 180]
if pos_dist <= 0.2 and yaw_diff <= 2.0:
    arrived = True
  • 位置容差:±0.2m
  • Yaw 容差:±2°
  • Yaw 角度差必须归一化处理(-180° 到 180° 范围),否则跨越 0°/360° 边界时计算错误

停止 Offboard

停止前先发送位置保持信号,否则飞控切换到 HOLD 模式时可能漂移:

for _ in range(5):
    await drone_inst.offboard.set_position_ned(
        PositionNedYaw(current_north, current_east, current_down, 0)
    )
    await asyncio.sleep(0.1)
await drone_inst.offboard.stop()

常见错误

错误 1:用 telemetry.position() 获取 NED 坐标

telemetry.position() 返回的 Position 对象没有 north_m/east_m/down_m 属性,只有 GPS 坐标。

错误 2:down 轴方向混淆

NED 的 down 为正表示下降,与”高度越高数值越大”的直觉相反。

错误 3:Yaw 归一化缺失

直接计算 cy - target_yaw 可能得到 350° 的差值(实际只差 10°)。



● main|UTF-8|Markdown金乌意 v1.0