先日、弊社内では“ドローン制御コンテスト”なるものが行われました。

若手エンジニアのスキル向上を目的として行われたこのイベントは、
自作の制御ソフトで市販のトイドローンをいかにうまく操れるかを競うもので、
設計はもちろん、言語や組み方すら自由、というものでした。

なかにはAIまで搭載してしまったチームも!

と、いうわけで、とある出場チームリーダー視点の開発記をお送りいたします。
全国10万人弱(小職調べ)のドローン制御コンテストファンのみなさま、たいへんお待たせ致しました。

なんと今回は、参加したエンジニアが直接この記事を書いております。
いつものハートランド・ザ・ワールドとはかなり違うテイストですが、
弊社エンジニアの人となりをイメージしつつ、お楽しみいただければ幸いです!

 

プロローグ

ある技術について、知っていることと、使えること ーーその間に大きな差があることは、我々技術に携わる者であれば骨身にしみて感じていることでしょう。
「学(まな)びて思(おも)わざれば則(すなわ)ち罔(くら)し」
教わるばかりではなく、自分で手を動かし、考えてみること。それが何よりも成長の糧となります。

しかし、しかしながら、
週5で働いた疲れがたったの2日で癒されるのだろうか、という急速な情報化社会。
その進化の代償の議論が始まったことは既にそう昔のことでは無いように思います。

新しいこととは、往々にして今の業務とは直接関係がないことが多いものです。
そういったことを学び、試す時間をいかにして捻出するかは興味深いテーマですが、
この話題、いかんせんシラフで語り始めるには大きな闇を感じるところですので、断腸の思いでカットいたします。

それはさておき、そのような学びの機会が会社から提供されることは、僥倖と言えるのではないでしょうか。

去る 4月15日、築1年半となるハートランド・データ ソフトウェアデザインセンターの1F 食堂 コンベンションホールには
4機のトイドローン「tello」が並びました。
そのそばでイソイソとなにか作業している彼らには「今日はよく晴れましたね、調子はどうですか?」などという挨拶はとても遠く聞こえます。
乾いた唇を固く結び、首を縦に振る彼らにとって、この明るさは天敵--

さもありなん。ここはドローン障害物競走、その本番会場。

カメラで障害物を認識して通過し、ゴールポイントへ着地せよ

そのミッションが4つのチームに告げられたのは、遡ること3か月前のことでした。

 

説明会

IoT初心者、ドローン初心者、さらにPython初心者、20代から40代まで幅広い年齢層が集まったデザインセンターの一角は、
心なしかダイバーシティの様相を呈しているように見えます。

障害物を潜り抜けられるのか。
いや、そもそもゴールできるのか。

ルールをシンプルに表すと、次の2点のスコアを競うことになります。
・ プレゼンテーションスコア
・ 障害のクリアスコア
細かいルールはもっとたくさんありましたが、ここで紙面を割くには見るデジタル睡眠導入剤としての効果が高く、
本稿から有益な情報を得て、将来の日本を支えんとする皆様の時間を奪うのは心が痛い痛い…なので断腸の思いでカットです。

さて、ここからは、その中のひとつのチームにフォーカスして、活動を追っていきたいと思います。

余談ですが、エンターテイメントがあふれる昨今において、物語というものを読みなれた方々は、
この時点で優勝チームを予測することは造作もないことでしょう。
しかし僕は違っていました。
だって優勝チームへのご褒美のひとつが「ブログを書く権利(辞退不可)」だなんて思ってなかったんだもん。

 

プロジェクト計画

「思ったより難しそうに思います」

話題の中心になっている”パイソン”について、
少なくとも神話の登場人物ではないことくらいを理解している初心者が集まったこのチーム。
早速ですが不安がちらちらと頭を出しています。

さあ改めてコースを見てみましょう。

障害物は色のついたポールに、QRコードが張られています。コースのレイアウトは本番までわかりません。
これはつまり、
・ドローンのカメラで撮影した映像から
・何らかの方法で物体認識、あるいはQRコード読み取りを行い
・障害物の種類を判別し
・相対姿勢から向かうべきいい感じのベクトルを決め
・いい感じに姿勢制御する
必要があります。

なぁんだカンタンな要求定義じゃぁないか。じゃ、あとお願い?エンジニアならこれくらいできるでしょ?

チームメンバーは口を開きません。集まったメンバーは本当に駆け出しエンジニアばかりのチームなのである。
ピヨピヨな彼らは突如として立ちはだかった壁に文字通り絶句しつつも、
しかし、なけなしの気合をふり絞り、その大きな壁に拳を突きつけます。
長い時間をかけつつも、エンジニアリングの基本のひとつを、彼らは思い出しました。

