2018a/Member

課題について(本ホームページのtopの2018年の課題3参照)

フィールドの説明

フィールド

フィールドは課題2で使用した紙を使用する。

2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。

空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。

ルール

  • 基本ルール 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。

図のA地点または(および)A'地点からスタートする。ただし接地している部分はそれぞれの領域内に収まるものとする(線上はOK)。上空部分は領域からはみ出していてもよい。

Aタイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。

開始の合図から5秒以内にスタートボタンを押す作業を完了すること。

競技が終了するまで、ロボットに触ったり人間が遠隔で操作してはならない。

途中でうまく動かなくなった場合、1回限り再スタートすることができる(再スタートの際に別プログラムで起動してよい)。

  • 基本得点の計算方法

運んだ空き缶の数×3点

空き缶を積み重ねて置くことができば場合、2段目の空き缶一つにつき2点加算、3段目の空き缶一つにつき3点加算する。

円内からはみ出している場合、半分以下なら1点減点、半分以上なら2点減点。

間違った円内に空き缶を置いた場合は、1個につき1点減点。

間違った円内の2段目に空き缶を置いた場合は1個につき3点減点、その上にある空き缶は0点

技術点の計算方法以下の動作の精度・スピード・確実性などを含めた技術的な工夫や芸術性について他の全てのチーム(5チーム)が20点満点で採点し、その平均点を求める。

  • 得点の目安

空き缶を探し取りにいくまでの動作 (3点)

空き缶を掴む動作 (3点)

空き缶を運ぶ動作 (2点)

空き缶を置く動作 (2点)

空き缶を積む動作 (3点)

2台のRCXまたはNXT、EV3の連携の良さ(2点)

自立型のロボットとしての形や動作の美しさ、斬新さ(2点)

その他 (3点)

ロボについて

ロボの全体

上の写真がロボの全体で1つのロボに2つのRISを付けた.そして,1つのRISがアームに関するモータ(アームの上下,開閉)を動かし,もう1つが本体の動きに関係するモータを動かす.下から2番目の缶をつかみたかったので本体にはある程度の高さをもたせた.そのため,本体が大きくなりもろくなったので,補強を入念に行った.

ロボの足

上の写真はロボ本体の下部で土台となるところである.後輪は車輪を使い,前輪は滑りやすい円形のブロックを用いた.後輪とモータを接続して動かしている.なぜ前輪を車輪にしないかというと,車輪にするとうまくライントレースを行えなかったからである.そして前輪をブロックにすることでうまくライントレースができたからである.また,前輪をブロックにすることによるデメリットも特になかったのでこのような構造にした.

ロボのアーム

上の写真はアームについての写真である.アームは本体とはブロックではつながってなく,モータとアームのギザギザのブロックのようなものが1つの歯車を挟んでつながっている.なのでアームは上下運動ができて,これによって缶を運ぶことを可能にしている.アームの缶をつかむ部分は上に連なった缶の約3個分をつかむことができる.こうすることで3個運ぶときに缶をずらすことなく運ぶことができる.逆に3個分ほどの高さがなければ3個をうまく運べないことが多くなってしまう.またアームの一番下の缶をつかむところに車輪を付けることによって缶をアームから滑りづらくした.この車輪をつけてアームのモータを閉じる方向に回し続けることで,缶とアームの運ぶときのずれをなくすことができた.

全体の動きの流れについて

ロボの動きの流れ1 ロボの動きの流れ2 ロボの動きの流れ3 ロボの動きの流れ4 ロボの動きの流れ5 ロボの動きの流れ6

この流れがうまくいけば11点取れる予定だった.だが,きイうまくいかずに2点になってしまった.

プログラムについて

定義文(アーム)

#define arm_ueageru OnFwd(OUT_AC);Wait(120);Off(OUT_AC);    //アームを一定時間上げる
#define arm_sageru OnRev(OUT_C);                            //アームを下げ続ける
#define kan_tukamu OnRev(OUT_A);                            //アームを掴み続ける
#define arm_ageru OnFwd(OUT_C);                             //アームを上げ続ける
#define kan_hanasu OnFwd(OUT_A);Wait(30);Off(OUT_AC);       //缶をアームから放す
#define STOP Off(OUT_AC);                                   //一時停止
#define kan_temae_toutyaku 10                               //本体が缶が手前まで到着したことをアームに伝える
#define kan_sanko_motu 11                                   //アームが缶を3個持ったことを本体に伝える
#define kan_sanko_motte_senkaisita 12                       //本体が3個の缶を持って左に旋回したことをアームに伝える
#define kan_niko_motta 13                                   //アームが缶を2個持ったことを本体に伝える
#define kan_niko_motte_senkaisita 14                        //本体が2個の缶を持って元のXの位置に右旋回してついたことをアームに伝える
#define kan_ikko_motta 15                                   //アームが缶を1個持ったことを本体に伝える
#define kan_ikko_motte_senkaisita 16                        //本体が1個の缶を持って左に旋回して前に置いた1個の缶の上に到着したことをアームに伝える
#define kan_okiowatta 17                                    //アームが1個の缶をもう一個の缶の上に置いたことを本体に伝える
#define kan_futatabi_modoru 18                              //本体が2個の缶の前に再び戻ってきたことをアームに伝える
#define kan_futatabi_motta 19                               //アームが2個の缶を持ったことを本体に伝える
#define y_toutyaku 20                                       //本体がYに到着したことをアームに伝える

