QGC は最大 15 台の車両しか接続できません バグは解決されました

最近、地上局で複数車両接続のバグが発生し、車両接続が 15 台を超えると、地上局は接続を確立できず、切断できなくなります。QGroundControl DeBUG バージョン テストに合格した後、次のエラー メッセージが表示されることがわかります: マブリンク チャネルが不足しています。

それでは、コードの分析を始めましょう。1 つ目は、接続関数によってトリガーされるフロントエンド コードです: LinkSettings.qml

QGCButton {
            text:       qsTr("Connect")
            enabled:    _currentSelection && !_currentSelection.link
            onClicked: {
                QGroundControl.linkManager.createConnectedLink(_currentSelection)
            }
linkManager クラスの createConnectedLink 関数がトリガーされます

これは、別の createConnectedLink 関数を呼び出す関数オーバーロードです。

 

 今回は _addLink() 関数が呼び出されます

今度はエラーコードが表示されます。これは、問題に近づいていることを意味します。まず、mavlinkChannel=0、これは、チャネルがバグを引き起こすほど十分ではないことを意味します。それで、_reserveMavlinkChannel() を開いて見てみましょう。コードを読む前に、それについて考えてみましょう割り当てには _reserveMavlinkChannel() 関数を使用する必要があります。MavLink チャネルの場合、チャネル値が 0 の場合、使用可能なチャネルがないことを意味します。

int LinkManager::_reserveMavlinkChannel(void)
{
    // Find a mavlink channel to use for this link, Channel 0 is reserved for internal use.
    for (uint8_t mavlinkChannel = 1; mavlinkChannel < MAVLINK_COMM_NUM_BUFFERS; mavlinkChannel++) {
        if (!(_mavlinkChannelsUsedBitMask & 1 << mavlinkChannel)) {
            mavlink_reset_channel_status(mavlinkChannel);
            // Start the channel on Mav 1 protocol
            mavlink_status_t* mavlinkStatus = mavlink_get_channel_status(mavlinkChannel);
            mavlinkStatus->flags |= MAVLINK_STATUS_FLAG_OUT_MAVLINK1;
            _mavlinkChannelsUsedBitMask |= 1 << mavlinkChannel;
            return mavlinkChannel;
        }
    }
    return 0;   // All channels reserved
}

このコードを理解するのには少し忍耐が必要ですが、まず、mavlinkChannel が MAVLINK_COMM_NUM_BUFFERS より大きい場合、チャネルが 0 になることを直感的に感じて、マクロ定義を確認してみましょう。

mavLink ライブラリの mavlink_types.h ファイルでは、マクロ定義 MAVLINK_COMM_NUM_BUFFERS が 16、mavlinkChannel チャネルの初期値が 1 であるため、最大 15 台の車両しか接続できません。 MAVLINK_COMM_NUM_BUFFERS の値を増やします。ただし、どの程度調整できるかについては、_reserveMavlinkChannel() 関数を読み取る必要があります。

まず、mavlinkChannel ビットによって値 1 を左にシフトし、それを _mavlinkChannels UsedBitMask の値と比較して、_mavlinkChannels UsedBitMask のバイナリ表現内の mavlinkChannel ビットの 2 進数を選択します。チャネル割り当てが完了したら、1 を割り当てる必要があります。 _mavlinkChannels UsedBitMask の mavlinkChannel ビット、つまり次のコードに追加します。

したがって、3 つのチャネルが使用されている場合、_mavlinkChannels UsedBitMask のバイナリ値は 111 であり、4 つのチャネルが使用されている場合、_mavlinkChannels UsedBitMask のバイナリ値は 1111 であることがわかります。

それでは、_mavlinkChannels UsedBitMask のステートメントをもう一度見てみましょう。

 _mavlinkChannels UsedBitMask は 32 ビットの int 値で、最大 32 個の 1 を表すことができるため、MAVLINK_COMM_NUM_BUFFERS 値の設定に戻りますが、現在設定できる最大の値は 32 です。

おすすめ

転載: blog.csdn.net/hellocode_7812/article/details/120776443