M1 Mac上にArdupilotの環境を作る

Mac OSX

ドローンのシステム開発をM1 Mac上でやろうとすると様々な制限から取らざるを得ない、典型的な構成のはずなんですが、英語圏をふくめこの構成が書かれたものが見つかりません。
とくに仮想計算機のUbuntuとQGroundControlをMAVProxyで接続するために、かなりいろいろ調べました。
同様のことをやりたい方の参考になれば幸いです。
まぁ、なにより自分がなにしたかの備忘録なんですけどね。
結果は、こういう構成図です。

GCS

M1 Macでは、まずGCS(Ground Control Station)はQGroupControlがオススメです。
Mission PlannerはWIndows専用と現時点ではいえます。
QGCのマニュアルその他はこちらから。

USBでのフライトコントローラーとの接続はカンタンにOKでした。ファームの転送も問題なし。

SITLの導入

次にSITLをインストールしたいと思います。
SITLはLinux上で動作します。
(コンパイルをとおして、Mac上で動かしている例はありますが大変そうです。)

全体の作業の流れを書きます。apt updateしろとかいう基本的なことは省略しています。

  1. M1 MacにVMをインストールして、UbuntuをISOイメージから立ち上げる
  2. Ubuntuを立ち上げ、Firefoxからインターネット接続を確認
  3. ardupilotのパッケージをダウンロードし、セットアップシェルを流す
  4. SITLをインストールする
  5. SITLを立ち上げる
  6. MAVProxyでGCSと接続

M1 MacでオススメのVM

SITLをM1 Mac上で動かそうと考えた場合、Ubuntuの動作するVMが必要です。
2023年1月時点でM1 Macに対応したVMはVMWare Fusion 13かUTMです。
VMWareが対応した時期は12月ですから、かなり新しい情報です。このVMWareでARM版のUbuntu22.04 LTSをゲストOSとしてサポートするとのこと。ひさーしぶりにVMWare Playerを使ってみましたが、動きません!怒

ネット情報だと22のカーネルでは動かないらしいです。試しにやってみた20.4では立ち上がりました。
VMWare Fusionは個人利用は無料とはいえライセンスの問題があるので、VMWare Customer Connectのアカウントを取りました。
が、さらに難題が。
VMWare Fusion(Player)はVMの定義はほとんどなにもできなくなっています。致命的なのがネットワーク。
黙ってUbuntuを立ち上げるとNATで繋がりはしますが、SITLにつなごうとか考えると難しいわけです。
一日無駄に過ごしてしまい、アンインストールしました。

なので、UTMをインストールしました。
UTMとUbuntuの導入は「オブジェクト指向がわからない!」さんのサイトを見ながらやりました。スクショが豊富なので迷わなくて助かります!あざーす。
なお、共有フォルダーを作る必要はありません。

あとでとても役にたつのですが、UTMは仮想ハブをもったネットワークシェアリングがデフォルトで、このおかげでカンタンにUbuntu上のSITLとQGroundControlが繋がります。

ところでいろいろ探していると、VMの設定をVagrantにまかせる例をよく見かけます。
Vagrantとは私もよく知らなかったのですが、VM(仮想計算機ソフトウェア)であるVirtual Box, VMware, UTMなどをカンタンに使うためのツールだそうです。(Parallelsは高いので、どうなろうが視野に入りません)
コマンドを見ていると、たしかに同じターミナルでいろいろできるのはわかるけど「今、俺はMacをいじってるんだ」「今、俺はUbuntuをいじっているんだ」と意識するためにはターミナルをスイッチしたほうがよくないですか?

SITLの導入

UbuntuにSITLを導入する基本のシナリオはArdupilotのWikiを参照します。

まず次のコマンドでardupilotパッケージを持ち込みます

git clone https://github.com/ardupilot/ardupilot
cd ardupilot
git submodule update --init --recursive

次にUbuntu用のセットアップをします

cd ardupilot

./Tools/environment_install/install-prereqs-ubuntu.sh -y

 

終わったら、いったんログオフしてログインしなおしてください。

SITLの試しの起動をします。最初はコンパイルが始まるのでかなり時間がかかります。

sim_vehicle.py -v ArduCopter --map --console -L xxxxx

-vにはドローンタイプを書きます。各フレームタイプはこのページを参照 example of using SITL by vehcle

-L以下のパラメーターはどこにシミュレーター機体を置くか、で ardupilot/Tools/autotest/locations.txt にある場所を書きます。

これでまずSITLが起動するか確認してください。

ちなみにMacにardupilotの環境構築をすることはオススメしません。
勝手にbrewでインストールしたり、メチャクチャ環境が汚れます。私はやっちまったのですが、すべて削除しました。

MAVProxyの設定

MAVProxyでSITL(Ubuntu上)とQGroundControl(Mac上)を接続します。
UTMをインストールすると、私の場合、UbuntuのIPアドレスは192.168.64.2、MacのIPアドレスは192.168.64.1 となっています。それぞれifconfigコマンドで確認してください。Mac側はbridge100が追加されているはずです。
確認のためにpingをお互いに打ってみて、とおるか確認しましょう。

確認できたらMAVProxyを立ち上げます。
MAVProxyはMAVLinkをとおすためのソフトウェアルーターという認識が正しいと思います。
コマンドラインGCSとしても使えます。

ちなみにMAVProxyにはAPIはありません。必要な時はPyMAVLinkを使います。

pip3 install pymavlink

話しを戻します。
mavproxyはardupilotのパッケージにふくまれていますから、次のようなパラメーターで起動します。
冒頭の図を見直してください。

mavproxy.py --master=127.0.0.1:14550 --sitl=127.0.0.1:5501 --out=192.168.64.1:14550

127,0.0.1はご存知のようにローカルを意味します。sitlとの接続は5501です。
接続先(QGC)が192.168.64.1です。
(いやー、このパラメーターを定義するまでかなりかかりました。。。)

Mac上のQGroundcontrol側の設定はudpでターゲットのIPアドレス192.168.64.2 ポート14550を定義します。

これでQGCの通信リンクの「接続」ボタンを押すとつながりました。
いやぁ、MAVProxyをコンパニオンコンピューターの件で勉強していてよかった。
SITLは信頼性が高いので、これで開発テストが始められるぞ。

あとは、Raspi同様にsshでVSCodeとつなげばVSCodeでUbuntu上のシステム開発ができます。