分からないことがあれば、仮説を立て、調べ、動かし、証明し、そして応用するのです。

新人研修でプログラミングと共に叩き込まれた設計奥義、ワーク=ブレイクダウン=ストラクチャを展開し、
次のようなタスクをはじめとする20ほどのリサーチタスクを列挙しました。
・ ドローンの姿勢を制御できるようにする
・ 特定の色のポールを画像認識できるようにする
・ QRコードを画像認識し、内容を読み取れるようにする
・ 相対姿勢を計算できるようにする

さらに強引にでも、マイルストーンを決めてしまいます。
・ α … 調査タスクの終了目標。また、調査結果をもとにした戦略とアーキテクチャの試験実装開始。
・ β … 試験実装終了。向き直りを実施して本番に向けた戦略を決定し、実装

この計画、いささか乱暴でしょうか?

新人エンジニアの多くは、まずはテスターとしてプロダクトを触りながら自分たちのチームは何を作るのか覚え、
次に先輩から仕様をもらいコーディング、そして経験を重ねるにつれて自ら設計を行えるようになったころにはさらに上流の工程が求められます。
いわゆる要求定義、及び見積。
ここまでたどり着いてこそ、一人前のエンジニアと認められるでしょう。

自分たちが無知であることを認め、何がわからないのかを言語化し、
正しいものを正しく作るのではなく、何が正しいのかを探すこの活動。
あなたもまた、胃がきゅっとなる重たい何かを抱えて仕事をしているかもしれません。
しかしこれこそ真のエンジニアリングに求められる尊き精神労働。
0 を 1 にする活動です。

たしかに面倒だけど、AIに任せられるのはまだちょっと先かなぁ…。

 

窮猿のαマイルストーン

Python は今となっては大きなコミュニティを持ち、人気も上位をキープし続ける重要なプログラミング言語です。
しかしその歴史は
水と油、ヒラメとカレイ、メロンとメロンパン、
…つまりなんか似てるけどなんか違う 2.x 系と 3.x 系という深い溝があります。

知らず知らずのうちにハマりこんだ初心者は、
気づいたら大蛇の腹の中でしたみたいな落とし穴です。恐ろしい。

さて今回のターゲットであるところのトイドローン Tello は、GitHub にサンプルが公開されています。

https://github.com/dji-sdk/Tello-Python
README 先頭の気になる python2.7 の文字が気になるところですが、
3.x 系へ直すことになっても、まぁ小規模なサンプルプログラムですしきっと大丈夫でしょう。

ところで 2.x 系は既に開発が終了しており、2.7.18 が最終バージョンとなります。
https://www.python.org/downloads/release/python-2718/

Python 2.7.18 is the last release of Python 2.

人生の宿題を終えて悠々自適にご隠居する壮年の貫録を感じます。
お疲れさまでございました。

ところで、事件は唐突に起こるものです。

え?C++で実装されているビデオデコーダが Python 3.x 系で使えないって?

Tello のサンプルリポジトリにはもちろん空撮のサンプルが含まれており、
その根幹となる h264decoder が使えません。

調査を進めたところ、 Linux 上で 3.x 系用に再ビルドすることはできたようなのですが、
できれば Windows で使いたいところです。

というのもメンバーのほとんどがピヨピヨさんであるこのチーム、
今から Linux を学び始めることはあまりにも負担が多く、
メンバーのモチベをクラッシュしたうえ早期リタイア…なんてことも他人事ではないのです。

ついでにC++という、素晴らしい実行速度で気づいたら我々のリソースごと光の彼方へ連れて行ってくれる黒魔術言語もまた、
今このときハマり込むのは避けたいものです。
でも僕は大好きだよ。

さて、我々は、相互確証破壊における先制攻撃を決意した大統領のような心持ちで決断しなければなりませんでした。

「しゃーない2 系で行くかぁー」

ところでPythonの実行環境はいろいろありますが、開発終了している2系を動かすのは、
ある種の「裏技」使ったり、できたとしてもパッケージマネージャがうまく動かなかったりしたので、
本当にもうこれっきりにしたいと強く強く思いました。
ちなみに何とか使えたのは Anaconda さんです。

結局こんな事件がありましたので、
調査フェーズは姿勢制御とビデオ撮影、そして色をベースとした物体検出までにとどまりました。
一応、最低限の材料は用意できたかな?

 

