最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

MATLAB で MAVLink パラメーター プロトコルを使用した UAV パラメーターの調整

この例では、MATLAB で MAVLink のパラメーター プロトコルを使用して外部の地上管制ステーションと通信する方法を説明します。シミュレートされた無人航空機 (UAV) から地上管制ステーションに、MAVLink 通信プロトコルを使用してパラメーターの更新を送信するための、サンプルのパラメーター プロトコルが提供されています。2 つの MAVLink コンポーネント、つまり UAV と地上管制ステーションの間の通信を設定します。次に、パラメーターの更新を送受信して、UAV のパラメーター値を調整します。最後に、QGroundControl© を地上管制ステーションとして使用する場合は、これらのパラメーターの更新を QGroundControl から取得し、更新の反映をプログラム ウィンドウで確認できます。

パラメーター プロトコル

MAVLink クライアントは、共通に定義されるデータ構造をメッセージとして使用して、ネットワーク内で情報を交換します。MAVLink パラメーター プロトコルは、UAV と地上管制ステーション (GCS) の間でコンフィギュレーション設定を交換するために使用されます。パラメーター プロトコルはクライアント/サーバーのパターンに従います。たとえば、GCS がメッセージの形式で要求を開始し、UAV がデータで応答します。

共通の方言の設定

MAVLink のメッセージは XML ファイルで定義されます。すべてのシステムに共通の標準メッセージは "common.xml" ファイルで定義されます。その他のベンダー固有のメッセージは、個別の XML ファイルに保存されます。この例では、"common.xml" ファイルを使用して、MAVLink クライアント間の共通の方言を設定します。

dialect = mavlinkdialect("common.xml");

この方言を使用して、方言内のメッセージを理解できる mavlinkio オブジェクトを作成します。

UAV 接続の設定

シミュレートされた UAV を表す mavlinkio オブジェクトを作成します。SystemIDComponentIDAutoPilotTypeComponentType の各パラメーターを名前と値のペアとして指定します。この例では、汎用の自動操縦タイプ 'MAV_AUTOPILOT_GENERIC' を、クワッドローターのコンポーネント タイプ 'MAV_TYPE_QUADROTOR' と共に使用します。

uavNode = mavlinkio(dialect,'SystemID',1,'ComponentID',1, ...
    'AutopilotType',"MAV_AUTOPILOT_GENERIC",'ComponentType',"MAV_TYPE_QUADROTOR");

シミュレートされた UAV は、UDP ポートで受信メッセージをリスニングします。uavNode オブジェクトを使用して、この UDP ポートに接続します。

uavPort = 14750;
connect(uavNode,"UDP",'LocalPort',uavPort);

GCS 接続の設定

別の UDP ポートでリスニングする、シミュレートされた地上管制ステーション (GCS) を作成します。

gcsNode = mavlinkio(dialect);
gcsPort = 14560;
connect(gcsNode,"UDP", 'LocalPort', gcsPort);

クライアントとサブスクライバーの設定

シミュレートされた UAV が地上管制ステーションと通信するためのクライアント インターフェイスを設定します。LocalClient 情報を構造体として取得し、システムおよびコンポーネントの ID 情報を mavlinkclient オブジェクトに指定します。

clientStruct = uavNode.LocalClient;
uavClient = mavlinkclient(gcsNode,clientStruct.SystemID,clientStruct.ComponentID);

メッセージを受信し、コールバックを使用してそのメッセージを処理する mavlinksub オブジェクトを作成します。このサブスクライバーは、'PARAM_VALUE' トピックのメッセージを受信し、uavClient のシステムおよびコンポーネントの ID に一致するメッセージを具体的に探します。新しく受信した各メッセージのペイロードを表示するコールバック関数が指定されます。

paramValueSub = mavlinksub(gcsNode,uavClient,'PARAM_VALUE','BufferSize',10,...
                            'NewMessageFcn', @(~,msg)disp(msg.Payload));

パラメーターの動作

