名称 MIRS1504 ソフトウェア開発報告書
番号 MIRS1504-SOFT-0002

最終更新:2016.04.15

版数 最終更新日 作成 承認 改訂記事
A01 2016.02.01 川崎、原、志村 初版
A02 2016.02.08 川崎、原、志村 各モジュールの開発状況、開発結果を追加した。
A03 2016.02.23 川崎、原、志村 牛丸先生 レビューで指摘された点(画像認識モジュールの参考元と誤字)を修正した。
A04 2016.04.15 川崎 ソフトウェア開発についてのアドバイスを追加した。

目次


  1. はじめに
  2. 本ドキュメントは、MIRS1504のソフトウェア開発結果についての報告書である。

  3. モジュール一覧
  4. MIRS1504 ソフトウェア詳細設計書で掲載したモジュール構成表の、今回の競技会で使用したプログラムの仕様に合うように改変したモジュール一覧を下のTable 1に示す。詳細設計書からの変更点は、表の下で述べる。
    Table1 モジュール構成
    モジュール名 役割 動作概要 変更内容 関数 担当者
    関数名 役割 引数 戻り値
    司令塔(pilot) 各モジュールの統合、全体の制御 デバイスのオープン・クローズ、現場急行、巡回、怪盗発見後の追跡動作を管理する 既存のモジュール(pilot)を変更する int main() 全体の制御を行う なし 正常にプログラムを終了したら0、異常終了したら-1 川崎
    現場急行(mirsak_goto_db) 現場急行 スタートからDBまで急行する 新規に作成する void mirsak_goto_db() 現場急行を行う なし なし
    static void direction_gate(int dist,int dirfr) 正体補正をするかどうかの判断を行う int dist:壁との距離、int dirfr:使用する超音波センサ(正面の超音波センサは1、右側は2、右側の距離を測る場合は3、正面の距離を測る場合は4) なし
    static void run_correction(int mode) 直進時に壁に衝突したときの走行軌道の補正を行う int mode:一回目の直進では0、二回目の直進では1 なし
    巡回(mirsak_patrol) 展示室の巡回 展示室を巡回し、怪盗機を発見したら捕獲モジュールを呼び出す 新規に作成する void mirsak_patrol() 巡回を行う なし なし
    確保(mirsak_catch) 怪盗の確保 怪盗を確保する 新規に作成する int mirsak_catch() 怪盗機を確保する なし 捕獲フラグ(捕獲成功:1、捕獲失敗:0)
    static float mirsak_catch_calc(float s,float x,float *a_array) 怪盗確保時に使用する距離値と角度値を計算する float s:θの値[°]、float x:x[cm]の値、float *a_array:関数が返すα[°]、l[cm]、β[°]、x'[cm]の値を格納する配列 rの値[cm]
    画像認識(picture) 怪盗機の発見 webカメラを使い怪盗機を発見する 新規に作成する int picture_detect(char *device,int *area) カメラで撮影し、撮影した画像の赤色の占める面積を計算する char *device:オープンするデバイスファイル、int *area:赤色の面積 画像処理に成功:1、失敗:-1 川崎
    赤外線計測(infrared) 赤外線センサの確認 各赤外線センサの値を取得する IO Readモジュール(io)を参考に、新規に作成する int infrared_get(char *inred) 8方向に設置された赤外線センサのON/OFFの値を読み取り、引数の配列に代入する char *inred:赤外線センサの値(要素数8の配列) 取得に成功:1、失敗:-1
    超音波計測(uss) 超音波センサの確認 各超音波センサの値を所得する 既存のモジュール(uss)を変更する(MIRS1403の超音波センサモジュールを参考に、ハードウェアの変更に対応する) int uss_get(int uss_port) 超音波センサを使い、超音波センサとの距離を計測する int uss_port:センサ番号 計測距離[cm] 志村
    通信(server) サーバとの通信 サーバへデータを送信する 新規に作成する int server_thief(int num) サーバから送信されてくるデータの読み取りおよびサーバーへの送信を行う(MIRSからサーバへの情報送信はSSHによるファイルコピーによって行われる) int num:送信する数字 送信に成功:1、失敗:-1
    Table1のソフトウェア詳細設計書からの変更点を下に示す。

  5. 各モジュールの開発結果
  6. 今回作成したモジュールの開発の過程と開発結果を下に示す。

    3.1 単体モジュール

      3.1.1 画像認識モジュール

        担当者:川崎

        開発状況:
        年明け前に開発を開始する予定であったが、現場急行の調整などに時間をとられて年明けからの開発となってしまった。また、開発ではMIRS1401とMIRS1403のドキュメント(画像処理モジュール詳細設計書)およびソースコードを参考にした。

        開発結果:
        ソフトウェア詳細設計書のモジュール仕様通りに出来上がった。

      3.1.2 赤外線計測モジュール

        担当者:原(年明けから川崎)

        開発状況:
        開発開始当初はエレキと協力して赤外線センサの機体への実装を行い、競技会1〜2週間前からモジュールの開発に取り掛かった。

        開発結果:
        赤外線モジュール本体はIOデバイスモジュールを参考に、IOデバイスポートを20個に拡張して13〜20を赤外線センサにあてた。デバイスドライバも問題なく動作した。ただ、赤外線センサから距離を取得するところまでは作れなかったため、結果的にIOとモジュールを分ける意義はあまりなかった。

      3.1.3 超音波計測モジュール

        担当者:志村

        開発状況:
        昨年のMIRS1403にて制作されたものを参考に年明け前に完成する事ができた。

        開発結果:
        ソフトウェア詳細設計書通りに制作する事が出来た。標準機から変化した超音波センサの追加にも対応する事ができた。

      3.1.4 通信モジュール

        担当者:

        開発状況:
        標準プログラムをほぼそのまま利用した。公開鍵の登録も早めに行った。

        開発結果:
        試験方法がわからなかったため競技会直前の試験となったが、試験と2回の競技会ともに正常に動作した。

      3.1.5 LEDモジュール

        担当者:志村

        開発状況:
        ボードの仕様決定の遅れに伴い遅れが発生し、年明けから作業を行った。

        開発結果:
        ポートの仕様上パターンをプログラムに記述するのは困難である事が判明したため、PIC上に予めパターンを記録させ、FPGAと接続するポートに信号を送ることで、パターンの切り替えを行えるような設計をした。しかし、デバイスドライバを制作する時間が無かったため、直接inbを使用するためもし実行する場合はroot権限で実行する必要があった。エレクトロニクス開発報告書にもあるように、競技会ではLEDボードを使用しなかったため、動作確認・デバッグは実施できなかった。

    3.2 統合モジュール

      司令塔モジュールについては、他のモジュールをつなげるだけのプログラムであるため省略する。

      3.2.1 現場急行モジュール

        担当者:川崎

        開発状況:
        プレ競技会のプログラムと動きは同じであるため、競技会用に内容を加筆、訂正しながらの開発となった。

        開発結果:
        DBまで急行し、数字認識をしてサーバに送るところまでは競技会でほぼ完璧に動作した。また、DBの方向に回転してからDBまでの直進は、システム基本設計書では距離を与えての走行だったが、競技会のプログラムでは超音波センサで前の壁との距離を測りながら直進し、一定距離まで近づいたら停止するように仕様変更したため、DB前での動作が安定した。ただ、数字をサーバに送信して反時計回り90°の回転をしてからの動作は、システム基本設計書では展示室に入って最初の角まで直進となっていたが、ブレーキングが安定しなかったため、実際のプログラムではそのまま直進して次の角で反時計回りに90°回転するとした。そのため最初の角の左横すぐに怪盗機がいるという状況で、画像認識でそちらに向かうという対応ができなかった。

      3.2.2 巡回モジュール

        担当者:川崎

        開発状況:
        コード自体は後期の開発開始時から書いていたが、画像認識モジュールと赤外線センサモジュールの開発の遅れにより最終的な統合試験はできなかった。

        開発結果:
        画像認識をしてからの条件分岐は画像認識のみの試験ではうまくいっていたが、確保モジュールを含めての動作は思ったようにうまくいかなかった。終わってから気づいたコードのミス(確保モジュールを呼び出してからさらに直進してしまうなど)もあり見直し不足が目立った。

      3.2.3 怪盗確保モジュール

        担当者:川崎

        開発状況:
        巡回モジュール同様にコードは書いていたが試験は競技会直前となった。

        開発結果:
        赤外線センサの感度の関係で、直進開始直後は赤外線に反応してその方向へ動いていったが、走行中の赤外線の反応は悪かった。また、赤外線に反応してそこから元の位置に戻る動作もうまくいっていなかった。怪盗を確保していないのに確保フラグが立つという不具合によって、競技会中にプログラムが停止してしまうという想定外の事態も起こってしまった。

  7. リンク
  8. 総括
  9. 今回MIRS1504のソフトウェア開発では、単体モジュールはLEDモジュールを除いておおむね完成していたが、統合モジュールで単体モジュールの機能を生かしきれずに終わってしまった。統合モジュールの完成度の低さは、エレキの開発の遅れで試験ができなかった面もあるが、確保モジュールは赤外線センサをタッチセンサで代用するなどして代替試験のしようがあったので、そのような工夫も必要だと思った。
    それでも現場急行では最速タイムを出し、プレ競技会ではできなかった正体補正と数字認識を成功させることができてよかった。単体モジュールも競技会直前となってしまったが、仕様どおりに動くプログラムを作れた。
    また、画像認識モジュールや超音波計測モジュールを開発するに当たっては過去のドキュメントが大いに参考になったので、このようにドキュメントを残すことの大切さを改めて認識することができた。

  10. ソフトウェア開発についてのアドバイス
  11. MIRS2016がMG3であるかはわからないが、MG3であった場合、知っておくと便利であると思われることを下に上げる。ぜひ参考にしていただきたい(6.2、6.3の事項については修正されているかもしれないので、各自で確認してもらえれば幸いである)。

    6.1 後退、反時計回りについて

      走行制御(run_ctrl)の関数にはvoid run_ctrl_set(int mode, float speed)とvoid run_ctrl_set_dist(float dist)があるが、
      後退(または反時計回りに回転)する場合にはこの両方の設定値(float speed,float dist)を両方マイナスにする必要がある。

    6.2 run_ctrlの使用について

      走行制御が終わってrun_ctrl_cancel()を呼び出した後、MIRS1504のソースコードを見ればわかると思うが、必ずvel_ctrl_reset()を呼び出している。(このためvel_ctrl.hをインクルードしている。)
      なぜvel_ctrl_reset()を呼び出しているかというと、run_ctrl_cancel()だけではvel_ctrl内のパラメータがリセットされず、次回run_ctrlを呼び出したときに挙動がおかしくなるからである。

    6.3 hardware.hについて

      hardware.hの26行目に「//右タイヤを1とした場合の左タイヤの走行距離補正値」とあるが、これは誤りで、実際は「//左タイヤを1とした場合の右タイヤの走行距離補正値」である。

    6.4 演習室のパソコンとmirs機体との通信について

      演習室のパソコンで作成したプログラムをmirs機体に送ったり、逆にmirs機体のプログラムを演習室のパソコンに送ったりする方法は、USBメモリを使う方法とtitan.denshi.numazu-ct.ac.jpのサーバを仲介して通信する方法の2種類ある。ここではサーバを仲介した通信の方法を紹介する。
      全体の流れは、
      「ディレクトリ全体をtarで圧縮」→「scpでサーバにアップロード」→「scpでサーバからダウンロード」→「tarで展開」
      となる。慣れると簡単にファイルをやり取りできるようになる。
      • 送信側ですること
        1.tarコマンドでディレクトリ全体を圧縮
        tar cfvz 圧縮した後のgzファイル名 圧縮するディレクトリ
        例:[d12116@D34 program]$ tar cfvz mirs1504.tar.gz mirs1504_v1.0/

        2.scpコマンドで圧縮したgzファイルをアップロード
        scp アップロードするファイル アップロード先のファイル(無ければ自動で新規作成され、あれば上書きされる)
        例:[d12116@D34 program]$ scp mirs1504.tar.gz mirs1504@titan.denshi.numazu-ct.ac.jp:/www/mirsdoc2/mirs1504/p/mirs1504.tar.gz
        (scpの実行時にはパスワードを入力する必要がある)

      • 受信側ですること
        1.scpコマンドでgzファイルをダウンロード
        scp ダウンロードするファイル ダウンロードしたファイルの保存名(無ければ自動で新規作成され、あれば上書きされる)
        例:mirs@mirs-ubuntu3:~/$ scp mirs1504@titan.denshi.numazu-ct.ac.jp:/www/mirsdoc2/mirs1504/p/mirs1504.tar.gz mirs1504.tar.gz
        (scpの実行時にはパスワードを入力する必要がある)

        2.tarコマンドでgzファイルを展開
        tar xfvz 展開するgzファイル(同名のディレクトリやファイルがあると上書きされるため注意)
        例:mirs@mirs-ubuntu3:~/$ tar xfvz mirs1504.tar.gz

      この方法を使えば、特に道具を用意しなくてもデータの送受信ができる。


MIRS1504ドキュメント管理台帳