如何正确设置mavlink_msg_message_interval_encode参数以调整ArduPilot消息间隔?
解决ArduPilot中MAVLink设置SCALED_IMU消息间隔的问题
你当前的问题根源
- 消息ID写错了:你要调整的是SCALED_IMU(消息ID#26),但代码里把
interval.message_id设成了36——这直接导致飞控根本不会处理你要调整的目标消息。 - 对System/Component ID的理解有误:
mavlink_msg_message_interval_encode的前两个参数是**你这边(发送方)**的SysID和CompID,而且你得确保消息能被Pixhawk(接收方)正确识别并接收,不是随便填个值就行。
正确的参数取值与代码修正
参数说明
- 发送方(你的上位机):
- SysID:可以用
255(广播地址),或者设成一个非1的特定值(比如2,避免和Pixhawk默认ID冲突) - CompID:固定设为
0,这是MAVLink规范里地面站组件的ID
- SysID:可以用
- 接收方(Pixhawk):
- 默认SysID是
1,CompID是1(飞控核心组件)。发送消息时必须指定目标为这个组合,不然飞控会直接忽略你的请求。
- 默认SysID是
- 消息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
相关产品推荐
相关产品推荐

