1

我正在开发一个使用 Mavlink 协议(在 C++ 中)与 ArduPilotMega(2.6)通信的项目。
例如,我能够阅读诸如ATTITUDE之类的消息。当前的消息速率(所有消息)是 2Hz,我想提高这个速率。
我发现我应该设置MESSAGE_INTERVAL使用MAV_CMD_SET_MESSAGE_INTERVAL以更改它。

所以我的问题是:
如何在 c++ 中使用 mavlink 发送此命令消息?

我尝试使用下面的代码进行操作,但没有成功。我想我必须使用我上面提到的命令,但我不知道如何。

mavlink_message_t command;
mavlink_message_interval_t interval;

interval.interval_us = 100000;
interval.message_id = 30;

mavlink_msg_message_interval_encode(255, 200, &command, &interval);
p_sensorsPort->write_message(command);

更新:我也在下面尝试了这段代码,也许我没有给它正确的系统 ID 或组件 ID。

mavlink_message_t command;
mavlink_command_long_t interval;

interval.param1 = MAVLINK_MSG_ID_ATTITUDE;
interval.param2 = 100000;
interval.command = MAV_CMD_SET_MESSAGE_INTERVAL;
interval.target_system = 0;
interval.target_component = 0;

mavlink_msg_command_long_encode(255, 0, &command, &interval);
p_sensorsPort->write_message(command);

也许我错过了target_system,target_componentsysid,之间的区别compid。我为每个尝试了几个值,但没有任何效果。
是否有任何 ACK 可以告诉我它是否收到了命令?

4

2 回答 2

1

我猜你错过了 start_stop 字段。下面的示例正在工作。

        final msg_request_data_stream msg = new msg_request_data_stream ();
        msg.req_message_rate = rate;
        msg.req_stream_id = (short) streamId;
        msg.target_component = (short)compID;
        msg.target_system = (short)sysID;

        /*
                            GCS_COMMON.cpp contains code that sends when value =1
                            and stop when value = 0
                             that is  it.
        */

        if (rate > 0) {
            msg.start_stop = 1;
        } else {
            msg.start_stop = 0;
        }
于 2017-01-17T17:24:52.267 回答
0

来自Robotis Stack Exchange的回答,

为了更改消息速率,最简单的方法是使用Mission Planner更改SR_*参数值。最大速率为 10Hz。 例如,为了将ATTITUDE消息速率更改为 10Hz,我只需将SR_EXTRA1参数更改为 10。

有关哪些参数更改每条消息的更多信息,请参阅ArduCopter 固件中的GCS_Mavlink.cpp文件。

于 2016-05-25T13:38:28.733 回答