M1 Mac上にDronekitの開発環境

ドローンのシステム開発を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をいじっているんだ」と意識するためにはターミナルをスイッチしたほうがよくないですか?

UTMにUbuntu Arm版をインストールした場合、GUI環境はないので

sudo apt install ubuntu-desktop

でインストールします。

Python3とpipの導入

sudo apt install python3-pip

python3にpythonのAliasを作るためにhomeにある .bashrcに以下を追加
(なぜかpipはpip3が呼ばれるが、pythonはpython3が呼ばれないので、上記だけ書いた)

alias python="python3" 
alias pip="pip3" 

Ardupilot、SITL、MAVProxyの導入

UbuntuにSITLを導入する基本のシナリオはSetting up the Build Environment (Linux/Ubuntu)を参照します。

まず次のコマンドでardupilotパッケージを持ち込みます。私は~下で行ってます。

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

ここにはすべてArdupilot, MAVProxy, SITLがふくまれています。

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

cd ardupilot

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

終わったら、
———- ./Tools/environment_install/install-prereqs-ubuntu.sh end ———-
というメッセージが出ます。
ログオフしてログインしなおしてください。

次にインストールされたパッケージのパスの設定をします。

SITLの試しの起動をします。
(2024年5月追記:あれ?sim_vehicle.pyの場所がTools/autotest/に変わってるぞ。???)

cd ardupilot/ArduCopter
sim_vehicle.py -v Rover -w

これでまずSITLが起動するか確認してください。
一番最初は-wで動かします。仮想EEPROMのリフレッシュらしい。コンパイルが始まります。

普段テストするパラメータはこれです。(パスがあるのでコマンドとしてOK)

sim_vehicle.py -v Rover --map --console -L Kawachi

-vにはドローンタイプを書きます。各フレームタイプはこのページを参照 example of using SITL by vehcle
-L以下のパラメーターはどこにシミュレーター機体を置くかで、ardupilot/Tools/autotest/locations.txtにある場所を書きます。

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

MAVProxyの設定

SITLが起動すると自動的にMAVProxyは起動します。
一般的には起動したVMのIPアドレスにポート5760、TCPでQGroundControl(Mac上)に接続できます。

しかしこれでは、SITLが本物と同様にもっている他のテレメトリーに接続できません。
SITLとGCSでの動きを確認しながらプログラム開発したいとなると、MAVProxyを立ち上げます。
MAVProxyはMAVLinkをとおすためのソフトウェアルーターという認識が正しいと思います。
コマンドラインGCSとしても使えます。

mavproxyはardupilotのパッケージにふくまれていますから、次のようなパラメーターで起動します。
冒頭の図でUDP 14550で接続していますが、接続先がプログラムだと見てください。

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

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

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

いやぁ、MAVProxyをコンパニオンコンピューターの件で勉強していてよかった。

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