2013a/Member

課題2について

  • 二台のロボットでピンポン玉をパスしながら運び、ゴールを空き缶に当てる。
    コース図

ロボット本体紹介

  • ロボが独創性を増していく過程を紹介します。このロボは本体の構造のおかげで簡単なプログラムで行動を起こすことができるのが特徴です。

初期マシン

ロボ
  • まだこの段階ではパスの構造のみ完成。この時点での問題点はパスの受け取りが尋常じゃなく難しい点とボールを取りにいけない点です。

二代目

ロボ
  • 二代目はパスの受け取りのために簡易的に広い受け口を取り付けました。が、問題点は変わらず。

三代目

ロボ
  • 三代目から徐々に目指す形が独特に。回転を利用してボールのキャッチを行うことを考案。通信ができないという新たな問題点が生まれる。

四代目

ロボ
  • パスを受け取りやすく改良。通信を動かずに行えるよう改良。どんどん怠惰で独創的なロボに。

最終マシン

ロボ
  • 最終的な着地点がこちら。バックでライントレースするために後部にも光センサーを取り付け。パスのやり取りが成功しやすくなるように細かな改良も加えられています。さらにタッチセンサーを取り付けプログラムを改良しました。

コース攻略法

1 第一のポイントーボールのキャッチ

回転をベースにボールをキャッチ。タイマーとタッチセンサーを用いて精度を向上させました。 プログラムは以降に示す通り。

2 第二のポイントー最初のパス

難関だったのは空き缶があること。シュートの正確性は高かったのでロボのポジションを調整することで克服。

3 第三のポイントーパスの受け取り

ロボの本体がかなり長いうえにアームの構造上動く必要はなし。ここがこのロボの利点の一つです。

4 第四のポイントーシュート

これについてはほぼ完璧。シュートの精度はほぼ必中でした。ロボの構造上簡単なプログラムでシュートを行うことができました。

プログラム詳細

#define THRESHOLD 40
#define HHIPOWER 7 // 直線とボールを打ち出すとき用の強めのパワー
#define POWER 2 // カーブ、旋回用の弱めのパワー
#define LOWPOWER 0 // ボールをキャッチする用の弱いパワー
#define set_power_HH SetPower(OUT_AC,HHIPOWER);
#define set_power_M SetPower(OUT_AC,POWER);
#define set_power_L SetPower(OUT_B,LOWPOWER);
#define go_forward set_power_HH; OnFwd(OUT_AC); // 前に進む動作
#define go_back set_power_HH; OnRev(OUT_AC); // 後ろに進む動作
#define turn_left1 set_power_M; Off(OUT_A); OnFwd(OUT_C); // 左にカーブする動作」
#define turn_right1 set_power_M; OnFwd(OUT_A); Off(OUT_C); // 右にカーブする動作
#define turn_left2 set_power_M; OnRev(OUT_A); OnFwd(OUT_C); // 左に旋回する動作
#define turn_right2 set_power_M; OnFwd(OUT_A); OnRev(OUT_C); // 右に旋回する動作
#define catch_ball set_power_L; OnFwd(OUT_B); // ボールをキャッチする動作
#define pass_ball set_power_HH; OnRev(OUT_B);Wait(150);Off(OUT_B); // ボールを打ち出す動作
#define STEP 1 // 1回の判断で動作させる時間

・ここからがロボットを動かすための指令