焦燥の中間発表

各チームの進捗確認及び、それに合わせて障害物の最終仕様を決定するために、
ゴールポイントのみがあるコースの試走会が開かれました。

机上で設計及びデバッグすることは簡単ですが、
やはり物理世界、特に本番に近い環境でテストを積むという行為は、
我々の仮説は間違っていなかったのだと、安心と自信を与えてくれるものです。

もちろんそれは仮説に基づいて動くものが出来上がっていることが前提でありましょう。

しかし、αで事故っちゃって画像認識まで実装することができず、
指さし呼称の確認で「ヨシ!」とか言われたい、
あるいは失敗を極端に恐れる心理から抜け出そう、抜け出そう、
と努力を続けるピヨピヨの我々は、
ゴールできないことへの極度の恐怖から、
・人間を使ってゴールまでの距離を目測し
・フライトの直前にコードを修正して
なにごともなくゴールしようという暴挙作戦
に出ました。

周りからは 「AI で画像認識を搭載!」などといった、なんかキラキラしたワードがドローンとともに飛んできます。
無難にゴールする他のチームを見て、我々は自分たちがしていることの意義を問うのでした。

ヒトの物理的な欲望の多くが満たされつつある現代社会では昨今、
承認欲求とかそんな感じのことをはじめとした精神的な欲望、
すなわち「幸せ」への関心が高まりつつありますが、
それはともかく自分が自分自身を認めてあげられないのは何と言われようとツライことであります。

おお ゆうしゃ ぴよぴよ よ! めが しんでしまうとは なさけない!

いいんだ、いいんだよ、なるようになるさ。

…で、普通にゴールしました。
「ヨシ!」ってなって拍手とかありました。
でもドラマも何もありません。ごめんね。

 

背水のβマイルストーン

商売繁盛。
嬉しい悲鳴。

仕事が回っているというのは、負担がありつつも一定の安心感があります。
しかし中間発表を終え本番に向かって走り出そうという今、
花の便りが聞かれるこの頃は、なんとなく受託開発の納品時期が重なる、それは気のせいでしょうか?

「ごめんなさい!本業務が忙しくて!」

やむを得ない事情というものもあるでしょう。
ここは「あなたを必要とする人のそばに居てあげなさい」的な超クールな言葉で器の大きさをアピールしたいところですが、
そんな下心は不思議と見透かされてしまうものです。
仕事術の本にありがちな「まずは報告ありがとう」みたいな感謝の言葉から始めましょう。

とはいえリソースが少なくなればスコープは縮めざるを得ません。
しかし皆、最後に渡したタスクはきっちりと仕上げてくれました。

立つ鳥跡を濁さず。
責任を果たし片手を挙げ去っていく後ろ姿には
「お前・・・消えるのか?」
と心の中で声を掛けずにはいられません。

そうして、まるで世界そのものが尻すぼみの終局に近づいているような感覚を覚えつつも、
果たして完成したものは本当に最低限の機能、
「途中の障害物は無視してゴールを確実に認識し、着地する」
でした。

ゴールを唯一無二の目標とした超特化型、一点突破。
現実世界にはびこる誤差を吸収するなんかすごいらしいアルゴリズムをひっさげて、
ゴールに確実に喰らいつく一途なドローンが1機、
ここに完成しました。

 

アーキテクチャ

📻「著者は『難しそうな図を載せておけば技術ブログって言い張れる』などと供述をしており、動機の解明を急ぐ方針です。」

ソフトウェアブロック図

下記の図中の App の部分が今回開発したプログラムとなります。
当初から規模が大きくなることが予想されましたので、
早めにモジュールの分割を行い、コード全体を少しでも見通し易くしました。

アーキテクチャ図

各モジュールを流れるデータは必ず1方向になるように意識しました。
これにより通信や状態遷移の量を抑えることができ、問題が発生した時も迅速に対応することができました。

 

本番

終幕-- ゴールテープを切りふわりと着陸したドローンは、バッテリーが徐々に冷えていく中で、自分の使命の終わりを、
カラス色に輝くボディへと届く観客の喝采を聞きながら感じていました。

「マジかよ‥!! しんじらんねェ‥!!」
「あのAIを積んだドローンが負けるなんて…!」
「『チームB』、いったい ナニモノなんだ‥!?」
「若手ばっかりのチームだろ?最後の最後までベテランの後ろにぴったり付いてたぜ…」
「機転だ… AI には予測しきれなかったアクシデントだ…!」


