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

如何正确设置mavlink_msg_message_interval_encode参数以调整ArduPilot消息间隔?

解决ArduPilot中MAVLink设置SCALED_IMU消息间隔的问题

你当前的问题根源

  1. 消息ID写错了:你要调整的是SCALED_IMU(消息ID#26),但代码里把interval.message_id设成了36——这直接导致飞控根本不会处理你要调整的目标消息。
  2. 对System/Component ID的理解有误:mavlink_msg_message_interval_encode的前两个参数是**你这边(发送方)**的SysID和CompID,而且你得确保消息能被Pixhawk(接收方)正确识别并接收,不是随便填个值就行。

正确的参数取值与代码修正

参数说明

  • 发送方(你的上位机):
    • SysID:可以用255(广播地址),或者设成一个非1的特定值(比如2,避免和Pixhawk默认ID冲突)
    • CompID:固定设为0,这是MAVLink规范里地面站组件的ID
  • 接收方(Pixhawk):
    • 默认SysID是1,CompID是1(飞控核心组件)。发送消息时必须指定目标为这个组合,不然飞控会直接忽略你的请求。
  • 消息ID:必须改成26,对应SCALED_IMU消息

修正后的代码

mavlink_message_t message;
mavlink_message_interval_t interval;

// 目标消息:SCALED_IMU(ID#26)
interval.message_id = 26;
// 设置发送间隔为10ms(10000微秒)
interval.interval_us = 10000;
// 发送方:SysID=255(广播),CompID=0(地面站)
mavlink_msg_message_interval_encode(255, 0, &message, &interval);

// 关键步骤:指定消息的接收目标是Pixhawk的SysID=1、CompID=1
uint8_t buffer[MAVLINK_MAX_PACKET_LEN];
uint16_t len = mavlink_msg_to_send_buffer(buffer, &message);
mavlink_channel_t chan = MAVLINK_COMM_0; // 对应你的串口通道
mavlink_set_target_system(chan, 1);
mavlink_set_target_component(chan, 1);
// 这里替换成你实际的串口发送逻辑
serial_write(buffer, len);

额外要注意的点

  • 权限问题:ArduPilot默认只接受地面站发来的消息间隔调整请求,所以你的上位机要先发送HEARTBEAT消息,把type设为MAV_TYPE_GCS,让飞控识别你是合法的地面站。
  • 验证设置:发送完MESSAGE_INTERVAL后,可以用MAV_CMD_REQUEST_MESSAGE指令请求飞控返回当前的MESSAGE_INTERVAL配置,确认是否设置成功。
  • 尽量不用广播:如果链路里有多个设备,别用255广播,换成特定的发送方SysID(比如2),避免干扰其他设备。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 08:23:13