MAVProxyの設定(コンパニオンコンピュータセットアップ)

プログラミング
image_print
  • 前回はハードウェアの構成をしました。
  • 最終的には繋がっています。結論は最後にあります。ただ、マニュアルは有効な情報がたくさんあるのでチラ見して頭の片隅に入れておいてください。

MAVProxyドキュメントを参考に

MAVProxyの概要

MAVProxy は、Ground Control Station(GCS) で、MAVLink プロトコルをサポートします。MAVProxy は、強力なコマンドライン ベースのソフトウェアです。
アドオン モジュールを介して拡張したり、Mission Planner、APM Planner 2、QGroundControl などの別の地上局を補完します。

ドローンからのメッセージをネットワーク経由で他のデバイス上のGCSに転送する機能など、多くの重要な機能があります。

機能

  • コマンドラインのコンソール ベースのアプリです。 MAVProxy には、基本的な GUI (MAP, メニューなど)を提供するプラグインが含まれています。
  • ネットワークに接続して、任意の数のコンピューターで実行できます。
  • ポータブルです。 Python、pyserial、および select() 関数呼び出しを備えた任意の POSIX OS (Linux、OS X、Windows など) で実行する必要があります。
  • 軽量設計なので、小さなネットブックでも簡単に実行できます。
  • ロード可能なモジュールをサポートし、コンソール、移動地図、ジョイスティック、アンテナ トラッカーなどをサポートするモジュールを備えています。
  • コマンドのタブによる補完。

インストール

ardupilotのmavproxyの記事によれば以下のとおり。python3とpip3がインストールされている前提です。

sudo apt -y install python3-dev python3-opencv python3-wxgtk4.0 
 python3-pip python3-matplotlib python3-lxml python3-pygame
pip3 install PyYAML mavproxy --user

最後に /.local/bin をpathに含めます。すでにあればやる必要ないです。
例えば.bashrcの最後にexport PATH=$PATH:$HOME/.local/bin って書き加えるとか。

接続例

(以下Ardupilot MAVProxy QuickStart)

MAVProxyはひとつのardupilotとだけ接続できます。

USB経由の接続の場合

  • Linux: mavproxy.py –master=/dev/ttyUSB0
  • Windows: mavproxy –master=COMxx
  • macOS: mavproxy.py –master=/dev/ttyusbserialXX

ネットワークを超えて接続の場合

mavlinkのデータストリームが流れてくるIPアドレスとポートを特定してください。
これは自身のipアドレスになるはずです。もし、IPアドレスがわからない場合、0.0.0.0を指定してください。MAVProxyはIPアドレスを探します。

例:

mavproxy.py --master=tcp:192.168.1.1:14550
mavproxy.py --master=udp:127.0.0.1:14550
mavproxy.py --master=tcp:0.0.0.0:14550

もし、リモートIPアドレスである場合は次のようにudpout,  tcpoutを指定します。

mavproxy.py --master=udpout:10.10.1.1:14550
mavproxy.py --master=tcpout:10.10.1.1:14550

設定例はオプションのあとに書いてあります。。。

スタートアップオプション

なお、元の文書にあるとおり、–(ダッシュ、ハイフンふたつ)は見づらいので-/-とします。
重要だと思うパラメーターは赤にしました。

-/-master

UAV(Unmanned Aerial Vehicle:ドローン)が通信しているポート (シリアル、USB、またはネットワーク アドレス/ポート) を指定します。(事実上は、フライトコントローラー)

複数の –master を使用できます。 MAVProxy は、パケットを単一のストリームに自動的に並び替えますます。 これは、独立した冗長リンクが使用されている場合に役立ちます。

IP アドレスを指定する場合は、ローカル コンピューターの IP アドレスまたはループバック アドレスである必要があります。 IP 接続タイプ (TCP または UDP) は、IP アドレスの前に付ける必要があります。

シリアル ポートが指定されている場合は、オプションでコンマ区切りのボー レートも指定できます。 そのような指定をした場合、 –baudrate で指定されたレートを上書きします。

-/-quadcopter

クワッドコプター(4つ以上のプロペラのあるドローン)の場合、指定します。

-/-baudrate

–masterと–outで使うボーレートを指定します。シリアル通信時のみ、有効です。

-/-out

MAVLink パケットをリモート デバイス (シリアル、USB、またはネットワーク アドレス/ポート) に転送します。 複数の地上局コンピュータを使用する場合、または中間ノードを介してストリームを中継する場合に役立ちます。

MAVlink は通常、IP ベースのパケット転送にポート 14550 を使用しますが、必要に応じて他のポートを使用することもできます。

シリアル ポートが指定されている場合 (たとえば、空中の MAVProxy を GCS に接続する無線デバイス)、リンク固有のボー レートをデバイスの後にコンマで区切って指定できます。 これは –baudrate で指定されたグローバルなデフォルトのボーレートを上書きします。

