[[2018a/Member]]
#contents
*課題内容 [#f9324395]
**フィールドの説明 [#g9de751c]
http://yakushi.shinshu-u.ac.jp/robotics/?plugin=ref&page=2018a%2FMission3&src=2018a-mission3.png
・フィールドは課題2で使用した紙を使用する。
・2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し、円XにABA、円YにBABとなるように3段づつ積み上げる。
・空き缶には色をつけたり文字や記号を書いてもよい。あるいは周囲に紙を張ってもよい。
**ルール [#af75cc25]
・基本ルール 競技時間は審判が続行不能と判断するまで、あるいはリタイアするまで。
図の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点)
*ロボットの説明 [#r25c64ab]
RCXの一つはアームに,もう一つはタイヤに接続することで仕事を分担している.回転移動がしやすいようにロボットの前側がタイヤではなく,ツルツルとしたブロックにした.また,アームの上げ下げの部分と掴む部分にトルクを組み込むことで可動域を過ぎても壊れず,常に力を入れることも可能にした.
*動きの流れ [#ec923293]
��A`からXに向かう
��X内の缶3つを円外に移動させる
���△念榮阿気擦心未両紕欧弔�X内に戻す
�き�で移動させた上の缶を円外にある缶に重ねる
�キい能鼎佑殖牡未�Yに運ぶ
*プログラムの説明 [#e25cb37c]
**本体について [#lbd40846]
***定義 [#g05cbb32]
-ロボット本体に関わる定義
#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 //アームが缶を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に到着したことをアームに伝える
***メインプログラム [#t13b2e25]
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);
アームを動かしているときに本体が軽く動いてしまうという不具合が起きたことから,ところどころ旋回の秒数を変えた.
**アームについて [#w34452c4]
***定義 [#y91cf02b]
-アームに関わる定義
#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に到着したことをアームに伝える
***サブルーチン [#i37c43b7]
sub ueno_kan_tukamu()
{
arm_ueageru; //アームを最大まであげる
Wait(10);
arm_sageru; //アームを少し下げる
Wait(5);
kan_tukamu; //缶をつかむ
Wait(5);
arm_ageru; //缶をつかんだままアームをあげ続ける
}
アームを一旦下げることで,缶を浮かせて下の缶が倒れないようにしている.
***メインプログラム [#q35518a5]
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をはさみ改善させている.
*まとめ [#wd0e3beb]
**結果 [#wa12017c]
成功すれば11点のはずだったが,�きイ�うまくいかず,2点になってしまった.
**反省 [#y46ffc3c]
時間で移動することが多々あったため,電池の消耗具合で成功率が大きく変わってしまった.また,ロボットを高くしようとするあまり,重量が重くなってしまった.全体をふまえ,ルールの確認がきちんとできていなかった.
**感想 [#m35eb5f8]
もともと成功率は低かったが試しの時にできていたところでさえもできなかったのは残念だった.だが,この授業で習ったプログラムをほとんど使うことができ,全工程のまとめとしてとてもいいものを作れたと思う.