UAV と地上管制ステーションの間の接続の設定が完了しました。これにより、パラメーター プロトコル exampleHelperMAVParamProtocol で定義されている動作を使用して、シミュレートされた UAV のコンフィギュレーションをクエリし、更新できます。パラメーター プロトコルのワークフローを説明する GCS の動作は 4 通りあります。リストされている各メッセージ タイプには、指定されたパラメーター プロトコルに基づいて、メッセージで実行することに関する簡単な説明があります。

  1. PARAM_REQUET_LIST: 受信側にすべてのパラメーターを要求します。すべての値が、PARAM_VALUE メッセージを使用してブロードキャストされます。

  2. PARAM_REQUEST_READ: 単一のパラメーターを要求します。指定したパラメーター値が、PARAM_VALUE メッセージを使用してブロードキャストされます。

  3. PARAM_SET: 特定のパラメーターの値を設定するコマンド。値の設定後、現在の値が PARAM_VALUE message を使用してブロードキャストされます。

  4. PARAM_VALUE: 前述の要求 (PARAM_REQUEST_LISTPARAM_REQUEST_READ または PARAM_SET) に応答して、パラメーターの現在の値をブロードキャストします。

paramProtocol = exampleHelperMAVParamProtocol(uavNode);

このパラメーター プロトコルは、'MAX_ROLL_RATE''MAX_PITCH_RATE' および 'MAX_YAW_RATE' の 3 つのパラメーター値をもちます。これらの値は、UAV のロール、ピッチ、ヨーの最大速度を度/秒の単位で表します。実際の UAV システムでは、これらの速度を調整して、アクロバット制御の程度に対するパフォーマンスを調整できます。

すべてのパラメーターの読み取り

UAV システムからすべてのパラメーターを読み取るには、"PARAM_REQUEST_LIST" メッセージを gcsNode から uavNode に送信します。動作の順序は次のとおりです。

  1. GCS ノードが、先ほど定義した uavClient を使用してターゲットのシステムとコンポーネントを指定し、トピックが "PARAM_REQUEST_LIST" であるメッセージを UAV ノードに送信します。

  2. UAV ノードが、"PARAM_VALUE" メッセージの形式で、すべてのパラメーターを個々に送信します。トピック 'PARAM_VALUE' をサブスクライブしているサブスクライバーが GCS ノード上にあるため、メッセージ ペイロードはすぐに表示されます。

msg = createmsg(dialect,"PARAM_REQUEST_LIST");

システムおよびコンポーネントの ID 値をメッセージに割り当てます。(:)= のインデックス付けを使用して、割り当てによって struct のフィールドのデータ型が変化しないことを確認します。

msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;
msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

ローカル ホストの IP アドレス '127.0.0.1' のポートでリスニングしている UAV にパラメーター要求を送信します。一時停止してメッセージが処理されるまで待ちます。パラメーター リストがコマンド ウィンドウに表示されます。

sendudpmsg(gcsNode,msg,"127.0.0.1",uavPort)
pause(1);
    param_value: 90
    param_count: 3
    param_index: 0
       param_id: 'MAX_ROLL_RATE   '
     param_type: 9

    param_value: 90
    param_count: 3
    param_index: 1
       param_id: 'MAX_YAW_RATE    '
     param_type: 9

    param_value: 90
    param_count: 3
    param_index: 2
       param_id: 'MAX_PITCH_RATE  '
     param_type: 9

単一のパラメーターの読み取り

単一のパラメーターを読み取るには、"PARAM_REQUEST_READ" メッセージを GCS ノードから UAV ノードに送信します。"PARAM_REQUEST_READ" トピックのメッセージを UAV ノードへ送信します。パラメーター インデックス 0 を指定します。これは 'MAX_ROLL_RATE' パラメーターを指します。このインデックス値は、最初のパラメーター値をクエリします。

UAV が、更新されたパラメーターを "PARAM_VALUE" メッセージとして GCS ノードに送り返します。"PARAM_VALUE" に対するサブスクライバーを GCS ノード上で設定しているため、メッセージ ペイロードがコマンド ウィンドウに表示されます。

msg = createmsg(gcsNode.Dialect,"PARAM_REQUEST_READ");
msg.Payload.param_index(:) = 0;
msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;
msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

