[インターン生レポート]「AR.Drone 自律動作システム」の作成(iPhoneアプリ) ~後篇~

こんにちは、技術インターンシップ担当です。

前回のblogでは、「AR.Drone 自律動作システム」の作成(iPhoneアプリ) ~前篇~をお届けしました。

今回の後篇では、実際に作成してくれたシステムや、インターンシップを通じて学んだこと等について
ご紹介したいと思います。

—————————————————————————————————-

■期間:2012年9月12日~28日(12日間 ※休日除く)
■部署:開発制作本部

[作成したシステム]

今回のインターンシップで、前篇の提案手法のうちPCからAR.Droneへ制御信号を送るプログラム以外のほとんどの部分を作成することができました。以下にそれぞれの作成したシステムを記述します。

■ PC

Java言語を利用し、下図のようなAR.Droneから取得したデータをサーバに送信できるようにしました。手持ちのiPhoneからAR.Droneに写し出された画像も閲覧できるようにしたかったため、マルチパート方式で、全ての情報を送信しました。

 

 

■サーバ

受信した情報を格納するためのデータベース、AR.Droneを制御するためのプロトコルを作成しました。作成したテーブルを以下に示します。

※上記のテーブルの役割について、以下に示します。

・FlightSession・・・AR.Droneのスタート地点とゴール地点のデータを格納する。

・ARDroneData・・・ AR.Droneから取得したデータを格納する。

・ARDroneImageData・・・AR.Droneから取得した画像データを格納する。

・HandOperatedData・・・手持ちのiPhoneからの制御データを格納する。

・SmartPhoneData・・・AR.Droneに乗せるiPhoneから取得できる情報を格納する。

続いて、制御用のHTTP通信に関するシステムの説明です。
AR.Droneを制御するため、Webサーバにデータ送信のアクセスがあった場合、それらのデータからAR.Droneに行なわせるための制御情報の2バイト列データを生成し、ローカルソケット通信を用いてそのデータをPCに送信します。2バイトは16ビットですので、計16個のフラグをPCに受け渡すことができます。
フラグの規定は以下の通りです。

0 1 2 3 4 5 6 7
制御方法 緊急着陸 下降 上昇 右旋回
8 9 10 11 12 13 14 15
左旋回 停止 右進行 左進行 後退 前進 離陸 着陸

※基本的には値が1の場合、当該フラグに関する制御を行ないますが、0ビット目の制御方法のみ、「0」の場合自動制御、「1」の場合手動制御が行なわれているという情報を持ちます。

■自動制御用iPhone画面

下の大きなボタンを押すと、センサ情報の取得を開始し、一定時間ごとにデータをサーバに送信し続けます。ここでは、実験段階のAR.Droneに何かあった時に、いつでもセンサー情報をストップできるようにボタンのサイズを大きくしました。

■手動制御用iPhone画面

画面を開くと、自分の現在地には赤いピンが自動的に表示されます。またAR.Droneを飛ばしたい目的地の点には、緑のピンを設定することができます。まだ実装できていませんが、AR.Droneの現在地を読み込んだ際、その値に関するデータを紫色のピンで表示させる予定です。

右上の「ARDroneData」ボタンをタップすることでAR.Droneから送信された最新のデータが一定時間毎に読み込まれ、表示されます。

ナビゲーションバー上の手動制御画面と書かれた部分をタップしながら下にスライドすることで、AR.Droneを手動制御するための画面が出現します。離陸・着陸は同一のボタンで制御し、停止、緊急停止ボタンはそれぞれの動作を行ないます。上下左右のボタンに関しては、iPhoneの傾きによって送信される情報が異なります。下記に、操作方法を表記します。

※iPhoneを水平方向に傾けた場合

・上:前方に進む

・下:後方に進む

・左:左方向に進む

・右:右方向に進む

※iPhoneを垂直に傾けた場合

・上:上昇

・下:下降

・左:左旋回

・右:右旋回

[動作の検証]

AR.Droneと接続しているPCの動作、サーバのデータベース、サーバとPC間のローカルソケット通信、iPhoneからの制御など、すべての動作確認を行なうことができました。

しかし、今回インターンシップ期間ぎりぎりまで作成に時間がかかってしまったため、実際にAR.Droneを飛ばしての動作確認を行なうことができませんでした。今後は、実際に飛行させての動作実験を行ない、自律動作のプログラムを組んでいこうと思います。

[学んだこと]

学生時代から、ほとんど独学でのプログラミングを行なっていたため、数えきれないほどの技術や考え方、ツールの利用方法を学びました。その中でも大変印象的だったことを3つ挙げます。

■ SQL文でデータベースを利用するときは、SQLインジェクションに注意すること。

  • SQLインジェクションとは、アプリケーションのセキュリティ上の不備を意図的に利用し、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のことです。この脆弱性を克服するため、MySQLなどのデータベースをPHPなどのサーバサイドから利用する際はSQL上で意味を持つ文字列をエスケープするなどの対策をしなければなりません。私は、そのような知識を一切持っていなかったため、今までずっと危険なプログラムを作成していました。このことを教えて頂き、本当に勉強になりました。

