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しろとかいう基本的なことは省略しています。
- M1 MacにVMをインストールして、UbuntuをISOイメージから立ち上げる
- Ubuntuを立ち上げ、Firefoxからインターネット接続を確認
- ardupilotのパッケージをダウンロードし、セットアップシェルを流す
- SITLをインストールする
- SITLを立ち上げる
- 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上のシステム開発ができます。