2020/10/19

[Dronecode]PX4でHello Sky

px4dronecode

概要

最近Droneを自作するプロジェクトに興味を持ち、空き時間を使って入門してみました。

基本的にはDronecodeというオープンソースのプロジェクトを流用させていただき、開発していこうと考えています。

既製品のDroneを使ってサービスを展開する場合にはDJI製品を使うのが良さそうなのですが
Drone自体の自作となると、オープンソースのものをうまく組合せて作るのが良さそうです。

今回は、DronecodeのコアであるPX4というプロジェクトのtutorialを実際にやって理解を深めてみました。
PX4はフライトコントローラーというDroneの自動飛行を制御するためのもののようです。

スマホアプリやラジコンのコントローラーなどからの指令(信号)を受信し、それを解釈してプロペラの制御を行ったりする部分のようです。
(まだ入門して日が浅いので間違ったことを行っているかもしれません🙇‍♂️)

DronecodeにはフライトコントローラーであるPX4の他に QGroundControlMAVLINKと呼ばれるプロジェクトがあります。

  • QGroundControlは “Cross-platform ground control station” つまり地上(管制塔)からの指令プログラムを作るためのプラットフォームみたいです。
  • MAVLINKは “Micro Air Vehicle Message Marshalling Library” つまりコントローラー〜Drone間の通信手段を定義しているライブラリのようです

MAVLINKをわざわざ定義している理由は、以下のようなものだと想像されます

  • Droneに載せれるコンピューティングリソースには限りがある(重量とか電圧とか)ためメモリが少ない環境でも動作できる
  • Droneと通信できる通信帯域幅が限られている(ハードウェア的にも法律的にも)

今回はあまり深く考えず、Hello Sky - PX4 Autopilotにある記事に従って
チュートリアルをやってみたので、それの作業メモになります。

実施事項

Ubuntuマシンの準備

UbuntuのLiveUSBを作成しました。
こちらで作ったUSBを使って、もうほとんど起動することがなくなった、お古のPCにインストールしてUbuntuのマシーンを準備しました。
(機械学習などにも使えるUbuntu用の自作PCを構築準備していて、そちらが出来次第、そちらでも環境構築しようと思っています。)

Toolchainのインストール

以下を参考にしつつ、PX4で使うツール群のインストールを行いました。

gitをインストールします

$ sudo apt-get upgrade -y
$ sudo apt-get update -y
$ sudo apt-get install -y git

PX4/Firmwareのsetupスクリプトを実行します

$ git clone https://github.com/PX4/Firmware.git --recursive
$ cd Firmware
$ bash ./Tools/setup/ubuntu.sh
$ sudo reboot now

jmavsimの起動

$ cd Firmware # Firmwareのプロジェクトルートディレクトリ
$ make px4_sitl jmavsim
pxh> commander takeoff # シミュレーター上で離陸するのが確認できました
pxh> commander land # シミュレーター上で着陸するのが確認できました

↓こんな感じのGUIが起動します

jmavsim-min.png

gazeboの起動

$ cd Firmware # Firmwareのプロジェクトルートディレクトリ
$ make px4_sitl gazebo
pxh> commander takeoff # シミュレーター上で離陸するのが確認できました
pxh> commander land # シミュレーター上で着陸するのが確認できました

Pythonコードの記述

MAVSDK-Pythonのインストール

$ pip3 install --user mavsdk
$ pip3 install --user aioconsole # light wightなinteractive shellであるaioconsoleもついでにインストール

protobufのインストール

古いバージョンを使っていると、後述のfrom mavsdk import System の箇所でエラーになったので新しいものをインストールする必要がありました。

$ pip3 install --upgrade protobuf
$ pip3 show protobuf
Name: protobuf
Version: 3.13.0
..(省略)..

Python Script

事前にmake px4_sitl jmavsim のコマンドを使って、裏でjava baseのシミュレーターを起動しておきます。

apython でinteractive shellを起動して以下を実行しました。

from mavsdk import System
drone = System()
await drone.connect()
await drone.action.arm()
await drone.action.takeoff() # armした後、すぐにこのコマンドを送らないと Disarmed by auto preflight disarming とログが出て制御できなくなってうようなので注意
await drone.action.land()

ログの確認

$ cd Firmware # Firmwareのプロジェクトルートディレクトリ
$ find . -name *.ulg
./build/px4_sitl_default/tmp/rootfs/log/20-10-19/12_48_13.ulg
$ ulog_info ./build/px4_sitl_default/tmp/rootfs/log/20-10-19/12_48_13.ulg
Logging start time: 0:02:46, duration: 0:00:26
No Dropouts
SW Version: v1.11.0 (RC)
Info Messages:
 sys_name: PX4
 sys_os_name: Linux
 sys_os_ver_release: 84148479
..(以下省略)..

所感

Simulationに関しては、以下のような感じのフローで実施できました。

  • PX4のsimulatorを起動する(今回はjmavsim)
  • MAVSDKを使って、droneにコマンドを送信して制御する
  • simulatorのログを使って、飛行状況を解析する

例えば、自作のドローンを作って、特殊な部品をつけてシミュレーションしたい場合
以下のような感じになるんでしょうか・・・イバラの道ですかね・・

  1. Firmwareをアタッチしたいハードウェア用に修正する
  2. simulatorで使えるようにする
  3. MAVLINK/MAVSDKのメッセージで制御できるようにする
  4. 適切にログを出力し、出力されたログデータを解析して意図通りに動作しているかチェックする

特にNo.1と2が大変そうですね。。。😱

次のstepとしては、

  • Devkitsを買ってみて、実際に動かしてみる
  • 細かく、シミュレーションするやり方を学習する(ROSベースのものが良さそう?)

こんなところでしょうか。
ちょっと学習コスト高そうですが、ゆっくりで良いので、ちょっとずつ進めていこうと思います。

以上です。