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_deglongitude_degabsolute_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°)。