You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MAVLink向无人机请求获取枚举MAV_LANDED_STATE的数值?

解决方法

核心误区澄清

MAV_LANDED_STATE 是状态枚举值,本身不是可发送的MAVLink消息,它是EXTENDED_SYS_STATUS消息中的landed_state字段的取值范围,你需要先请求无人机推送EXTENDED_SYS_STATUS消息,再从返回的消息中读取该字段匹配枚举值。

正确实现步骤

1. 向无人机请求推送EXTENDED_SYS_STATUS消息

推荐使用MAV_CMD_SET_MESSAGE_INTERVAL指令设置该消息的推送频率,示例代码如下:

const mavlinkPort = new SerialPort("/dev/ttyACM0");
const message = new common.CommandLong();
message.targetSystem = 1;
message.targetComponent = 0;
// 指令编号:设置消息推送间隔
message.command = MAV_CMD_SET_MESSAGE_INTERVAL;
// 第一个参数:要请求的消息ID,EXTENDED_SYS_STATUS的ID是245
message.param1 = 245;
// 第二个参数:推送间隔,单位微秒,这里设为1000ms即1秒推送一次
message.param2 = 1000000;
// 其余参数填0即可
message.param3 = 0;
message.param4 = 0;
message.param5 = 0;
message.param6 = 0;
message.param7 = 0;
await send(mavlinkPort, message);

如果你习惯用RequestDataStream的方式,也可以将reqStreamId设置为对应包含EXTENDED_SYS_STATUS的通用飞控状态流,上述指令方式的跨固件兼容性更好。

2. 监听返回的EXTENDED_SYS_STATUS消息,读取着陆状态

在你的消息监听回调中匹配消息类型,提取状态即可:

mavlinkPort.on('message', (msg) => {
  // 匹配EXTENDED_SYS_STATUS消息
  if (msg.name === 'EXTENDED_SYS_STATUS') {
    const landedState = msg.landed_state;
    // 匹配枚举判断状态
    switch(landedState) {
      case common.MAV_LANDED_STATE.LANDED:
        console.log('无人机已着陆');
        break;
      case common.MAV_LANDED_STATE.TAKEOFF:
        console.log('无人机处于起飞阶段');
        break;
      case common.MAV_LANDED_STATE.FLYING:
        console.log('无人机处于飞行中');
        break;
      case common.MAV_LANDED_STATE.LANDING:
        console.log('无人机处于降落阶段');
        break;
    }
  }
})

内容的提问来源于stack exchange,提问作者codes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 06:57:00