さて改めまして、3か月の時を経て計4チームが、ここにそろいました。

さあ、始めましょう。

プレゼンテーション

最初に観客の熱い視線が注がれるのはドローン…ではなくスクリーンです。

特別なイベントだというのに淡々と業務報告のように活動結果を述べるチームから、
昨今需要が急上昇している動画編集技術に磨きをかけネタに走り会場を沸かせるチームまで、
多種多様なプレゼンが会場を盛り上げます。

みなさんエンターテイナーの才を感じますが、
そこに力を入れる時間をドローン改修に割けばまた違った結果もあったのでは?と言うのは野暮でしょう。

しかしながら身内ネタも多く含むプレゼンをこのようなブログという形で外部に公開するのは
弊社ハートランド・データの正気を疑われかねないので断腸の思いでカットです。
僕の心がたくさん切った腸の分だけ強くなることを願います。
※公開できそうな情報は前項「アーキテクチャ」を参照せよ。

障害物競走

全3ラウンド。
スタートからゴールまで、通過できた障害物ごとのスコアを合計して勝敗を決するこのレース。

マルとバツのちょっと間の抜けたフラッグを両手に携えた審判を見据え、
エンターキーを強く叩く例の音と主に、
今、ドローンたちは飛び立ちます。

AI積んでいるらしい有望株から、高空を飛んで障害物から逃げようとする変化球まで、
多種多様な夢を乗せたパフォーマンスは、観客の目を惹きつけて離しません。

ところで、
なぜかプレゼンの本番に限ってパワポが「動作を停止しました」みたいなへそ曲がりなることは、
何故か誰しも心当たりがあることではないでしょうか。
アクシデントという獣は常に最高のタイミングを狙って身を潜めているものです。

さてどうしたことでしょう!
いざ発進となったドローンたち。
しかしあるドローンは同じ障害物の周りをくるくる、
またあるドローンは場外を連発、
そもそも離陸すらできないドローンもいるなど、
練習ではばっちりゴールを決めてきたはずなのにことごとくゴールを外し、
カオスと表現するしかないような様相を呈していました。

「電波状況が・・・悪い?」

待機スペースのバックにザワ・・・ザワ・・・という擬音語文字列が流れるこの会場、
おそらく練習ではほとんど存在しなかったモノの圧力を感じます。

現代社会人のポケットにほぼ必ず入っている高機能携帯電話的なアレが大量に存在していることが原因だったのかもしれません。
しかし、レースを止めることはできません。
そげな殺生なこと…と嘆く暇はないのです。

時間ギリギリまであきらめずに、
ストレスで膨れ上がった脳を叩きつけて思いついた最後のアイデアは、
単純に通信距離を詰めること。

対策を思いついたチームがドローンと並走する様子は、さながら幼稚園の親子障害物競走を彷彿とさせたと、
後に観客の一人は語ります。

 

エピローグ

かくして、栃木県足利市の片隅で開かれた小さなコンテストは幕を閉じました。

映像を用いたドローンの自動操縦。
その目標へ向かって、基礎の基礎ではありますが、単に「知っている」から「使える」にレベルアップできたのではないでしょうか。
しかしいざ手を動かしてたくさんの壁にぶつかった今回の活動で得られたものは、決して技術だけでは無かったと思います。

今回フォーカスしたチーム、
ピヨピヨメンバーばかりであった彼らの旗の名前は「たまご電機」。

0を1にできる力を身に着けた彼らが、今後どのようなものを作り出していくのか。
とても楽しみです。

 

まとめ

俺たちのドローン制御はこれからだ!
寝るぞー------っ!!!!

最後までお読みくださいまして、まことにありがとうございました。
弊社開発部の次回作にご期待ください!

編集後記
祝勝会で浮かれたチームリーダーを捕まえて執筆をお願いさせていただいたのですが、
「それって景品なの!?」と仰ったときのお顔、最高に優勝しておりました。

【大好評配信中!】動的テストの事例紹介ウェビナー

組込み機器開発特有のソフトウェアデバッグ、テストにお困りではありませんか?
初期化処理や処理時間、複数CPUのシーケンス処理など、どのようにテストしていますか?
複数の機器で構成されたシステムでは、
「機器同士のやりとりを把握することができない」
「デバッガを使ってブレークをかけることができない」
といった問題にぶつかり、ソフトウェア内部の動きを把握することは困難です。
そこで今回は、動的テストツールDT+ユーザー様を講師にお迎えし、
このような課題に対する活用事例をご紹介させていただきます。

ご視聴はこちら!