MAVLinkを介してRaspberry Piとのコミュニケーション
このページでは、Raspberry Pi (RPi) を接続して、RPiのwifiを利用し、フライト コントローラーと通信できるようにする方法について説明します。 通信方法はシリアル接続で MAVLink プロトコルを使用します。これを使用して、画像を保存するためのメモリ要件のためにフライトコントローラーでは実行できない画像認識などの追加タスクを実行できます。
フライトコントローラーとRPiの接続
Cube Orange・Pixhawk 6Xの場合。
各ピンの割当は
- VCC_5V 出力
- MCU_TX 出力
- MCU_RX 入力
- MCU_CTS 出力
- MCU_RTS 入力
- GND
太字の4本を使います。Raspi側は上に書いたので省略。
画像に示すように、フライト コントローラの TELEM2 ポートを RPi のグラウンド、TX、および RX ピンに接続します。 個々の RPi のピン機能の詳細については、こちらを参照してください。
使用する RPi のモデルと使用する内部/外部周辺機器に応じて、+5V の電力要件は 80mA から 2.5A 近くまでさまざまです。 +5V 供給電流の要件を決定するには、特定のシステム構成の電力供給力を評価する必要があります。 通常、フライト コントローラの TELEM ポート コネクタ経由で RPiに+5v を供給することはお勧めしません。
(Raspberry Pi 4Bだと2.5Aは必須です。パワーディストリビューションボードにType-C USBケーブルをはんだづけして電力を取り出すことを検討しましょう。)
フライトコントローラーのセッティング
フライトコントローラーとグランドステーション(Mission Planner)を接続します。
次のパラメーターをセットします。テレメトリー2のポートを使う前提です。
-
- SERIAL2_PROTOCOL = 2 MAVLINK2を選択
- SERIAL2_BAUD = 57 57600ボーレート
パラメーター保管を忘れずに。
シリアルポート(UART)の設定
RPIの設定をしていなかったら
raspi-configからinterface option Serial でシリアル通信を可能とします。
Would you like a login shell to be accesible over serial ? はNO
Would you like the serial port hardware to be enabled ?はyes
reboot
さて、RaspiとフライトコントローラーをつないだシリアルはGPIO上にあります。
これはRaspi内ではttyAMA0 というデバイスとなっています。
つまり、MAVProxyはttyAMA0と繋ぐことを目指さねばなりません。
ところで、このttyAMA0とBluetoothは配線を共有しているそうです。
そこでBluetoothをオフにする必要があります。それは/boot/config.txtを編集することで行います。
sudo nano /boot/firmware/config.txtで編集します。(Bookwormで変わった)
enable_uart=1
dtoverlay=disable-bt
arm_boost=1
以上の値に変更、もしくは追記し保管します。
さらにBluetoothのモデムの初期化システム・サービスを斬り殺す
sudo systemctl disable hciuart
リブート。
これがうまくいっていると、/dev/serial0は、/dev/ttyAMA0)のシンボリックリンクとなります。
ならない場合はどこか設定をミスしています。再確認、再起動してください。
RPIソフトウェアのセットアップ
2022年末、最新RaspianOSはPython3が標準で導入されているので、Pythonのインストールは不要です。
ただし、pipは導入の必要があります。
sudo apt install python3-pip
これはerror: externally-managed-environmentとか言われて失敗するはず。
~/.pip/pip.confを作り
[global] break-system-packages = true
と書く。
pipはインストールしたものは以下のコマンドで確認できる。
pip list
RaspiとPixhawkを接続し、Drone Kitなどでつなぐ場合はここまで。
シリアル通信なので共用はできません。
なお、Pythonでのシリアルはほとんどのパッケージがpyserialを使用しています。たとえばserial.Serialなどはpyserialを想定しています。serialはほとんど使われていません。なので
pip install pyserial
でインストールしておきます。
MAVProxyのインストールと設定
pipを使ってMAVproxyのインストール (pipはpip3を指しているはず)
pip install PyYAML mavproxy --user
ユーザーのディレクトリー(~)にある.bashrcの最後の行に以下を記述
export PATH="$PATH:$HOME/.local/bin"
一応、最新にする
pip install mavproxy pymavlink --user --upgrade
MAVProxyはCUIのグランドコントロールステーションです。
さらにMAVLinkをルーティングする機能をもっています。(<- ここ重要。MAVLink-Routerを使う人がほとんどいない理由)
PIとSSHで接続していることを前提とします。
RPIとフライトコントローラーのテストは両方の電源をつけて、RPIから次をタイプします。
Mission Plannerへの接続
フライト コントローラーは、Telemetry 1 および Telemetry 2 ポート (このページの上部の画像を参照) を介して受信した MAVLink コマンドに応答します。つまり、RPi と通常の地上局 (つまり、ミッション プランナーなど) の両方を接続できます。 さらに、SITL の場合と同様に、Mission Planner を RPi で実行されている MAVProxy アプリケーションに接続することができます。
これは主に –out <ipaddress>:14550 で MAVProxy 起動コマンドに追加することで、ミッション プランナーを実行しているPC のアドレスを追加することができます。 Windows では、ipconfig を使用してその IP アドレスを判別できます。
mavproxy.py --master=/dev/ttyAMA0 --baudrate 57600 --out 192.168.1.41:14550 --aircraft MyCopter
Warningでmodemmanagerと矛盾していると出ても無視しています。(正しいかどうかわかりません)
Raspberry Piに繋いだフライトコントローラーとmission plannerをつなぐスクリプトです。(./connect)
outにターゲットのipアドレスを指定します。
(言い換えるとRapberry Piはテレメトリーの役になっている。)
mavproxy.py --master/dev/ttyAMA0 --baudrate 57600 --out 0.0.0.0:5760 --daemon
最後にdaemonパラメーターを入れておくと、sshを切っても動き続けます。
chmod +x connect
で実行権を与えておきます。
次はRaspberry piに繋いだLTE経由でMission Plannerと接続します。