task main()
{
  SetSensor(SENSOR_1,SENSOR_LIGHT); // 「1」のところに光センサーを設置
  SetSensor(SENSOR_2,SENSOR_TOUCH); // 「2」のところにタッチセンサーを設置
  SetSensor(SENSOR_3,SENSOR_LIGHT); // 「3」のところに光センサーを設置

第一のポイント
アームの長さにより下図の赤い矢印のあたりから左旋回することによってボールをキャッチ。

ライン
   ClearTimer(0); // タイマーをリセット
  while (FastTimer(0) <= 430) { // 4.3秒間、通常のライントレース
    if (SENSOR_3 < THRESHOLD-4) {
      turn_left2;
    } else 
      if (SENSOR_3 < THRESHOLD-3) {
        turn_left1;       
      } else if (SENSOR_3 < THRESHOLD+5) {
        go_forward;
      } else if (SENSOR_3 < THRESHOLD+10) {
        turn_right1;
      } else {
        turn_right2;
       } 
      Wait(STEP);
    }
   PlaySound(SOUND_UP); // 4.3秒間、通常のライントレースを行ったら、ピロピロ〜と高い音を鳴らす
 set_power_M; OnRev(OUT_A); OnFwd(OUT_C); Wait(580); // 5.8秒間、左に旋回する
  while(SENSOR_2==0){ // タッチセンサーがオフの間、ボールをキャッチする動作を行う
   catch_ball;
  }
  Off(OUT_B);

ボールを取ってから進行方向にロボットを向けるまで
ボールを取ってからも光センサーが黒に反応するまで左旋回させることによって進行方向にロボットを持っていく。ボールを取ってからすぐに光センサーを使うと、初めに逆方向の黒線に反応してしまうので、2秒間タイマーを使って旋回して、初めの黒線を突破してから光センサーを使用。

  Wait(200); // 2秒間、ボールをキャッチするときの左旋回を続ける
 Off(OUT_AC);
  while (SENSOR_3 > THRESHOLD-5) { // 光センサーが黒い線に反応するまで、左に旋回
      turn_left2;
    } 
 Off(OUT_AC);

ボールを打ち出す
ロボットを進行方向に向けたら、すぐにボールを打ち出す動作に突入。そのまま打つとと缶に直撃してしまうため少し戻ってからボールを打ち出す。

 go_back;Wait(80);Off(OUT_AC);Wait(100); // 0.8秒間後ろに下がって、1秒間停止
 pass_ball; // ボールを打ち出す

ボールを打ち出してから、ボールを受けるまで
通常のライントレースをして、ボールを受ける位置までタイマーを使って移動する。ボールを打ち出した時に後ろに下るので、ラインを脱線してしまうから、少し前に進んでからライントレースをします。ボールはアームの範囲内に出されると、自然とアームの内側に収まるので、少し左にカーブして、ボールをアームの奥に移動させてからボールをキャッチする。

  go_forward;Wait(80);Off(OUT_AC); // 0.8秒間前進して、黒い線に反応できるところまで移動する
    ClearTimer(0); // タイマーをリセット
  while (FastTimer(0) <= 170) { // 1.7秒間、通常のライントレース
    if (SENSOR_3 < THRESHOLD-4) {
      turn_right2;
    } else 
      if (SENSOR_3 < THRESHOLD-3) {
        turn_right1;       
      } else if (SENSOR_3 < THRESHOLD+5) {
        go_forward;
      } else if (SENSOR_3 < THRESHOLD+10) {
        turn_left1;
      } else {
        turn_left2;
       } 
      Wait(STEP);
    }
 Off(OUT_AC); // 1.7秒間、通常のライントレースを行ったら停止する
 Wait(1000); // 相手からのパスがくるまでの10秒間停止して待つ
 turn_left1;Wait(100); // 1秒間左にカーブして、ボールをアームの奥まで移動させる
  while(SENSOR_2==0){ // タッチセンサーがオフの間、ボールをキャッチする動作を続ける
   catch_ball;
  }
  Off(OUT_B);
   PlaySound(SOUND_UP); // ボールをキャッチしたら、ピロピロ〜と高い音を鳴らす
}

ロボコンで発表したプログラムはここまで。

缶に向かってシュート
缶にシュートするときのプログラムも一応添付。 最後にブールを受ける位置から、シュートするまでのプログラム。命中率は高め。 ここで大事なのは、シュートする位置取りなので1秒前進、0.6秒左に旋回することによって絶好の位置に着きます。ここまできたら、そのままシュート。

task main()
{
  OnFwd(OUT_AC);Wait(100); // 1秒前進
  OnRev(OUT_A); OnFwd(OUT_C);Wait(60);Off(OUT_AC); // 0.6秒、左に旋回
  OnRev(OUT_B);Wait(100);Off(OUT_B); // ボールを打ち出す
}

まとめ

  • ロボティクス入門ゼミの最終課題となったこの課題2ですが、完成させることは出来ませんでした。しかし、課題1と比べるとはるかに作りこめた気がします。チームメイトのアイデアにたくさん助けられ、ここまでできました。とても楽しい講義でした。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-08-17 (土) 21:28:51