■ネットワークのアクセスエラーなどのデバッグにはWiresharkを利用する。

  • Wiresharkとは、どのようなIPアドレスとどのような通信を行なっているかをトラッキングできる無料のネットワーク・アナライザ・ソフトです。サーバーサイドプログラム本体は正常に動くが、通信が原因で正常に動作しないというような時に、このツールを利用します。例えば本システムを作成する際、AR.Droneから取得したセンサ情報と画像データをマルチパート方式でサーバへ送ろうとした時に、思い通りにPOSTできないといった問題がありました。このときこのツールを利用し、どのようなPOSTが行なわれているのかについて生データを見ることで、すぐに原因を解明することができ、適切なエラー処理を行なうことができました。今までの私でしたら、原因もわからぬまま、ただがむしゃらにコードを改変することしかできなかったと思います。

■謎のエラーはブレイクポイントを仕込み、デバッグ処理を行なうこと。

  • このデバッグ処理に関しては当たり前のことかもしれませんが、前述の通り、私はずっと独学でプログラミングを行なっていたため、一番得意なiPhoneアプリ開発でさえもきちんとしたデバッグ方法を知りませんでした。このことが原因で、今回おそらく1人では適切な解決ができなかった場面に遭遇しました。私はiPhoneで取得したデータをサーバサイドに送信する際、それらのデータを保持したデータクラスを引数とすれば、どんなデータも適切なアドレスに送信できるメソッドを作成しました。プログラム自体は、正常に動作していましたが、このメソッドを利用した時、float型とdouble型のデータが0となってしまいました。送る直前までは、しっかりとデータが保持されているにも関わらず、送る段階ではデータを損失してしまっていたため、まったく状況が分かりませんでした。メンターの方に助言を頂き、デバッグ処理の方法を教えて頂きました。すると、エラーの原因がすぐに浮かび上がってきました。原因は、プリミティブ型とオブジェクトの違いにありました。引数として渡したデータクラスのプロパティの値はfloatやdoubleのプリミティブ型であったのに対し、メソッドでは、どのようなデータクラスにも対応させるために、オブジェクトとしてプロパティのデータを取得し、送信を行なっていました。プリミティブ型とオブジェクト型の変換はその間では行なえなかったため、今回のようなエラーが発生してしまいました。このエラーの解決方法として、プロパティの値を全てオブジェクトでラップするというアドバイスを頂き、floatやdoubleを全てNSNumberと呼ばれるオブジェクトに変換したところ、正常に動作するようになりました。もし1人で解決していたら、おそらく無理矢理文字列に変換してデータを送信することになっていたと思います。

この他にも、この2週間の間で全く自分の知らなかったいろいろな小技や考え方、技術のポイントを学ぶことができました。

[もっと時間があれば学びたかったこと]

今回、主に技術的な面で四苦八苦していて、それらの問題解決を最優先していたため、それ以外のことをほとんど学ぶことができませんでした。もし、もっと時間があったならば、プログラミングのMVCなどのモデル設計の考え方や、エンジニアさんとデザイナーさん、プランナーさんの現場でのやりとりなどをご教示頂きたかったです。また、ひとつのプロジェクトに体験参加させて頂き、プロジェクトを動かすのに大変なことや楽しいことを、身を持って体験してみたかったです。

しかし、今回1つのシステムを作成していく過程の中で、数多くの改善ポイントをご指導頂けました。2週間という短い期間でしたが、自分の知らなかった世界がものすごいスピードで広がっていくことを実感できました。

[インターンシップに参加した感想]

KLabでの技術系インターンシップは、他の企業とは違い職場体験をして働くということに対する意識を強めるのではなく、一つのテーマを掲げ、それを実現する過程で技術面のアドバイスを頂きながら、職場の環境も肌で感じることができるという変わったフローがとても印象的であり、魅力的でした。また、掲げたテーマのジャンルに対して、非常に優秀なメンターの方にご指導頂けたので、私1人ではやり遂げることが困難だったことや、自分では決して生み出せなかったアイディアをアウトプットすることができました。また、アドバイスは頂いたものの、手を動かし実際にシステムを創造していくことを全て私自身が行うことにより、2週間前よりも遥かに、そして何よりも確かな技術力を身につけることができ、自己の成長に繋がったと感じています。

この場を借りて改めて御礼申し上げます。

本当にありがとうございました。

—————————————————————————————————-

現在KLabでは、技術に興味のある学生さんを、随時インターン生として受け入れています。
インターン期間中は、技術レベルアップの為に、個々で設定した企画・課題に対して
弊社メンターのサポートを受けながら取り組んでいきます。

技術インターンに興味を持たれた方は
是非、技術系インターンシップ応募ページ からご応募下さい。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中