ドローンクラウドサービス開発記録 〜Part 1 beta版完成〜
こんにちは。Tomofilesです。
2020年に入って、早いものでもうすぐ3週間が経とうとしています。
初詣に行ったときに、今まで買ったことがないのですが、初めて達磨を買ってみました。
物事の始まりと終わりを区切る意味で、もうすでに活動半ばですが、このタイミングで自分の今の活動を願いとして、目玉を入れました。
どこかに良い納まり所にたどり着けるといいですね。
さて、昨年の終わりに、ドローン系のクラウドサービスについて調査しました。
最近また、色々おもしろいプロダクト・サービスを発見してきていますが、それはまた別の機会に記事を書くことにして。
そろそろ私もクラウドサービス制作を始めたいということで、これまでの学習の集大成として、オリジナルサービスの開発を開始しました。
今回は、その紹介と技術的なトピックについて、まとめていきます。
なぜドローンとクラウドなのか
前回の調査結果を元に、時間があるときに色々考察しているのですが、ドローンを最大限に活用するには、やはりクラウドサービスの形式であるべきというのが、今の私の見解です。
ただ、クラウドであるべき理由という意味では、現在は特には持ち合わせていません。それよりも、私はクラウドコンピューティングを活用したドローンのイノベーションにかけてみたいというのが、私の狙いです。
現在のドローン運用は、地上基地局(GCS)とプロポに縛られており、ローカル活用が前提となっています。
かたや、世界中(日本も含め)のドローンクラウドサービスを見てみると、ドローンのインターネット接続と、全自動ドローン収納装置の組み合わせで、ドローン運用の全自動化が実現されています。
例えば、Flytbaseや、センシンロボティクスのプロダクトがそうです。
Software for Drone In A Box Solution
SENSYN DRONE HUB|株式会社センシンロボティクス
ドローンパイロットが必要とされるのは、ある時点までで、これからのBVLOS(日本の指標ではレベル4)のドローン活用の時代は、ドローンは全自動飛行となっていくでしょう。
ドローンが全自動になるということは、場所や環境に縛られないということです。つまり、どこでも活用できるドローンは、どこでもアクセス可能であるべきエンドポイントが必要となります。
そうなると、ドローンの運用と監視、制御はクラウド上で行われ、ドローン運用者は好きな場所からクラウドにアクセスして、ドローン運用をウェブベースで行うことになるでしょう。
そういうことから、私もこれらのベンチャー企業に賛同して、Internet of Drones(IoD)という思想を取り込むことにしました。
ドローンをクラウドに接続するノウハウを学ぶことで、これからのドローンソフトウェアエンジニアとしての活路を見出します。
集大成の確認
ということで、IoDですが、これまでの私のブログ上での実験と調査の数々は、IoDに結実させるべく舵切りしてきた結果です。
IoDという概念自体は前回の記事で初めて出てきましたが、もともと考えていたことは大方ズレていませんでした。
ということで、まずはそれら知識を確認していきましょう。
■元々持っている知識
- クラウドでサービスを作るということ
■この半年で習得した知識
- FCと連携してドローンを制御すること
- Cesiumの表現力を最大限に活かすこと
■世界中のドローンクラウドサービスから学んだ知識
- IoDの実現に挑戦すること
仕事上では一切触れることはなかったですが、クラウドサービスというのがどのように実現されているのか、現在のソフトウェアアーキテクチャがどういうものなのか、など技術的なトピックは日々吸収していました。
変更が頻繁に発生する、サービスを停止できない、柔軟にスケールさせたい、などのサービス提供型ソフトウェア開発の事情を知り、マイクロサービス、コンテナ、コンテナオーケストレーション、クラウドコンピューティング(マネージドサービスの組み合わせ、オートスケーリング、従量課金、インフラAPI)、継続的デリバリー、などなど、挙げたらきりがないですが、注目される理由などを自分なりに理解しながら、その解決策となる技術トピックを知るようにしました。
せっかく色々知ってるのに、実践する機会もなく、記憶の底に埋もれたままとなってしまっていて、我ながら残念でなりません。
ということで、この知識をベースに、この半年で学んだ知識を統合して、実際にドローン関連のクラウドサービスを制作することにしました。
なお、今色々書いてて気づきましたが、サービス提供型のエンジニアとして不足している知識があります。
- クラウドサービスの開発手法(アジャイル系開発、Gitを使用したチーム開発、ペアプロのような従来にはない開発、など)
- リリース方法(カナリアリリース、ブルーグリーンデプロイ、など)
- 運用方法(DevOps、SREのような、チームとしての取り組み、など)
こういうものを経験する環境って、やっぱりSIer系では難しいですよね。
あーもどかしい。やってみたい。
Skysignプロジェクト
ということで、始動しましたSkysignプロジェクト。
せっかくだから、それっぽい名前をつけたいと思って、色々考えました。名前をつけると、愛着とかわきますよね。
まぁ、名前は良いとして。
まず目指す姿は、以下のような特徴を備えたウェブサービスです。
- クラウド上にデプロイされたウェブベースのサービス
- ドローン上に搭載されたエッジコンピュータからクラウドに接続
- ウェブブラウザからドローンに各種アクション実行
- Cesiumを利用した3DマップベースのUI
プロダクトとしては、現状以下の2つになります。
- Skysign-Cloud(クラウド上のソフトウェア)
- Skysign-Edge(エッジ上のソフトウェア)
話は逸れますが、今回のサービスのロゴを作るにあたり、以下のウェブサービスを利用しました。
数クリックするだけで、ものすごいクオリティのロゴが作成できました。
便利な世の中になりましたね。
先にロゴができると、UIなどのカラーイメージが決まってくるので、開発しやすいですね。
アーキテクチャ
今回は、Google Cloud Platformのマネージドサービスをフル活用してみようということで、プロダクトは、Client、Cloud、Edgeの3つに分割して、クラウドにデプロイしました。(Edgeはドローン上ですが)
具体的には、各コンポーネントをそれぞれ以下のようにデプロイしています。
- Clientは、HTML、Javascript、CSSなどの静的ファイル(今回はフロントエンドフレームワークは未使用)はGoogle Cloud Storageへ
- Cloudは、Golangでコーディングして、ローカルでビルドしたシングルバイナリをGoogle Compute Engineへ
- Edgeは、Golangでコーディングして、ローカルでビルドしたシングルバイナリをRaspberry Piへ
デプロイされた各コンポーネントは、ロードバランサでパスの設定を行い、ストレージバケットと、バックエンドAPIとを振り分けるように設定しました。
静的コンテンツはCloud CDNを有効にして配信を行い、Cloud DNSでドメインの設定を行い、ロードバランサに証明書を登録してTLS/SSL化しています。
ドメインは、Google Domainsで購入しました。
(なお、今回はURLを公開しません。インターネットには公開されていますが、紹介できる状態ではないと判断したので。いずれ機会があれば・・・)
アーキテクチャ図にすると、以下のとおりです。
また話が逸れますが、上記図もウェブサービスを使用して作成しました。
もはやパワポなんていらないですね。
Flowchart Maker & Online Diagram Software
サービスの紹介
今回のプロダクトは、PoC(概念検証)フェーズということで、UIは最低限、というかかなり雑な作りとなっています。
コンセプトが試せればいい、というのが今回の目的・ゴールなので、それほどUIにこだわりがありません。
Skysign-Cloudにアクセスすると、以下の画面が表示されます。(以降、ローカル環境で起動したイメージを貼っていきます)
デフォルトで3Dマップが表示されます。
ここで、Skysign-Edgeを起動します。
Skysign-Edgeは、ラズパイ上でsystemdに登録されているので、ラズパイの電源を入れるだけで起動されます。
ラズパイ上の構成は、以下の記事で紹介したとおり、Mavsdk Backend ServerとMavlink Routerが、同じくsystemdで起動しています。
すべてUDPで接続しているので、起動順等は意識していない構成です。(もし実運用する際は、UDPでは信頼性が低くなりそうなので、要検討ですね)
tomofiles.hatenablog.com
なお、現時点でも例のu-boot起動失敗問題は解消していないので、「電源を入れただけで使用できる」は完全には実現できていないです。
Skysign-Edgeが有効になると、Skysign-Cloudの3Dマップ上に、ドローンの3Dモデルが表示されます。
エッジからクラウドに対して、0.5秒間隔でテレメトリーを配信しています。
ドローンをクリックすると、以下のようにテレメトリーの表示ができます。もちろん、0.5秒間隔で更新されます。
画面左のボタンが活性になっており、COMMANDのボタンブロックは各アクションをドローンに送信できます。
また、PLANNINGのボタンブロックは、ウェイポイントミッションを作成することができます。
MISSIONボタンはトグルボタンになっていて、押下すると色が変わります。
この状態でマップ上をダブルクリックすると、ウェイポイントを配置できます。
なお、現時点では、ウェイポイントの追加しかできず、ウェイポイントの削除、移動、高度の変更など、ミッションの作成に必要なアクションが実装されていません。
3Dマップ上の操作感は、以下のプロダクトを参考にしました。
www.sensyn-robotics.com
多分これもCesium使って実現していると思うんですけどね。以下のようなアドベントカレンダーの記事もありましたし。
qiita.com
ウェイポイントはクリックすると、詳細情報を確認できます。
平均海面高度(海抜高度)と対地高度も表示されているので、150m制限の確認もできますね。
MISSIONボタンをOFFにすると、ウェイポイント入力はできなくなります。
ミッションを作成したら、UPLOADボタンでドローンにミッションを転送できます。
転送成功したら、ARMボタン→STARTボタンと押下しましょう。ドローンがウェイポイントミッションの自動飛行を開始します。
ドローンがARM中は、飛行軌跡(トラジェクトリー)が表示されます。どんなルートを飛行しているか、確認できますね。
飛行を終了するには、LANDボタンやRETURNボタンで地上に帰還させます。最後にDISARMボタンを押下して、制御状態を解除してください。
RETURNボタンでホームに帰還したイメージは、以下の通りです。
CLEARボタンを押下すると、ミッションとトラジェクトリーの削除ができます。
なお、Skysign-Edgeを複数用意すると、以下のように複数のドローンの監視と制御ができます。
現在は実装されていませんが、サービスとしては以下の機能が提供できればと考えています。
- ユーザー管理
- ミッションをクラウドに保存・共有
- ミッションにジオフェンス機能の追加(SIHが未対応だから迷う)
- フライトログを解析してCesiumでシミュレーション
- ドローンのカメラ映像をリアルタイム表示
ここまでできれば、フライトログやカメラ映像とAIをコラボレーションして、付加価値を作り出せますね。
正直やるかどうか迷ってますが。そもそもCloud SQLの料金が高いんですよね。機械学習系のマネージドサービスも展開されてますが、真面目に使っていったら財布がヤバそうです。
まとめ
例のごとく、動画を取ってみました。
これまでのmavsdk_cesiumのリポジトリの資産を活用して、ミッション機能を追加しただけのようなものですが、Edgeとの役割分担なども真面目に考えて、全体を構成し直してます。
今回、素のWebsocketを使ってドローンと接続してますが、色々問題点は発覚してきてます。(例えば、切断時の再接続が必要、など)それに、MQTTを使っても良かったかなとも考えていて、その辺の改善も追々やっていけたらなと思います。
本当はサービス公開したいんですけどね。ユーザー管理が無いから、すべての人がすべてのドローンにアクセスできてしまうっていう問題と、あと一番大きいのが3Dモデルの二次配布になってしまうのが、解決できてません。(ネットで購入したものなので、ライセンスの縛りがあります)
これ、解決できるのかな…?
まぁ、色々考えてみます。
それでは。
◆Next Part
tomofiles.hatenablog.com