如何通过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
相关产品推荐
相关产品推荐