これはアーム部分の定義文であり,上から7行目からはアームと本体の共通の定義文でこれらの定義文は,アームと本体とのメッセージの送受信に使われる.

サブルーチン(アーム)

sub ueno_kan_tukamu()
{
    arm_ueageru;              //アームを最大まであげる
    Wait(10);  
    arm_sageru;               //アームを少し下げる
    Wait(5);
    kan_tukamu;               //缶をつかむ
    Wait(5);
    arm_ageru;                //缶をつかんだままアームをあげ続ける
}

このサブルーチンは上に連なった缶の下から2番目の缶をつかみあげるためのものである.このプログラムの中になぜアームを下げるプログラムが書かれているかというと,アームを少し下げることでアームが2番目の缶の下部をもち少しあげられる余裕が作れるからだ.そうすると,缶をつかんで缶を上にあげることができ1番下の缶と2番目の缶との間にある一定以上の間隔ができ,1番下の缶の上の外縁の出っ張りと2番目の缶の底が接触せずに2番目の缶をつかんで運ぶことができる.こうして缶を運ぶときの問題を解決した.下の図参照

缶の上の縁

2つの缶の上の缶を上げないでとる 2つの缶の上の缶を上げて取る

タスクメイン(アーム)

task main ()
{    
    ClearMessage();
    until(Message() == kan_temae_toutyaku);                //Xに着くまで待つ
    kan_tukamu;
    Wait(50);
    SendMessage(kan_sanko_motu);
    ClearMessage();                                       //缶3個掴んだことを伝える
    until(Message() == kan_sanko_motte_senkaisita);       //缶を3個持って旋回してもらうまで待つ
    Wait(100);
    STOP;
    kan_hanasu;                                           //缶を3個横に移動
    ueno_kan_tukamu();
    ClearMessage();
    Wait(100);
    SendMessage(kan_niko_motta);                          //缶2個持ち上げたことを伝える
    ClearMessage();
    until(Message() == kan_niko_motte_senkaisita);        //もう一つのロボに旋回してもらう
    Wait(100);
    Off(OUT_C);                                           //缶が下りるのを待つ
    Wait(800);
    kan_hanasu;        //缶を1個2個に分ける
    ueno_kan_tukamu();
    Wait(100);
    ClearMessage();
    SendMessage(kan_ikko_motta);                          //缶を一個持ったことを相手に伝える
    ClearMessage();
    until(Message() == kan_ikko_motte_senkaisita);        //ロボットが旋回するまでまつ
    STOP;
    Wait(800);                                            //缶が下がるのを待つ
    kan_hanasu;                                           //缶を2個1個に分けた
    OnFwd(OUT_A);                                         //アームを開き続ける
    arm_ueageru;                                          //アームを上げる  
    SendMessage(kan_okiowatta);                           //缶からアームを完全に放したことを伝える
    until(Message() == kan_futatabi_modoru);              //再び缶の手前まで戻ってきたことを伝える
    kan_tukamu;                                           //缶を掴む
    SendMessage(kan_futatabi_motta);                      //缶を掴んだことを伝える
    until(Message() == y_toutyaku);                       //缶を持ってYに到着してもらうまで待つ
    kan_hanasu;                                           //缶を放す    
}

基本は“全体の流れ”で述べたような動きをするようなプログラムになっている.だがその流れの成功率をできるだけ上げるためにWait();を多く用いた.缶を持った時,動作と動作の間にWait();を使うことで動作と動作の間の急な変化によって缶がアームから外れたりずれたりするのをなくした.また,持った缶を地面に置く時アームを降ろしてすぐに缶を放すと缶と地面との間隔があきすぎて缶が地面に落ちるような形になり,缶が倒れてしまう可能性があった.そこで缶を持ちアームを降ろしてからWait():を入れた.そうすることでWait();の間に缶がアームからしたにずれていき地面と缶の間隔を小さくすることができ,缶が倒れることなく地面に置くことができた.

定義文(本体)

#define go_straight(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);                 //直進
#define go_back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);                     //後退
#define TURN_RIGHT(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC);      //右に旋回
#define TURN_LEFT(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_AC);       //左に旋回
#define cross_stop Off(OUT_AC);Wait(100);              //一時停止
#define kan_temae_toutyaku 10              //これから下の定義はアームのものと同じなので省略
#define kan_sanko_motu 11
#define kan_sanko_motte_senkaisita 12
#define kan_niko_motta 13
#define kan_niko_motte_senkaisita 14
#define kan_ikko_motta 15
#define kan_ikko_motte_senkaisita 16
#define kan_okiowwata 17
#define kan_futatabi_modoru 18
#define kan_futatabi_motta 19
#define y_touchaku 20