tcp または udp 経由でネットワーク アドレスに転送する場合は、IP アドレスの前にプレフィックスを付ける必要があります。

UDP ブロードキャストは、udpbcast:<ip>:<port> を介して作成できます。これは、UDP ブロードキャストとして開始され、接続する最初のクライアントにロックされます。 <ip> は、有効なクライアントのIPアドレスの範囲を指定します。 たとえば、udpbcast:192.168.2.255:14550 は、ポート 14550 で 192.168.2.0 から 192.168.2.254 の範囲の最初のクライアントに接続します。

mavproxy.py --master=/dev/ttyUSB0 --out=udp:192.168.1.1:14550
mavproxy.py --master=/dev/ttyACM0,115200 --out=/dev/ttyUSB0,57600
mavproxy.py --master=/dev/ttyACM0,115200 --out=COM17,57600
mavproxy.py --master=/dev/ttyACM0,57600 --out=udpbcast:192.168.2.255:14550

-/-sitl

シミュレーター(sitl)を使う場合、通常は sitl=127.0.0.1:5501

-/-streamrate

MAVLinkのストリームのレート

-/-source-system

このGCSのためのMAVLinkのソースシステム(???)

-/-source-component

このGCSのためのMAVLinkソースコンポーネント

-/-target-system

MAVLinkのターゲットマスターシステム

-/-target-component

MAVLinkのターゲットマスターコンポーネント

-/-logfile

MAVLinkのログファイル。デフォルトはmav.tlog

-/-append-log

新しいログファイルを作らずに、ログファイルに追記する。フライト中に再接続する時などに有効

-/-setup

APMのコマンドラインの仲でCLIモードでスタートする指定 (?)

-/-nodtr

クローズ時にDTRのドロップをしない (?)

-/-show-errors

MAVLinkのエラーパケットを表示する

-/-speech

テキストをスピーチする。Linuxでスピーチソフトウェアを入れている前提

-/-aircraft

飛ぶドローンの名前。指定すると

/Logs/AircraftName/Date/flightNumber/flight.tlog

となる

-/-cmd

MAVProxyがスタートしたときに実行するコマンドリスト

例:

mavproxy.py --master=/dev/ttyUSB0 --cmd="param load init.parm; module load map;"

-/-console

スタートアップ時にGUIコンソールモジュールをロードする

-/-map

スタートアップ時に移動マップモジュールをロードする

–load-module

任意のモジュールをロードする。このパラメータを複数書いても、コンマ区切りでモジュール名を並べてもよい

-/-mavversion

MAVLinkのバージョン、1.0か2.0を指定する。しかし通常、MAVProxyはMAVLinkのバージョンを自動認識する。

-/-auto-protocol

MAVLinkプロトコルのバージョンを自動認識する

-/-continue

ログを続ける

-/-nowait

スタートアップ時にHEARTBEATパケットを待たない

-/-dialect

MAVLinkの亜流?APM dialectがデフォルト

-/-rtscts

RTS/CTSのハードウェアフローコントロールをする

–mission

現在のミッションの名前を指定する。指定すると、ログファイル名が/Logs/aircraftname/missionname となる
デフォルトは /Logs/aircraftname/currentdatetime

-/-daemon

デーモンモード(バックグラウンド)でスタート。対話的なシェルはスタートしない

-/-state-basedir

ログが保管されるフォルダーを指定。カレントフォルダーではない。

-/-version

MAVProxyのバージョン情報を返す

-/-moddebug

コンソールに表示されるデバッグ出力のレベルを制御する。 デフォルトは 0 (デバッグ出力なし)。
3は、MAVProxy とそのモジュールのクラッシュまたはエラーのデバッグに役立つ。

–default-modules

デフォルトで起動時にロードするモジュールのコンマ区切りリスト。
このパラメータのデフォルト値はlog,signing,wp,rally,fence,param,relay,tuneopt,arm,mode,calibration,rc,auxopt,misc,cmdlong, battery,terrain,output,adsb

-/-non-interactive

対話型シェルをスタートしない

テレメトリーの転送

MAVProxy の重要な機能のひとつは、UDP を介してネットワーク経由でドローンから他のデバイス上の地上局ソフトウェアにメッセージを転送する機能です。
たとえば、独自のテレメトリーをつけたラップトップで地上局を実行し、Wi-Fi 経由でスマートフォン/タブレットに転送することができます。これを使用して、長時間の飛行中に数キロ離れたスポッターとして行動している友人に4G VPNを介してテレメトリ データを送信することもできます。

../../_images/Mavproxy_usage.jpg

MAVLink データをネットワーク経由で PC に転送するには、コマンド ラインから MAVProxy を起動するときにいくつかのパラメータを追加するだけです。

ローカルでの転送

