今回からは、実際に試験している部分を適当なコードも交えて記録していきます。
日本語の情報はとても少ないですから、何らかの参考になればと思います。
環境としては、
車両側
Raspberry Pi 4 8GB
Raspbian GNU/Linux 11 (bullseye)
Python 3.9.2
Visual Studio Code 1.17.2
地上ステーション側
東芝 Dynabook R73/B 業務用PC
Windows10 Pro 21H2
Visual Studio 2022
を利用しています。(いずれも記事作成時のバージョンです)
また、VNS を利用して WindowsPC から Raspberry Pi を直接操作できると何かと便利です。各所に情報がありますので、参考にして導入することを強くお勧めします。
概要
MAVLinkは、地上ステーションとドローンなどの機体をコンパニオンコンピュータを介して接続するための通信プロトコルです。
このプロトコルはオープンソースのため、同じプロトコルを使用するステーションソフトと機体との組み合わせであればそれぞれが柔軟に対応できるようになっています。
ドローンでの利用を主眼に置いて開発されていますが、トラクターやトラック、ボートなどにも搭載して利用できます。
導入するメリットとしては、
機体制御などをライブラリのメソッドがある程度引き受けてくれるので手軽
スケジューラなどを専用に開発する必要がないか、作るとしても低コストで済むようになると思われる
Linux財団が出資する Dronecode プロジェクトの一部であるため、しばらく実用に耐えそう
ドローン用の軽量共通オープンソースプロトコルとして一定の支持があり、派生ライブラリも豊富
国内でMAVLink活用のドローンプロジェクトが動きつつあるため、今後に期待が持てる
※PX4という別のオープンソースプロトコルもあるため、そちらも注視しておく必要はあると思います
一般的に、制御部との接続を担うコンパニオンコンピュータは市販のものを購入して接続するほうが手軽です。ArduPilot Mega や Pixhawk(現 PX4) など様々な対応コンピュータがあり、コード提供元が案内しています。
またコンピュータ販売側も、多くはMAVLinkプロトコルによる開発を案内しています。
ですが今回、自分は「制御コンピュータ」と「各種制御用センサ」をなるべく自作する方向で作業しています。
本来ならば、既にパッケージ化されたセンサーをポンと取り付けて、あとは各種制御コンピュータに問い合わせして自動制御するプログラムだけを書けばよいものを、よりにもよって「自力で実装したセンサーの値を読み取る」システムと、「地上ステーションへセンサーの値を渡す」部分、「地上ステーションから指示を受け取る」部分、さらには「指示通りに機体を動かす」部分の数多くを自作するわけです。
日本語・英語それぞれの言語情報でいろいろ探しましたが、MAVLinkでシミュレータを動かす記事はあれども、地上ステーションから情報を受け取るサンプルプログラムは非常に稀でした。
ですので、利用ライブラリ pymablink の公式ドキュメントや周辺ソースコード等から情報を拾って、搭載済の Raspberry Pi がプロトコル受信をして車両の制御を行うものとして動作するようにプログラムを作成します。
最初の目標はまず「接続を確立すること」
通信するのですから接続を確立するのは当たり前のことなのですが、自身がソケット通信の知識が足りず苦戦したので共有いたします。
最初の一歩として、決定的な手掛りになったのはこちらの文書でした。多謝。
MavLink Tutorial for Absolute Dummies (Part –I) (英語です)
※基本的に MAVLink 関連の資料はほぼ全て英語です。腹を括ってGoogle翻訳片手に英語と格闘してください。
利用ライブラリと地上ステーションの準備
MAVLinkの接続確立・維持とデータ送受信に関する仕様は
接続手段は任意(小規模のパケット通信ができれば、ラジオ無線でもネットワーク接続でもUSBケーブル接続でも構わない)
データ型が決められている(MAVLink はこのデータ型を指す)
各自(地上ステーション・コンパニオンコンピュータ・制御コンピュータ・その他機器)は1Hz周期で「ハートビート」と呼ばれる確認信号を送信する
各自は既に接続済みの相手から「ハートビート」を受け取ったことを確認して接続を維持する
そのほかのメッセージの大半は、50Hz周期で送受信する
です。
本来ならば制御コンピュータ(PX4、ArduPilot等)は別途販売されているのですが、今回は相当部分を自作します。
(PX4は回路図も含めてオープンソースとは言うものの、それを自作できるかどうかは別問題ですので…)
ハートビートは名前の通り常に鼓動を続ける必要があり、心停止したら通常は接続が切断され制御不能になります。
このハートビートには「機器の種類、制御方法、システムの状態、利用しているプロトコルのバージョン」などの情報が含まれ、これを相互に送信して接続の維持を行ったり、制御に必要な送受信情報の選択をします。
地上ステーションソフトの準備
今回は、古くからある地上ステーションソフトのひとつ「Mission Planner」を利用します。
MAVLink が ArduPilot とともに歩んでいく過程の早い段階で登場したオープンソースウェアで、その誕生経緯から MAVLink の多くの機能が活用できると考えられます。
また、シミュレータも搭載しているので、x86系PCであればこちらも活用できると思います。(このシミュレータがARM系CPU≒ラズパイでは動かないという説があります)
以下からダウンロードしてインストールしてください。
(今回、自身は別途開発に利用する WindowsPC へ Mission Planner をインストールしました)
※他にも、Linux財団が支援するプロジェクトとして QGroundControl というMAVLink対応ステーションソフトがあります。Linux(Ubuntu)上で試験する場合は、こちらのほうが良いかもしれません。
ARM64系CPU・Devian系Linux(=Raspberry Pi)で動く保証のある地上ステーションがちょっと見当たらないため、やはり別途PCが必要になりそうです。(このあたりは機を見てまた探そうと思います)
話としては、基本的には地上ステーションソフトとして Mission Planner を WindowsPC に入れて利用しているものとして進めます。
MAVLink 利用の発は Python を利用します。
Raspberry Pi の制御の学習に Python を利用していたことと、とりあえず練習で作ったセンサー動作確認プログラムは Python で書いたので、先に書いたプログラムを流用するつもりで利用します。
(ただ Python は手習い中ですので、誤字誤植や非効率な部分についてはご容赦ください orz)
まずは、MAVLink の Python 用ライブラリ「pymavlink」を用意します。
インストールは公式 Python (mavgen) · MAVLink Developer Guide にもある通りですが、
pip install pymavlink
としてライブラリをインストールします。
細かく設定するには dialect ファイルを機種毎に用意する必要があるようですが、まだ勝手がわかっていないので今回は common で動かします。
dialect ファイルを common で補う場合、他に特別なインストール作業は不要です。
さらにお手軽に使用するためには、この pymavlink 内に用意されたライブラリ mavutil を利用します。この mavutil ライブラリは、mavlink の基本機能に非常に簡単にアクセスできるようになるものです。
「同時に機器1台しか接続できない」こと、「基本機能のみに制限される」などはありますが、練習で始めるには簡単なほうが良いでしょう。
※このライブラリには microservices に相当するプロトコルの大部分が未実装なので、必要な場合は一部または全部を自作するか借用しなければなりません。そこが「基本機能のみに限定される」という意味合いです。
あとはお好みのエディタを利用して Python コードを書きましょう。
mavutil ライブラリの使用を開始するには、以下のようにインポートします。
from pymavlink import mavutil
from pymavlink.dialects.v10 import common as mavlink1
from pymavlink.dialects.v20 import common as mavlink2
1行目で mavutil を、2行目と3行目は利用メッセージの内容を決定します。
(mavlinkには公開当初からある簡易なv1メッセージと、署名機能を実装しセキュリティ強化したv2メッセージがあります。具体的な部分にまだ踏み入っていないので自身も詳しくわかっていませんが、メッセージ処理段階に入ればいずれ明らかになってくることでしょう)
common の部分にコントローラ名を入れると、該当の制御コンピュータに適した内容にできるようです。(今回は使いません)
このラズパイを制御コンピュータにするためには、common が最も都合が良いでしょう。
何といっても、(自分が作れば)何でもできますからね!!!11!1!
※ pymavlink のライセンスは LGPL-3.0 です。ご留意ください。
準備は宜しいかしら?
という感じで、接続のための準備段階でした。
説明文が大半ですので、コードの記述とかは大したことないです。
実際にただ繋いてメッセージをやり取りするだけなら大したことないですので、あまり構えずに見ていただければと思います。
次回は、最初の接続を確立するところまで行ってみましょう。
よろしくお付き合いくださいませ。
Comments