MAVLinkを理解する。 パート2

最後の部分では、 MAVLinkプロトコルを使用する基本的な原則を調べ、 HEARTBEATなどのメッセージを交換する方法を学びました。 このパートでは、フライトデータを処理する他の種類のメッセージを見て、Qtを使用してこのデータを視覚化してみます。



画像





MAVLinkには、さまざまな組み込みメッセージタイプと、 独自のを追加する機能があります 。 実際には、どのデータがフライトと見なされ、どのメッセージが定期的に送信され、フライトコントローラーが決定するのは要求時にのみです。 MAVLinkは、使用するメッセージを宣言しません;システムを設計するとき、ソフトウェアが処理するメッセージと送信するメッセージを決定します。 さまざまなフライトコントローラーに対して、実装の詳細が異なる方言が提供されます。たとえば、メッセージの構成やデータ、モードなどです。 MAVLinkのヘッダーのみのC / C ++ライブラリのルートには、これらの方言に対応するディレクトリがあります。common、ardupilotmegaなど。CMakeで必要なヘッダーファイルへのパスを指定することで、どの方言を使用するかを決定できます。



include_directories("3dparty/mavlink_v1/ardupilotmega")
      
      





このパートでは、ほとんどのフライトコントローラーと地上管制局(GCS)に実装する必要があるいくつかの一般的なメッセージを検討し、方言を変更してもコードのパフォーマンスに影響を与えないようにします。 基礎として最後の部分の例を取り上げ、新しいタイプのメッセージ、サービス、モデル、フライトデータの表現のハンドラーを追加します。 Qtプレゼンテーションの詳細を説明しないことをすぐに予約しなければなりません。これは記事の範囲外ですが、すべてのソースコードはgithubで入手できます。 Vehicleクラスはドメインのモデルとして機能し、各MAVのフライトデータを集約します。VehicleServiceサービスを使用すると、 systemIdで Vehicleをリクエスト/作成できます。 以下は、簡略化されたクラス図です。



画像



ATTITUDEタイプのメッセージは、空間の中心に対するMAV(ドローン)の回転位置(ピッチ、ロール、ヨー角)を示します。 最後の部分のHEARTBEATメッセージの例と同様に、抽象メッセージ処理クラス(AbstractMavLinkHandler)から継承し、パケットをデコードして、データ(ロール、ピッチ、ヨー角)を取得します。 メッセージから、メッセージを送信したシステムのsystemIdを取得し、どの車両についてデータを更新する必要があるかを比較できます。



AttitudeHandlerクラスのprocessMessageメソッドの実装
 void AttitudeHandler::processMessage(const mavlink_message_t& message) { if (message.msgid != MAVLINK_MSG_ID_ATTITUDE) return; Vehicle* vehicle = m_vehicleService->requestVehicle(message.sysid); mavlink_attitude_t attitude; mavlink_msg_attitude_decode(&message, &attitude); vehicle->setAttitude(Attitude(qRadiansToDegrees(attitude.pitch), qRadiansToDegrees(attitude.roll), qRadiansToDegrees(attitude.yaw))); }
      
      







同様に、 VFR_HUDタイプのパケットハンドラーを作成します。このタイプでは、パラメーターは通常グループ化され、通常はフロントガラスのインジケーターに表示されます。 これらのパラメーターにはMAVLinkが含まれます:対気速度、対地速度、高度、上昇速度、方向、およびガス(スロットル)。



VfrHudHandlerクラスのprocessMessageメソッドの実装
 void VfrHudHandler::processMessage(const mavlink_message_t& message) { if (message.msgid != MAVLINK_MSG_ID_VFR_HUD) return; Vehicle* vehicle = m_vehicleService->requestVehicle(message.sysid); mavlink_vfr_hud_t vfrHud; mavlink_msg_vfr_hud_decode(&message, &vfrHud); vehicle->setTrueAirSpeed(vfrHud.airspeed); vehicle->setGroundSpeed(vfrHud.groundspeed); vehicle->setBarometricAltitude(vfrHud.alt); vehicle->setBarometricClimb(vfrHud.climb); vehicle->setHeading(vfrHud.heading); vehicle->setThrottle(vfrHud.throttle); }
      
      







空間内のMAVの位置は、ローカルまたはグローバルポジショニングシステムを使用して決定できます。 このデータは、プロトコルによってタイプLOCAL_POSITIONのメッセージで送信され、

GLOBAL_POSITION 。 これらのパケットは、すでに処理され、フィルタリングされたデータを意味します。 生のGPSセンサー読み取り値の場合、 GPS_RAWおよびGPS_STATUSパケットを処理する必要があります 。 位置パケットを処理するには、PositionHandlerハンドラーを追加し、GPSデータパケットの場合はGpsHandlerを追加します。 他の一般的な種類のパッケージの処理も同じ原則で実行されます。 フライトコントローラーは特定の周波数でパケットを送信し、設定、データ転送速度、または通信チャネルのタイプに基づいて、それ自体を決定します。 ただし、目的のメッセージの識別子とマイクロ秒単位の間隔を含むメッセージMESSAGE_INTERVALを送信することにより、データの送信頻度を手動で要求できます。



メッセージ間隔要求メソッド
 void IntervalHandler::requestMessageFrequency(int messageId, float frequency) { mavlink_message_t message; mavlink_message_interval_t interval; interval.message_id = messageId; interval.interval_us = ::hzToUs(frequency); mavlink_msg_message_interval_encode(m_communicator->systemId(), m_communicator->componentId(), &message, &interval); m_communicator->sendMessageAllLinks(message); }
      
      







興味のあるすべての種類のパッケージのハンドラーを作成すると、モデル(Vehicleクラス)にデータを入力できます。 データを更新すると、モデルはQt信号スロットシステムを使用してビューに通知します。 同じパッケージを処理するときにビュー(またはその他のアクション)を何度も再描画するために、モデル内のデータを構造(クラス)にグループ化し、パッケージの内容をミラーリングするか、論理的な意味で分類します。 新しいタイプはQtシグナルとスロットの引数として使用されるため、 qRegisterMetaType関数を使用してQtメタオブジェクトシステムに登録する必要があります。 また、これらのデータ構造をQtクイックビュー(QML)からアクセスできるようにするために、説明にQ_GADGETマクロを追加します。 たとえば、 Attitudeクラスはピボット位置をグループ化します。



姿勢クラスヘッダーファイル
  class Attitude { Q_GADGET Q_PROPERTY(float pitch READ pitch CONSTANT) Q_PROPERTY(float roll READ roll CONSTANT) Q_PROPERTY(float yaw READ yaw CONSTANT) public: Attitude(float pitch = 0.0, float roll = 0.0, float yaw = 0.0); float pitch() const; float roll() const; float yaw() const; bool operator ==(const Attitude& other); private: float m_pitch; float m_roll; float m_yaw; };
      
      







QMLでは、地図と飛行計器の2つのメインビューがあります。 Qt Locationモジュールからのマップ用の既製のコンポーネントがあります。その上に、特定の位置とコース、およびその軌跡を備えたMAVアイコンを表示します。 飛行計器(FD)は手動で描画する必要があります。このタスクでは、QML Canvasを選択しました。結果は下の図のとおりです。



画像



チェックは、実際のフライトコントローラーまたは前のパートのシミュレーターで実行できます。新しいタイプのパッケージの送信は既に行われています。 次の記事では、コマンドとポイントのプロトコル(Waypoint Protocol)MAVLinkについて説明します。 ご清聴ありがとうございました!



All Articles