ローカルの地上局ソフトウェア (Mission Planner や QGC など) に接続するには、次のコマンドを使用して Linux で MAVProxy を起動します。

mavproxy.py --master=/dev/ttyACM0 --baudrate 115200 --out 127.0.0.1:14550

MAVProxyはLinuxPCとフライトコントローラーを接続します。

WIndowsの場合、

mavproxy --master COMx --out=127.0.0.1:14550

COMxはフライトコントローラーが接続されているポートです。

リモートへの転送

Note: MAVProxy には TCP を使用して転送する機能もありますが、ジョイスティック コントロールが使用されている場合、ネットワークの遅延により遅延が長くなる可能性があるため、推奨されません。

任意のコンピューターの IP アドレスを追加して、テレメトリ ストリームを他の地上局に転送できます。

  • ローカル ネットワーク/wifi では、地上局ソフトへの着信ストリームを停止するファイアウォールがクライアント PC にないことを確認する必要があります。
  • – -out 宛先 IP アドレス:14550 を MAVProxy コマンドの末尾に追加します。 実行している追加の地上局の数に応じて、個別の – -out パラメータを必要な数だけ追加できます。
  • ポート 14550 で UDP パケットをリッスンするように各地上局を設定し、ファイアウォールが UDP ポート 14550 で着信トラフィックをブロックしていないことを再度確認します。

FAQの重要だと思われるQ&A

TCP 接続を別の GCS プログラムに出力するにはどうすればよいですか?

MAVProxy から GCS プログラム (つまり、Mission Planner) への TCP リンクを出力するには、 –out=tcpin:0.0.0.0:<port> コマンドライン オプションを使用します。
これにより、指定されたポートで TCP 接続を待機するように MAVProxy に指示します。

Raspiをネットワーク機器にしてPixhawkと接続するには?

Ardupilotは複雑なシステムで、現象だけをQAフォーラム、Gitに投稿してもほとんど回答がありません。
別に参加者の意地が悪いわけではなく、考えられる可能性がありすぎるからだと思います。

たとえば、表記のタイトルの場合、Raspi+PixhawkとPC上のmission plannerのどちらを先に立ち上げるかは大事な考慮事項です。片方が接続を試みた時、片方はListenの状態にないとTCPだろうがUDPだろうが繋がりません。
こんな当たり前のことは、前提知識のため今更書かれていないように思います。

Mission Planner側が接続を待つのであれば

mavproxy.py --master=/dev/ttyAMA0 --baudrate 47600 --out=udp:<MPが稼働するPCのIPアドレス>:14550

になります。これは安定して繋がります。

Raspberry Piを先に立ち上げてMission Plannerの接続を待つならば、FAQにあるとおりの指定

mavproxy.py --master=/dev/ttyAMA0 --baudrate 57600 --out=tcpin:0.0.0.0:14550

でOKです。(UDPはうまくいきませんでした)
0.0.0.0は任意のIPアドレスで接続に来ることを許す意味があります。

この場合、MP側は右上でtcpを選び、RaspiのIPアドレスとポート14550を指定します。

*この接続はRaspberry PIをLTE接続しても、うまくいきました。(参照:Raspberry PIにLTE USBトングル UX302NCを接続する)
ただし、MAVLinkの1秒おきのハートビートをこのような接続で常に大丈夫かは別問題です。

また、RaspiとPixhawkをUSBで接続する場合、/dev/ttyACM0です。(USBシリアルです)

つながらない時のチェックリスト

  • (2024/6/25加筆)フライトコントローラーによってテレメトリーポートの位置が違います。Raspiからのケーブルは正しい位置に取り付けられているでしょうか?
  • PixhawkとRaspiのピン接続、特にRX,TXはお互い逆に接続しないといけませんが、あっていますか?
  • ケーブルが接触不良、断線していませんか?テスターで確認しましょう。
  • Mission Plannerを動作させているPCのファイアーウォールはどうなっていますか?ポート14550を開放していますか?(UFWの導入をおすすめしません。こういうプライベートな機器を一時的に立ち上げて使う時にポートを絞ってなんの意味があるのでしょうか?)
  • MavProxyが正しく動いていますか? mdemmanagerをremoveすることが推奨されています(私は無視しても繋がってますが)
  • Raspiのシリアルインターフェースが有効になっていますか?(raspi-configで確認)ログインシェル->No, ポートハードウェアを有効にする->YES
  • bluetoothを使用不可にします(/boot/firamware/config.txt内)enable_uart=1  dtoverlay=disable-bt
  • Mavproxyのパラメーターは本当に正しいですか?へんなところにブランクが入っていると正しく動作しません。
  • MavproxyのボーレートがFC上(mission Controllerで設定した値)とMavproxyの起動パラメーターと一致していなければなりません。
  • 通信ポートはmavproxyとmpと整合性がありますか?
タイトルとURLをコピーしました