更改 Mavlink 消息速率 ArduPilotMega
Changing Mavlink Message Rate ArduPilotMega
我正在开发一个使用 Mavlink 协议(在 c++ 中)与 ArduPilotMega (2.6) 通信的项目。
例如,我能够阅读诸如 ATTITUDE 之类的消息。当前消息速率(对于所有消息)是 2Hz,我想提高这个速率。
我发现我可能应该使用 MAV_CMD_SET_MESSAGE_INTERVAL
设置 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_component
和 sysid
、compid
之间的区别。我为每个尝试了几个值,但没有任何效果。
是否有任何 ACK 能够告诉我它是否收到命令?
来自Robotis Stack Exchange个回答,
要更改消息速率,最简单的方法是使用Mission Planner 更改SR_* 参数值。最大速率为 10Hz。
例如,为了将 ATTITUDE 消息速率更改为 10Hz,我只需将 SR_EXTRA1 参数更改为 10.
有关每个消息更改哪个参数的更多信息,请参阅 ArduCopter 固件中的 GCS_Mavlink.cpp 文件。
我猜你错过了 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;
}
我正在开发一个使用 Mavlink 协议(在 c++ 中)与 ArduPilotMega (2.6) 通信的项目。
例如,我能够阅读诸如 ATTITUDE 之类的消息。当前消息速率(对于所有消息)是 2Hz,我想提高这个速率。
我发现我可能应该使用 MAV_CMD_SET_MESSAGE_INTERVAL
设置 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_component
和 sysid
、compid
之间的区别。我为每个尝试了几个值,但没有任何效果。
是否有任何 ACK 能够告诉我它是否收到命令?
来自Robotis Stack Exchange个回答,
要更改消息速率,最简单的方法是使用Mission Planner 更改SR_* 参数值。最大速率为 10Hz。
例如,为了将 ATTITUDE 消息速率更改为 10Hz,我只需将 SR_EXTRA1 参数更改为 10.
有关每个消息更改哪个参数的更多信息,请参阅 ArduCopter 固件中的 GCS_Mavlink.cpp 文件。
我猜你错过了 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;
}