ETSIITテクニカルチャレンジ|大学生から起業家まで
1年前、私たちはIV ETSIITテクニカルチャレンジ(ビデオ)の作業を開始しました。私たちは誰ですか?さて、私たちはスペインのグラナダ大学で電気工学とコンピュータサイエンスを勉強している4人の学生です。
私たちのチームであるPrometheusは、RTIが主催するTechChallengeで優勝しました。この課題では、4〜5人の学生のチームが、外部企業によって提案された課題を解決するための製品を作成する必要がありました。今年のチャレンジのテーマは「マルチエージェントビデオ分散システム」でした。
私たちは実際の経験のためにこのチャレンジに参加しました。 Tech Challengeの1年後、私たちはまだ学生ですが、ビジネスチャンスを調査し、競争力のある製品Locaviewerを設計し、市場で販売する戦略を開発し、必要なコース作業に加えて実用的なプロトタイプを作成しました。私たちの学位。
Locaviewer
保育園に子供を持つほとんどの親は、子供の健康と進歩について心配しています。当社の製品であるLocaviewerは、親が子供をリアルタイムで追跡および確認できるようにすることを目的としています。マーケティング計画の一環として、プロモーションビデオを作成しました。私たちのコードはGitHubのMITライセンスの下でリリースされました。
チームの編成とスケジュール
プロジェクトの完了には約250時間かかりました。プロジェクトに週20時間費やした先月を除いて、毎週少なくとも4時間会いました。より効率的にするために、2つのチームに分けました。 2人が屋内Bluetoothロケーションアルゴリズムに取り組みました。他の2つは、ビデオストリームをキャプチャ、エンコード/デコードし、RTI ConnextDDSを使用して共有するアプリケーションに焦点を当てました。
ロケーションアルゴリズム
私たちのソリューションの最初で最も重要なステップは、保育園内の子供たちの場所を特定することでした。各子供は、部屋の壁に配置されたBluetoothデバイス-ドングル-を受信した信号電力を継続的に報告するBluetoothデバイス-センサー-を備えたリストバンドを着用する必要がありました。この受信信号強度表示(RSSI)値は、通常、デシベル(dB)で測定されます。 RSSIと距離の関係を決定しました。
RSSI値がミニコンピューター(RaspberryPiまたはMK802III)に送信され、三角測量アルゴリズムが実行され、子供の位置が特定されました。カメラの位置がわかっていたので、子供の位置を特定した後、どのカメラが子供を録画しているかを知り、最適なカメラを選択しました。
ビデオ録画アプリケーション
ビデオの録画、エンコード、デコード、視覚化には、GStreamer forJavaを使用しました。 vlcjなどの他のライブラリを試しましたが、Raspberry Piをサポートしておらず、システムのリアルタイムの制約を満たしていませんでした。いくつかの調査の結果、Raspberry Piと連携し、エンコードされたビデオバッファーをリアルタイムで簡単に取得できるGStreamerを発見しました( AppSink を使用) および AppSource 要素)。これにより、カプセル化してDDSトピックに送信することができました。最終的なアプローチに落ち着くまで、vlcjを使用してHTTPストリーミングで一時的な回避策を実装し、数か月間これに取り組みました。
VP8(WebM)ビデオエンコーダーを使用しました。 JavaのラッパーはGStreamerバージョン0.10でのみ機能するため、最適化できず、ビデオのサイズを縮小する必要がありました。テストではRaspberryPiを使用しましたが、価格は同じですが処理能力が高いため、最終的な実装ではMK802IIIデバイスを使用する予定です。最終的なエンコーディング構成は次のとおりです。
次のJavaコードを使用してVP8エンコーダー要素を作成しました。
Element codec =ElementFactory.make( "vp8enc"、null); codec.set( "threads"、5); codec.set( "max-keyframe-distance"、20); codec.set( "speed"、5); Element capsDst =ElementFactory.make( "capsfilter"、null); capsDst.setCaps(Caps.fromString( "video / x-vp8 profile =(string)2"));
クライアント側では、次の構成を使用しました:
次のJavaコードを使用してVP8デコーダー要素を作成しました。
String caps ="video / x-vp8、width =(int)320、height =(int)240、framerate =15/1"; Element capsSrc =ElementFactory.make( " capsfilter "、null); capsSrc.setCaps(Caps.fromString(caps)); Element queue =ElementFactory.make(" queue2 "、null)Element codec =ElementFactory.make(" vp8dec "、null); Element convert =ElementFactory。 make( "ffmpegcolorspace"、null);
JPEGエンコーディングも試しましたが、サイズが大きく、パケット数が多いため、リアルタイムでの使用は不可能でした。
DDSアーキテクチャ
パブリッシュ/サブスクライブアプローチがソリューションの鍵でした。これにより、ネットワークソケットや接続を気にすることなく、多くのクライアント間でデータを共有できました。送受信するデータの種類を指定する必要がありました。システムでのDDSの使用を抽象化するために、ラッパーライブラリDDStheusを作成しました。
最終的な解決策は、3つのトピックを共有する6つのプログラムで構成されていました。さまざまなプログラミング言語を使用しました:
- Bluetoothデバイスで低レベル(HCI)で動作するPython
- 三角測量スクリプトを作成するMATLAB / Octave
- RTI ConnextDDSおよびグラフィカルユーザーインターフェイスと連携するJava
部屋のすべてのRSSI値を知る必要がありました。 Bluetoothドングルを構成し、RSSI情報を取得するためのスクリプトを作成しました。これらの値は、同じマシンで単純なソケット接続を使用してJavaプログラムに送信されました。 Javaアプリケーションは、センサーデータでデータを公開しました トピック。子ID(センサーBluetooth MAC)、BluetoothドングルIDと位置、現在の部屋(キーとして)を送信しました 部屋でフィルタリングする)、RSSI値、有効期限。
カメラがビデオを録画してエンコードした後、JavaプログラムGavaはビデオデータを介してビデオを送信します トピック。 ContentFilteredTopic を使用してストリームをフィルタリングするためのキー値としてカメラIDを送信しました カメラの位置、部屋、エンコードされたフレーム、コーデック情報付き。
さらに、アプリケーションは、カメラID、部屋、カメラの位置を各ビデオパブリッシャーのUSER_DATAQoS値に入れます。三角測量ミニコンピューターは、出版社を見つけるだけで、部屋のすべてのカメラ情報を取得できます。また、新しいカメラや壊れたカメラをリアルタイムで検出し、ロケーションスクリプトを更新して、カメラ選択アルゴリズムを改善することもできます。
最後のステップでは、データを処理し、結果を子データとして書き込みました。 トピック。これは、子の場所を三角測量し、適切なカメラを選択するルームサーバー(RaspberryPiまたはMK802IIIで実装)によって行われました。現在の部屋のセンサーのみをフィルタリングし、その部屋のすべてのビデオパブリッシャー情報を収集しました。データはOctaveスクリプトに送信され、Octaveスクリプトは子供の位置と最適なカメラIDを返しました。トピック子データでクラウドに送信される情報 、子ID、ビデオ品質、カメラID、子の場所、部屋IDが含まれます。効率を上げるために、子IDと品質は、フィルタリングしたり、ビデオの並べ替えに使用したりできるキーとして送信されます。
アプリケーションを最適化するために、ルームサーバーは、子を要求するサブスクライバーが存在する場合にのみ、三角測量スクリプトを呼び出しました。これは、サブスクライバーディスカバリーを使用し、 ContentFilteredTopic を調べて決定しました。 フィルタパラメータ。
最後に、ルームサーバーの障害を処理するための冗長メカニズムを実装しました。部屋の各ミニコンピューターはパブリッシャーを作成し、そのUSER_DATA値を部屋とデフォルトの(一意の)優先度IDに設定しました。ミニコンピューターの1つが、自分の部屋で最も低いIDを検出した場合、サーバーアプリケーションを起動し、より低いIDの新しいミニコンピューターが表示されるまでサーバーとして機能しました。
ユーザーアプリケーション
2つのエンドユーザーアプリケーションを開発しました。最初のものは、保護者が保育園で子供たちに会うために使用されます。 2番目のプログラムは、保育園の従業員がすべてのカメラをリアルタイムで確認し、保護者のアクセスを管理(追加と削除)し、出席管理を自動的に処理するために使用されます。
最終的な考え
この課題では、2つの大きな問題に対処する必要がありました。
- RSSI値の取得:非常に低品質で低コストのBluetoothデバイス(約5ドル)を購入しました。信号には多くのエラーとノイズがありました。値を最適化するアルゴリズムを開発し、その誤差を3メートルから0.5メートルに減らす必要がありました。 JavaでBluetoothデバイスを使用した低レベルの操作用のライブラリが見つかりませんでした(最終的にpybluezを使用しました)。 PythonとJavaプログラムを使用して通信する必要がありました。
- ビデオエンコーディング:エンコードされたビデオバッファを取得できるライブラリを見つけるのは簡単ではありませんでした。 Raspberry Piで最大のパフォーマンスを発揮するように、GStreamer0.10パイプラインの要素を最適化することはさらに困難でした。最終的な構成では、画像の遅延は約3〜5秒です。パフォーマンスを向上させるために、RaspberryPiを同様の価格のMK802IIIデバイスに置き換える予定です。これには、Wi-FiとデュアルコアCortexA9プロセッサが含まれています。
RTI Connext DDSは、ネットワーキング、データシリアル化、およびサービス品質メカニズムを実装することにより、多くの作業を節約しました。このビジネス上の課題にうまく対処する機会とリソースを提供してくれたエンジニアリングスクールとRTIに感謝します。
詳細:
自動運転車の生産»
自律システムの接続性»
IIoTとは何ですか? »
DDSとは何ですか? »
モノのインターネットテクノロジー
- リモートアクセスウェビナーからのよくある質問
- CEOから:勇気と信頼は前進するために不可欠です
- コミュニティカレッジは、高度な複合材料製造の学生に柔軟性を追加します
- レバノンのクライアントがCNCマシンの操作方法を学ぶ
- ジョーダンからのクライアントが私たちの工場を訪問しに来ました
- カナダからのお客様が工場を訪問しました
- 私たちのエンジニアは海外の技術サポートを提供するためにドバイに行きました
- 2017年4月にカタールのお客様が工場を訪問しました
- ベンガルからのクライアントが私たちの新しく建てられた木工機械を検査します
- インドからのお客様が機械を検査するために私たちの工場に来ました
- CNCルーターマシンのための韓国からの訪問者