sendudpmsg(gcsNode,msg,"127.0.0.1",uavPort);
pause(1);
    param_value: 90
    param_count: 3
    param_index: 0
       param_id: 'MAX_ROLL_RATE   '
     param_type: 9

パラメーターの書き込み

パラメーターを書き込むには、"PARAM_SET" メッセージを GCS ノードから UAV ノードに送信します。メッセージの ID、タイプおよび値を指定し、gcsNode オブジェクトを使用して送信します。UAV が更新されたパラメーター値を送り返し、GCS サブスクライバーがメッセージ ペイロードを表示します。このメッセージにより、UAV の最大ヨー速度が 45 度/秒に減少されて更新されます。

msg = createmsg(gcsNode.Dialect,"PARAM_SET");
msg.Payload.param_id(1:12) = "MAX_YAW_RATE";
msg.Payload.param_type(:) = 9;
msg.Payload.param_value(:) = 45;
msg.Payload.target_system(:) = uavNode.LocalClient.SystemID;
msg.Payload.target_component(:) = uavNode.LocalClient.ComponentID;

sendudpmsg(gcsNode,msg,"127.0.0.1", uavPort);
pause(1);
    param_value: 45
    param_count: 3
    param_index: 2
       param_id: 'MAX_YAW_RATE    '
     param_type: 9

QGroundControl の操作

QGroundControl© は、MAVLink 対応の UAV に関する飛行制御やミッション計画の実行に使用されるアプリです。QGroundControl を GCS として使用して、シミュレートされた UAV のパラメーターへのアクセス方法を示すことができます。

  1. QGroundControl をダウンロードして起動します。qgcPort の番号を 14550 として定義します。これは QGroundControl アプリの既定の UDP ポートです。

  2. ハートビート メッセージを作成します。

  3. MATLAB の timer オブジェクトを使用して、UAV ノードから QGroundControl にハートビート メッセージを送信します。既定で、timer オブジェクトは TimerFcn を 1 秒ごとに実行します。TimerFcn は、ハートビート メッセージを送信する sendudpmsg の呼び出しです。

  4. シミュレートされた UAV からハートビートを受信した QGroundControl は、ユーザーが UAV パラメーターの読み取りや更新を行うためのパラメーター パネル ウィジェットを作成します。

qgcPort = 14550;
heartbeat = createmsg(dialect,"HEARTBEAT");
heartbeat.Payload.type(:) = enum2num(dialect,'MAV_TYPE',uavNode.LocalClient.ComponentType);
heartbeat.Payload.autopilot(:) = enum2num(dialect,'MAV_AUTOPILOT',uavNode.LocalClient.AutopilotType);
heartbeat.Payload.system_status(:) = enum2num(dialect,'MAV_STATE',"MAV_STATE_STANDBY");

heartbeatTimer = timer;
heartbeatTimer.ExecutionMode = 'fixedRate';
heartbeatTimer.TimerFcn = @(~,~)sendudpmsg(uavNode,heartbeat,'127.0.0.1',qgcPort);
start(heartbeatTimer);

タイマーの実行中に QGroundControl は、ハートビート メッセージを受信したことと、UAV に接続されていることを表示します。[Vehicle Setup] タブで、[Other]、[Misc] をクリックして、設定したパラメーター値がアプリに反映されていることを確認します。

メモ: ここでは汎用の自動操縦タイプ "MAV_AUTOPILOT_GENERIC" を使用するため、QGroundControl は、接続を既知の自動操縦タイプとして認識しません。これは接続に影響せず、パラメーター値は引き続き説明したとおりに更新されます。

MAVLink 接続を閉じる

QGroundControl のパラメーター ウィジェットを試した後、heartbeatTimer を停止してハートビート メッセージの送信を停止します。heartbeatTimer オブジェクトと paramProtocol オブジェクトを削除します。最後に、UAV ノードと GCS ノードを切断して、システム間の通信をクリーンアップします。

stop(heartbeatTimer);
delete(heartbeatTimer);
delete(paramProtocol);

disconnect(uavNode);
disconnect(gcsNode);