MIRS1404 管理台帳へ戻る

名称 MIRS1404 ソフトウェア開発報告書
番号 MIRS1404-SOFT-0011
版数 最終更新日 作成 変更点 承認 改訂記事
A01 2015.01.30 石井建至、加藤慶悟 初版
A02 2015.02.02 石井建至、加藤慶悟 総括の追加 第二版
A03 2015.02.12 石井建至、加藤慶悟 感想を排除 第三版
A04 2015.02.13 石井建至、加藤慶悟 2. 製作内容・完成度の評価の追記の追記
第四版
A05 2015.02.13 石井建至、加藤慶悟 完成度の追求
牛丸先生 第五版

目次


  1. はじめに


    本ドキュメントはMIRS1404のソフトウェア開発が完了したことを記すドキュメントである。


  2. 製作内容・完成度の評価


    1. 怪盗機画像処理プログラム


      openCVを用いて画像処理プログラムを記述した。1度、C++を使い、openCVでプログラムを書いてみたことがあったが、色検出がうまくされないことと、C言語とC++の互換性が懸念されたため、C言語でプログラムを書くことに決めた。
      以下から作成途中のC++で書いたプログラムをダウンロードできる。



      プログラムの作成方法はシーケンスで記述した。カメラのキャプチャ、赤色検出、2値化、平滑化、円形検出、怪盗との移動距離算出、怪盗の移動方向の推定の順のシーケンスである。確か、円形検出においてはハフ変換という方法でプログラムを書いた。怪盗との移動距離算出においては、あらかじめ50[cm]先の風船の半径を定義しておき、比で求めた。怪盗の移動方向推定は検出した円の重心の位置のずれから推定した。因みにこれを行う際に写真は2枚キャプチャした。

      テスト結果 :

      距離算出と移動方向推定においては赤い丸の物体を1枚目とは位置をずらして2枚目を撮影したらしっかり距離算出、推定をしてくれた。
      円検出したことがわかる写真を以下に示す。


      Fig.1 キャプチャした画像

        Fig.2 赤色検出した画像


      Fig.3 平滑化した画像

        Fig.4 円を検出した画像


      完成度の評価 :

      テスト段階での動作は非常に完璧であった。ただ、プログラムを統合した際にメモリの解放や、パスがうまく指定されていなかったことで、統合したらアボードした。実際には協議会までには何とか間に合ったが、当日、体育館に照明により、赤色が検出できなくなってしまった可能性があり、赤色検出ができなかった。色検出についてはHSVにより定義しているのでそこをうまく調整することができれば検出をしっかりやってくれるだろう。


      MIRS1404の画像処理のプログラムの詳細のリンクは以下
      MIRS1404 画像処理 関数レファレンス一覧


    2. 射出機構プログラム


      Arduino言語を用いて記述し、Arduinoで動作させた。
      Arduinoの標準関数でもあるdigitalピンをHigh、Lowにし、PWM値を与えて動作するプログラムを作成した。それを動作させる時間を与えて、射出、収納させた。
      Arduinoにプログラムを送るとき、timeoutしないでプログラムが送れるとき、またはtimeoutしてもプログラムが送れる場合があり、timeoutしてプログラムが送れた状態でArduinoを動作させると、何らかの理由でプログラムにバグが起きて、うまくプログラムを実行できない可能性があったことを留意してほしい。

      テスト結果 :

      Arduinoから直接射出機構ボードに信号を送って動作させる試験においては非常にスムーズに射出、収納することができた。
      しかし、作成したArduino拡張ボードを使用してテストしたところ、Arduinoにプログラムを送ると、timeoutしないでプログラムが送れるときと、timeoutしながらプログラムが送れるときがあり、両方の状態で試験をしたところ、動作自体はうまくできていた。
      完成度の評価 :

      デジタルピンをHigh、Lowにするだけなので非常に簡単に作成することができた。動作自体も良好であったので完成度は満足である。


      MIRS1404の射出機構のプログラムの詳細のリンクは以下
      MIRS1404 射出機構 関数レファレンス一覧


    3. LED装飾プログラム


      Arduino言語を用いて記述した。 Arduinoの標準関数のpinModeからdigitalピンをHigh、Lowにすることで制御を実現した。

      テスト結果 :

      LED赤、緑、青の色は直接ArduinoまたはArduino拡張ボードからの両方の信号を送ってうまく点灯した。

      完成度の評価 :

      LEDが3色ともさらにLEDキューブもうまく点灯したので完成度は満足している。


      MIRS1404のLED装飾のプログラムの詳細のリンクは以下
      MIRS1404 LED装飾 関数レファレンス一覧


    4. 音声プログラム


      Arduino言語を用いて記述した。
      音声LSIはRS232Cの通信規格を採用していることにより、Arduinoの標準関数である、Wire.関数を用いてプログラムを記述した。Wire.write関数の引数にローマ字でしゃべらせたい内容を書けばそのとおりに発声してくれる。
      Arduinoにプログラムを送るとき、timeoutしないでプログラムが送れるとき、またはtimeoutしてもプログラムが送れる場合があり、timeoutしてプログラムが送れた状態でArduinoを動作させると、何らかの理由でプログラムにバグが起きて、うまくプログラムを実行できない可能性があったことを留意してほしい。

      テスト結果 :

      単体試験では、Arduinoにプログラムを送るとき、timeoutしなければ、正常に発声するが、timeoutしてプログラムを送った場合、発声するときと発声しないときがあり、非常に不安定であった。発音に関しては聞き取れる人、聞き取れない人は50:50くらいであった。因みに発音は任意に変えることが可能である。

      完成度の評価 :

      発声に関しては、聞き取れる程度だったので問題ない。しかし、Arduinoにプログラムを送るとき、timeoutしなければ、正常に発声するが、timeoutしてプログラムを送った場合、発声するときとしないときがあり、原因がわからないままであった。音声が不安定に発生する原因はArduinoにプログラムを送った際にtimeoutすることにあるかと思われる。


      MIRS1404の音声のプログラムの詳細のリンクは以下
      MIRS1404 音声 関数レファレンス一覧


    5. 走行系プログラム


      走行系プログラムは巡回動作と警備動作に大別される。
      巡回動作では2番及び3番の小部屋を確認し、中央に移動するまでの処理である。
      また、警備動作では中央で回転し怪盗を検出した状況に応じて適宜処理を実行するプログラムである。

      【巡回動作】
      テスト結果 :

       ・小部屋攻略単体試験 : 旧江上研究室にて2番と3番の小部屋の宝を確認し小部屋から脱出出来ることを確認した。

      完成度の評価 :

       ・小部屋攻略試験ではタイヤ変更以前は7,8割程度の割合で宝の画像認識までを行うことが出来た。しかし、変更後のゲイン調整に苦戦し警備動作までのデバッグを十分に行うことが叶わなかった。
      よく見られた動作として発進直後に曲がり壁に当たるというのは論外であったが、正体補正をを噛ませればもう少しよい動作を期待することが出来たであろう。競技会を踏まえた完成度の評価としては巡回動作プログラムとしてのアルゴリズムとしては問題は無かったが、競技会にて画像認識することは適わなかった。よって完成度は高くは無いと思われる。

      【警備動作】
      テスト結果

      ・警備動作単体試験 : 中央にて回転し風船を認識する所まで確認した。

      完成度の評価 :

       ・警備動作では巡回試験のゲイン調整に時間を割いた為、試験を十分に行うことが出来なかった。また競技会を踏まえた完成度の評価としては画像認識にて怪盗を細く出来なかった為それ以降の動作を確認することが出来なかった。よって完成度としては中央にて回転し画像を撮影する処理の完成度は高くそれ以降の処理については未知数であると思われる。


      MIRS1404の走行系のプログラムの詳細のリンクは以下
      MIRS1404 走行系処理 関数レファレンス一覧


    6. CPU-Arduino間のシリアル通信プログラム


      CPUとArduinoを通信させるために作成をした。
      ArduinoのUSBポートを指定して、そこにwrite関数で指定アルファベット1文字をCPUからArduinoに直接送信するだけである。因みに通信方式はRS232Cである。

      テスト結果 :

      CPUの方からアルファベットを指定して、それをArduinoに送信して、ArduinoIDEのシリアルモニタで送信された文字を受信したかどうかの出力結果を確認し、無事、確認することができた。
      その上で実際にMIRSに組み込んで試験をしたら、うまく送信することができたことを確認することができた。


      完成度の評価 :

      テストの時点で成功し、MIRSに組み込んでの試験も成功したので大満足である。この関数は私たちかやりたかったことの内の1つでもあった。
      また、今回はwrite関数しか使用していないが、read関数も同時に使えることができるはずなので、この関数を使えば、Arduinoから何かしらの状態信号も受け取れるはずなので、これをやればもっとデバック処理としてうまく使いこなせたと思う


      MIRS1404のCPU-Arduino間のシリアル通信プログラムの詳細のリンクは以下
      MIRS1404 CPU-Arduino間のシリアル通信 関数レファレンス一覧


      MIRS1404のCPU-Arduino間のシリアル通信の試験仕様書のリンクは以下
      MIRS1404 CPU-Arduinoシリアル通信送受信試験仕様書


    7. twitter投稿プログラム


      twitterに文字列及び画像を投稿するために作成した。

      テスト結果 :

       ・Ruby実行試験 : *.rbについて記述されたhello_worldを実行した。文字列がコンソールに返されることを確認した。

       ・文字列投稿試験 : MIRSコンソールから文字列投稿処理を記述した*.rbファイルを実行した。文字列ををtwitterへpostが出来たことを確認した。投稿までには2,3秒を要し同じ文字列を連続して投稿できないことを確認した。

       ・画像投稿試験 : MIRSコンソールから画像投稿処理を記述した*.rbファイルを実行した。MIRS内に保存されているtrimng.jpgをtwitterへpostが出来たことを確認した。投稿までにかかる時間については文字列投稿試験の場合と特に変わらなかった。

      完成度の評価 :

       ・twitter投稿プログラムにおけるシステム提案の際の画像を観客にフィードバックしたいという構想については実現することが出来た。同じ文字列を連続して投稿できないということは想定外であったがこれはプログラム上の問題では無くtwittrerの連投規制によるものである。それ以外については満足できるプログラムであった。
      競技会を踏まえた完成度の評価としてはシステム提案に提示した要件を競技会にて問題なく運用することが出来た為、完成度の評価は高いと思われる。


      MIRS1404のtwitter投稿プログラムの詳細のリンクは以下
      MIRS1404 twitter投稿プログラム 関数レファレンス一覧

      MIRS1404のRuby環境構築手順書のリンクは以下
      MIRS1404 MIRS1404 Ruby環境構築手順書



  3. 使用した競技会プログラム


    MIRS1404が作成したプログラムの構成概要を以下の表にまとめる。


    ディレクトリ名 構成ファイル 概要
    Arduino_serial
    extern.h テスト用のヘッダーファイル
    Makefile テスト用のMakefile。
    make clean ; make ; ./serial_main でコンパイル、実行できる。
    serial_main.c テストプログラムのmain関数
    ttyUSB0.c Arduinoにシリアル通信で1文字送信する関数
    baloon
    img テスト用で使用していた画像を保存していたディレクトリ。
    現在は統合して、パスを変更しているため、このフォルダには何も保存されない。
    img2 テスト用で使用していた画像を保存していたディレクトリ。
    現在は統合して、パスを変更しているため、このフォルダには何も保存されない。
    baloon_cross.c 前方、後方のカメラで怪盗の持つ風船の赤色を検出して、怪盗がいるかどうかの確認をする関数。
    baloon_direct.c 前方のカメラで怪盗の持つ風船の赤色を検出して、怪盗がいるかどうかの確認をする関数。
    同時に、怪盗までの距離を算出する。
    baloon_main.c 画像処理のすべての要素をまとめて実行する関数。
    統合する際にはmain関数に、この関数を書くだけでカメラのキャプチャ、画像加工、怪盗の移動方向、怪盗までの距離など、全て処理してくれる。
    baloon_way.c 怪盗の移動方向を推定する関数。
    風船の円形の重心の位置のズレから移動方向を推定している。
    blackandwhite.c キャプチャした画像を2値化する関数。
    cv_ColorExtraction.c 赤色を検出する関数。
    define.h キャプチャする画像の大きさ
    風船との距離算出の基準となるデータ
    を設定する。
    extern.h ballonのディレクトリ内の関数をすべて定義している。
    get1_img.c 前方のカメラでキャプチャする。
    get2_img.c 後方のカメラでキャプチャする。
    labelling.c 画像をラベリングする。
    baloonでは使っていないので風船の画像処理では無意味。
    main.c テストプログラムのmain関数。
    main2.c テストプログラムのmain関数を2つに分けたかったが、Makefileの作り方が当時わからなかったため、このファイルは無意味。
    Makefile テストプログラム用のMakefike。
    make clean ; make ; ./main でコンパイル、実行できる。
    triming.c 画像の一部をトリミングする。
    baloonでは使っていないので風船の画像処理では無意味。
    header
    device.h MIRSMG3D標準ソフトウェアに準拠する。
    direction.h MIRSMG3D標準ソフトウェアに準拠する。
    distance.h MIRSMG3D標準ソフトウェアに準拠する。
    encoder.h MIRSMG3D標準ソフトウェアに準拠する。
    error_mod.h error.cの関数プロトタイプを展開するためのヘッダーである。
    hardware.h MIRSMG3D標準ソフトウェアに準拠する。
    io.h MIRSMG3D標準ソフトウェアに準拠する。
    mirsak.h 未実装
    motor.h MIRSMG3D標準ソフトウェアに準拠する。
    number.h MIRSMG3D標準ソフトウェアに準拠する。
    prototype-main.h main.cの関数プロトタイプを展開するためのヘッダーである。
    prototype-error_mod.h error_mod.cの関数プロトタイプを展開するためのヘッダーである。
    prototype-patrol.h patrol.cの関数プロトタイプを展開するためのヘッダーである。
    prototype-run_sequence.h run_sequence.cの関数プロトタイプを展開するためのヘッダーである。
    run_ctrl.h MIRSMG3D標準ソフトウェアに準拠する。
    server_info.h MIRSMG3D標準ソフトウェアに準拠する。
    test.h
    uss.h MIRSMG3D標準ソフトウェアに準拠する。
    vel_ctrl.h MIRSMG3D標準ソフトウェアに準拠する。
    img
    *.jpg 数字認識のプログラムでキャプチャした画像の保存場所
    img2
    *.jpg 前方のカメラのみ使用するプログラムでキャプチャした画像の保存場所
    img3
    *.jpg 前方後方のカメラを使用するプログラムでキャプチャした画像の保存場所
    mirs
    device.c MIRSMG3D標準ソフトウェアに準拠する。
    direction.c MIRSMG3D標準ソフトウェアに準拠する。
    distance.c MIRSMG3D標準ソフトウェアに準拠する。
    error_mod.c サーバーから返された情報に関するエラー処理が記述されたソース
    main.c 統合用のmain関数が記述されている。
    Makefile 統合プログラム用のMakefike。
    make clean ; make ; ./all でコンパイル、実行できる。
    patrol.c 警備に関する処理が記述されている。
    run_sequence.c 巡回に関する処理が記述されている。
    motor
    encoder.c MIRSMG3D標準ソフトウェアに準拠する。
    Makefile
    motor.c MIRSMG3D標準ソフトウェアに準拠する。
    motor_stop.c MIRSMG3D標準ソフトウェアに準拠する。
    number
    img
    binarization.c MIRSMG3D標準ソフトウェアに準拠する。
    define.h MIRSMG3D標準ソフトウェアに準拠する。
    extern.h MIRSMG3D標準ソフトウェアに準拠する。
    get_img.c MIRSMG3D標準ソフトウェアに準拠する。
    labelling.c MIRSMG3D標準ソフトウェアに準拠する。
    Makefile
    number_detect.c MIRSMG3D標準ソフトウェアに準拠する。
    number_search.c MIRSMG3D標準ソフトウェアに準拠する。
    number_test.c MIRSMG3D標準ソフトウェアに準拠する。
    triming.c MIRSMG3D標準ソフトウェアに準拠する。
    run
    run_ctrl.c MIRSMG3D標準ソフトウェアに準拠する。
    vel_ctrl.c MIRSMG3D標準ソフトウェアに準拠する。
    server
    Makefile
    server_info.c MIRSMG3D標準ソフトウェアに準拠する。
    test
    Makefile
    motor_stop MIRSMG3D標準ソフトウェアに準拠する。
    test.c 単体機能を複数用いたテストを行う場合に用いるmain関数が記してある。
    touch
    io.c MIRSMG3D標準ソフトウェアに準拠する。
    tweet
    rubys
    twitter.c twitterのスレッド生成及び生成したスレッド内で*.rbを実行する処理が記述されている。
    uss
    uss.c MIRSMG3D標準ソフトウェアに準拠する。
    uss_serial.c MIRSMG3D標準ソフトウェアに準拠する。
    License.txt
    このプログラムがMIT Licenseの下にて配布されていることを明示するファイルである。
    Makefile.in
    それぞれのMakefileにおける共通の記述を初期設定として記したファイルである。
    Readme.txt
    このプログラムについての諸注意を示したファイルである。
    【全体の完成度の評価】
     MIRS1404のプログラムとしては構想上及び単体機能試験ではそれぞれ良好であったが、統合を実装したところ直進などに難があり競技会にて活躍することは叶いませんでした。
    しかしMIRSAKのテーマであるエンタテイメント性の追求は実際の会場での雰囲気、また競技会アンケートなどから達成出来たと考えられプログラム全体の完成度としてはそれなりであったのはないかと考えます。


    MIRS1404が作成した競技会プログラムを以下にMIT Licenseにて配布する。

    是非、参考にしてもらえると光栄です。



  4. 各要素についての所感


    1. 怪盗機画像処理プログラム


      怪盗機の赤色の風船を検出するプログラムを作成した。怪盗機との距離、怪盗の移動方向を推定することもできたので、画像処理自体の出来は十分満足です。
      ただ、演習室で試験をしたので、MIRSで試験することがあまりなかったので、競技会当日にbaloon_cross()を実行したらアボードしたので正直焦った。
      これは、cvReleaseImage(xxx)(xxxはcreateしたイメージ)、と、パスを変更したことで何とか間に合った。
      hsvで色の検出をしているが、当日の風船の色が会場の照明等で色が薄くなったりしていたことで、競技会中は怪盗を認識できなかったと思う。
      とにかく、画像処理の出来はとてもよかったと思います。


    2. 射出機構プログラム


      射出機構のプログラムはPWM制御で指定時間動作するという単純なプログラムなので一瞬で書けた。
      PWM値は特にMAXにする必要はないと思ったので、MAXにはしなかった。
      テスト結果は、意外と射出早いな!、と思えるぐらいだったのでびっくりした。
      完成度はしっかり動いたので良かったと思う。


    3. LED装飾プログラム


      高村が率先して作ってくれたので助かりました。
      小さいLEDはpinをHigh、Lowにするだけなので簡単に作成できた。テスト結果もしっかり点灯したので良かった。
      LEDキューブは3×3×3でLEDを組み、3色を色々な制御で光るパターンを変えた。とても綺麗に点灯していたのでちょっと感動した。
      完成度は満足です。


    4. 音声プログラム


      高村が率先してプログラムを作ってくれた。
      音声LSIはRS232Cの通信を使うので、RS232C用の関数を用いて作成した。テスト段階ではしっかりと指定した文字を受信したらしっかり音声を発したのでよかったが、
      競技会前の統合試験ではうまく発声してくれなかったので、悔しかった。
      プログラムの出来はよかったが、当日は残念だった。


    5. 走行系プログラム


      今回は走行系プログラムに関してその基盤となる直進走行に問題が生じてしまい走行系プログラムのポテンシャルを発揮することが叶わず残念に思います。この経験から得るものは必ずあると思うので実行されないソースを書いたことは決して無駄ではなかったと思います。


    6. CPU-Arduino間のシリアル通信プログラム


      シリアル通信に関してはうまく成功したと思うが、文字列を送っているにもかかわらず、うまく音声を発声してくれなかったり、LEDがうまく光らなかったりしていたのでよくわからない状態だった。でも、絶対にシリアル通信は成功していた!と確信できます。
      出来は良かったと思います。


    7. Twitter投稿プログラム


      今回MIRSでツイートをするという試みを企画段階では出来るだろうという直感で進めていましたが実装にはそれなりに苦労しました。競技会で無事ツイートを投稿することが出来、企画としては成功したと思っています。しかし、実際のMIRSの動作の完成度を上げることにより更に良いものに出来ることも事実です。是非この試みが来年度以降も引き継がれ、より完成されていくことを願っています。画像投稿まで組んだので誰か使ってやってください。



  5. 総括


     MIRS1404のソフトウェア開発では分担して作業を行い、効率的に開発を行うことで年内に実装のプロトタイプを準備することが出来た。
     ここまでは順調でしたが機体が組みあがってから競技会までの時間があまり取れず、更にボードなどの不具合もありゲイン調整の費やす時間の見積もりの甘さが競技会にそのまま出てしまったと思います。
     しかしソフトウェア開発では各人がやりたいことが実現出来たので良かったです。





MIRS1404ドキュメント管理台帳