タスクメイン(本体)

task main()
{
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    go_straight(100);                            //前に直進
    OnFwd(OUT_AC);
    until(SENSOR_3<=46);                         //Xの円の前で止まるようにする.明るさは場所(教室)によって変わる
    Off(OUT_AC);
    SendMessage(kan_temae_toutyaku);             //本体が缶の手前まできたことをアームに伝える
    ClearMessage();
    until (Message()==kan_sanko_motu);           //アームが3個の缶を持つのを待つ
    TURN_LEFT(90);                               //3個の缶を持ち左旋回
    Off(OUT_AC);
    SendMessage(kan_sanko_motte_senkaisita);     //3個の缶を持って左に旋回したことをアームに伝える
    ClearMessage();
    until (Message()==kan_niko_motta);           //アームが缶を2個持つまで待つ
    TURN_RIGHT(140);                             //缶を持ち右に旋回
    Off(OUT_AC);
    SendMessage(kan_niko_motte_senkaisita);      //アームに缶を2個持って右旋回(Xの位置に戻る)したことを伝える
    ClearMessage();
    until (Message()==kan_ikko_motta);           //アームが缶を1個持つまで待つ
    go_back(45);                                 //後退(この時アームは上にあがり続けて缶もつかみ続けている)
    TURN_LEFT(97);                               //左旋回
    Off(OUT_AC);
    go_back(10);                                 //後退
    SendMessage(kan_ikko_motte_senkaisita);      //持っている1個の缶が置いてある1個の缶の上に来たことを伝える
    ClearMessage();
    until (Message()==kan_okiowwata);            //アームが置いてある1個の缶の上に持っていた1個の缶を置くまで待つ
    go_back(150);                                //後退
    Wait(100);
    go_straight(150);                            //後退した分直進
    Off(OUT_AC);
    SendMessage(kan_futatabi_modoru);           //本体が先程いた2個の缶の手前まで来たことをアームに伝える
    ClearMessage();
    until (Message()==kan_futatabi_motta);       //アームが2個の缶を再び持つまで待つ
    go_straight(400);                            //直進
    TURN_RIGHT(130);                             //右旋回
    Off(OUT_AC);
    go_straight(10);                             //直進
    Wait(100);
    SendMessage(y_touchaku);                     //Yに到着したことをアームに伝える
    Off(OUT_AC);
}

右旋回と左旋回のプログラムがあるが最後にある右旋回以外は同じ距離曲がりたいので(“大まかな全体の流れ”から)秒数は同じになるはずだが,このプログラムを見ると秒数が同じになっていない.これは右と左で旋回の距離に誤差があるからなどの理由だと考えるが,実際にはわからなかった.この改善策として回転センサをつけることを考えたが,ロボの形状上の問題で付けづらいのと回転センサは一つで片方のモータしか正確に動かせないのではないかと考えたため,つけないで時間を基準に左右等しい距離を旋回することにした. そうすることでロボのバッテリーや調子によって旋回の距離が変化してしまい,左右等しい距離の旋回を保つことが難しくなったという問題が発生してしまった.

反省・問題点について

計画では11点を取るというもので,この計画の成功率は練習の段階では5回中1回出来ればいいぐらいの低いものだった.だが,“全体の動きの流れについて”のい泙任呂曚楹亮造棒功できていた.い泙任任れば3点取れる.それなのに本番は2点という結果になった.この原因は,い里箸海蹐納最圓靴燭海箸砲△襦イ覆辞い納最圓靴燭というと,本番の会場に入りロボ動かしたときと入る前とで車輪の旋回距離が変わってしまっていたことにある.旋回距離がずれてしまった理由に確証的なものはないが,ロボの走る地面の違いのためか会場に行くときにロボの車輪の旋回距離を変えるようなことが起きてしまったためなのかもしれない.反省としては,もしこれらが原因だったのなら試験会場に入ってからすぐにデモンストレーションを行い,調整を行うべきだったと考える.この課題では自分の詰めの甘さが失敗の原因になった.これからは順調に物事が進んでたとしても気を抜かずに最後まで作業ができればいいと考える.


添付ファイル: filemission3_nagare6.png 44件 [詳細] filemission3_nagare5.png 42件 [詳細] filemission3_nagare4.png 51件 [詳細] filemission3_nagare3.png 38件 [詳細] filemission3_nagare2.png 48件 [詳細] filemission3_nagare1.png 50件 [詳細] filerobo_arm.jpg 43件 [詳細] filerobo_dodai.jpg 64件 [詳細] filerobo_zentai.jpg 53件 [詳細] file2018a-mission3.png 46件 [詳細] filekannsippai.jpg 41件 [詳細] filekann_futi.jpg 49件 [詳細] filekan_seikou.jpg 48件 [詳細]

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