名称 MIRS1402 ソフトウェア完了報告書
番号 MIRS1402-SOFT-0002

最終更新日:2014.12.12

版数 最終更新日 作成 承認 改訂記事
A01 2015.01.30 牧田 莉奈 初版

目次

  1. はじめに
  2. 関数リファレンス
  3. 試験結果
  4. 総括

  1. はじめに

    本ドキュメントは

  2. 関数リファレンス

    cvCreateImageなどOPENCVの関数については、OPENCVの関数リファレンスを見ればよいので、省略する。
    mirs1402 画像処理プログラム ダウンロード
    mirs1402 全プログラム ダウンロード

    関数名 概要 引数 戻り値 動作状態 所属ファイル
    void main(画像処理用imgpre.c) 画像処理プログラムの使用例を示したプログラムであり、
    画像処理用テストプログラムでもある。
    なし なし 良好 imgpre.c
    void image 実際に画像処理を行う時に実行する関数
    必要な画像処理をまとめている
    int *area 風船が縦に領域を分けた際どこにあるか(-1を返した場合風船が小さすぎるか見つからない。角度検出に使用)
    double * dst2 風船までの距離(m)
    なし 良好 image.c
    int get_img 画像をキャプチャし保存する関数 保存場所(./img/input.img)
    IMG_X 画像のX方向の画素数
    IMG_Y 画像のY方向の画素数
    キャプチャに失敗した場合 -1を返す それ以外は0を返す 良好 get_img.c
    void getBallColor 画像をHSVに変換し、HSVで指定した色の領域を取得する関数
    取得上限を下限より小さくすると、上限より大きい値と下限より小さい値が指定される
    HSVは順に 色相 彩度 明暗のパラメータ 
    IplImage *input 入力画像(キャプチャ画像)
    IplImage *masked 出力画像
    CV_BGR2HSV   変換パラメータ(この場合BGRからHSVに変換)
    int H取得上限
    int H取得下限
    int S取得上限
    int S取得下限
    int V取得上限
    int V取得下限
    なし 良好 getBallColor.c
    int binarization 赤検出を元に二値化する関数 Iplimage *masked 入力画像(赤検出した画像)
    Iplimage *binr 出力画像
    なし 良好 binarization.c
    double sizedetection 輪郭検出をし、輪郭検出結果をもとに各輪郭の面積を算出し、最も大きい領域の面積から風船の有無と風船までの距離を計算する。使用していないが、輪郭の長さの計算もしている IplImage *binr 入力画像(二値化画像)
    int &exist 風船が存在するか判断する値 1なら存在
    double &dst22 風船までの距離(m)
    dst22と同じ値 良好 sizedetection.c
    int angledetection 赤検出された画素をエリアごと数えることで、最も赤の多いエリアを風船のある方角とする関数 IplImage *binr2 入力画像(二値化画像) int area 最も赤の画素の多いエリアの番号 良好 angle.c
    void test_motor(void) 統合プログラム 怪盗機の捕縛にはいたらなかった test_motor.c
    void motor_drive(int u_l, int u_r , int u_f , int u_b) FPGAにモータ制御PWM信号を送る関数 u_l〜u_b:第一から第四引数まで左右前後の順 良好 motor.c
    void pile_ctl(void) パイルバンカ射出信号をFPGAに送る 良好 pile.c
    ここより下は、製作したが、実際にMIRSに搭載されなかった関数である。
    mirs1402 未使用プログラム ダウンロード
    関数名 概要 引数 戻り値 動作状態 所属ファイル
    float dir_adj_v_calculate(int dir_origin) 一定の方角を見続けるための補正速度を演算する関数 dir_origin:向きたい方向 補正速度 良好 dir_adj_vector.c
    void img_pre_thread(void) 画像処理スレッドをつくり、その制御をする関数 良好 img_pre_thread.c
    void main_thread() 統合スレッドをつくり、その制御をする関数 セグメンテーション違反 main_thread.c
    void map_store_read(int *map_data) マップを読み込む関数 map_data:マップ情報を格納する配列[19x19] 良好 map_store.c
    void map_store_uss_dist_data_read(int *uss_dist_data, int dir) 超音波センサのマップ情報を読み込む関数 uss_dist:超音波センサのマップ情報の入った配列[9x9],dir:東西南北の指定(0,2,1,3) 良好 map_store.c
    void motor_ctrl(void) 良好 motor_ctrl.c
    void step_motor_ctl(char *step_ctl,int step) ステッピングモータを制御する関数 step_ctl:0x01(正転(時計))、0x02(逆転),step:回転ステップ数(1ステップ30degree) プログラムに関しては良好 step_motor.c
    void uss_get(int *uss) ussの値を読む関数 uss:ussの値をいれる配列[4] 演習室環境では良好だったが、MIRSでは不良 uss.c
  3. 試験結果

    試験結果ダウンロード

  4. 総括

    競技会の統括としては、会場を旋回しながら警備し、怪盗機を見つけて追いかけ、パイルバンカーを射出することができた。残念ながら風船を割る事には至らなかったが、一番警備ロボットらしい動きをしていたと思う。
    詳細としては、プログラム単体での動作は全体的にうまくいっていた。しかしMIRS環境下での統合テストが、メカの完成の大幅な遅れによりほとんどできない状況であったため、統合プログラムの完成には至らなかった。


沼津工業高等専門学校 電子制御工学科