[[2017b/Member]]
目次
#contents
*課題をクリアしていくために… [#k81a7a84]
今回私たちのグループはこの課題をクリアするにあたって重要となるポイントについて次のように考えた。
�.灰奪廚涼戯妻�法
�▲灰奪廚了�ち運び方法
�0榮絢蠱�
�て鵑弔離蹈椒奪箸龍�力方法
今回は、上記の4つのポイントに注目してロボット、プログラムを作成していく。
*ロボットの説明 [#y206a328]
**ロボットの選択(ポイント�い硫魴茵� [#uda29c80]
●2つのロボットからの選択
今回の課題をクリアするにあたって二つのロボットをどのように使用するかがとても大切になってくる。私たちは、2つのロボットの使用は方法は次の2通りあると考えた。
1.2つのロボット1つに組み合わせる
メリット1 プログラミングを簡単なものとすることができる。
メリット2 アームの構造にモーターを2つ使用することができる。
課題点1 作業の速度が遅くなる(1台のロボットとして使用するため)。
課題点2 ロボットがとても重くなってしまう。
2.2つのロボットを別々に動かす
メリット1 作業の速度が早くなる(2台のロボットで協力できるため)。
メリット2 2つのロボットを使用した協力作業ができる。
課題点1 アームの構造がモーターを1つしか使用することができないため複雑になってしまう。
課題点2 プログラミングが複雑なものとなってしまう(コース上で衝突しないように…等)。
今回は、時間の関係で構造が簡単で、なおかつプログラミングが簡単なものとすることのできる
1.2つのロボット1つに組み合わせる
の方法で課題をクリアしていきたい。
●ロボットの課題点
2つのロボット1つに組み合わせるためには、以下の課題点をクリアしていく必要があると考えた。
-課題点1 作業の速度が遅くなる(1台のロボットとして使用するため)。
→解決策� ‖�度の変更(プログラミング)
解決策�◆.魁璽垢諒儿后淵廛蹈哀薀潺鵐亜�
解決策�� 機体の軽量化(ロボット)
-課題点2 ロボットがとても重くなってしまう。
→解決策� ‖�度の変更(プログラミング)
解決策�� 機体の軽量化(ロボット)
解決策�ぁー嵶悗鯀�やす(ロボット)
以上のポイントと課題点に注目して機体を作成していく。
**ロボットの全体像 [#nb010d29]
&ref(2017b/Member/yuitom/Mission3/mission3_機体.jpg,50%,機体の全体像);
今回私たちが作成したロボットは2つのロボットを1つにまとめたもので、それぞれ下のロボットがアーム関連を担当し、上のロボットが移動関連を担当している。
それぞれの部位について、「ポイント」と「課題点」に注目し詳しく見ていこうと思う。
**コップの入手方法(ポイント� ↓△硫魴茵� [#i8b0c8e4]
今回の課題ではコップの入手方法と運搬方法がとても重要になってくる。
私たちのグループではこれを解決するために、モータを2つ利用したアームを作成した。
●コップをつかむ機構
-コップを引き寄せるアーム
&ref(2017b/Member/yuitom/Mission3/mission3_アーム1.jpg,50%,コップの入手方法��);
→ &ref(2017b/Member/yuitom/Mission3/mission3_アーム2.jpg,50%,コップの入手方法��);
上の図のように車輪を取り付けることで、コップとアームの位置が多少ずれていても「コップを引き寄せてがっちりつかむ」ことに成功した。この時、車輪はコップを引き寄せる働きだけでなく、コップがずれ落ちることを防ぐ滑り止めとしても機能している。
-動力1つでのアームの制御を実現するために
&ref(2017b/Member/yuitom/Mission3/mission3_アーム4.jpg,50%,アーム開閉の仕組み);
上の画像のように歯車を使用することで、アームを開く閉じる動作が1つのモータで出来るようになった。また、プログラミングにて回転角を用いたモータの制御を行ったことにより、より確実にコップを入手・運搬ができるようになった。
●コップを上げる機構
&ref(2017b/Member/yuitom/Mission3/mission3_アーム5.jpg,50%,アーム上下の仕組み);
私達のグループでは、前で述べたようにコップを持ち上げるために2つのモータを使用している。そのため、アームがとても重くなってしまっている。
そこで、私達のグループは上の画像のように、モータと歯車を組み合わせることでモータの力を最大限上げ、より確実にコップを持ち上げることができるようになった。
●コップを探す超音波センサと移動のための光センサ
今回の課題にてより確実にコップを探すために必要不可欠なもの、それは「超音波センサ」である。私たちのグループでは超音波センサと回転角を利用するモータの制御方法を用いてコップの入手をより確実なものとした。
&ref(2017b/Member/yuitom/Mission3/mission3_センサ.jpg,50%,光センサと超音波センサの位置関係);
&ref(2017b/Member/yuitom/Mission3/mission3_センサ2.jpg,50%,アーム下降時の光センサの位置);
今回は、上の図のように超音波センサと光センサを取り付けることで、より確実にコップを入手、ライントレースにより運搬できると考えた。
実際にコップの探査プログラムを使用し試したところ、アームの中心に音波センサーを置く前と比較し、コップの入手の成功率を格段に上昇させることに成功した。
ライントレースについては下の「●ロボットを移動させる光センサ」にて説明する。
**ロボットの移動手段の決定(ポイント��、課題�い硫魴茵� [#m42bda7b]
●ロボットを移動させる光センサ(ポイント��「移動手段」の解決)
今回、私たちのグループではコップを入手・運搬するために「課題2」で使用したライントレースのプログラムを簡略化したプログラムを立て使用した。光センサの取り付け方に関しても、前回のものを参考に「地面と垂直に、かつ適切な距離だけ地面と話して設置」することで、より確実にコップを入手・運搬することに成功した。
●ロボットの重量を支える4つの車輪(課題�ぁ崋嵶悗鯀�やす」の解決)
&ref(2017b/Member/yuitom/Mission3/mission3_車輪.jpg,70%,4つの車輪の位置);
図のように今回は駆動輪2輪+自由に回転する車輪2輪で重い重量を支えている。後輪の2つの車輪が自由に回転するため、回転時に摩擦により動作がおかしくなることは無かった。
※図は機体を裏から見たものである。
*値を管理するための定義付け [#f3c69224]
**マスター(移動関連担当機体)定義付け [#ra4929f0]
●ライントレースの基本数値管理
ライントレースを行うにあたって必要となってくる値をまとめて管理し、電池消耗などによって数値に変更が生じた際に値を変えやすくした。
#define adjust Off(OUT_AB);Wait(50); // 待機時間(微調整)
#define ultrasonic SensorUS(S1) //超音波センサー
#define sensor_light SENSOR_2 // 光センサー
#define black 30 // 光センサー最低値
#define white 60 // 光センサー最高地
#define threshold (black+white)*1/2 // 基準線
#define deflection (sensor_light-threshold) // ライントレースの基本計算式
この時、adjustの定義付けによる0.05秒間の待機は、その後の動作をより正確に行うためにほぼすべてのサブルーチンの最後に含まれている。
●コップの探索
講義中に配布された資料を元に作成した。
このプログラムは、タイヤの回転角使用したプログラムにより動いているため、タイヤに関する情報が詳しく定義されている。
const float diameter = 5.45; //タイヤの直径
const float track = 17.5; //タイヤのトレッド幅
const float pi = 3.1415; //円周率
それぞれ、この数値を元に正確な前進後退ができるようになっている。
**マスター(移動関連担当機体)とスレイブ(アーム関連担当機体)の通信 [#lb543d05]
今回私達のグループでは2つのロボットを1つのものとして使用する形式をとっているため、2つの機体の通信が必要不可欠なものとなってくる。そのため、それぞれの情報交換のために5つの定義付けを行った。
#define cup_age_little 20 // 紙コップを少々上げる
#define cup_age 30 // 紙コップ上げる
#define cup_sage 40 // 紙コップ下げる
#define cup_re 50 // 紙コップ持ち直し微調整
#define fin 9 // 仕事終了連絡
コップの持ち直しの動作に関しては、コップが機体の移動時に生じる振動のためにずり落ちてきてしまうという問題を解決するために作成したものであり、これによりコップがズリ落ちてしまうことを最大限解消することができた。
また、機体(マスターとスレイブ)とメールボックスの名前に関しては次のように定義している。
#define master 0
#define slave 1
#define mail MAILBOX1
*サブルーチンの説明 [#r45912fd]
**ライントレースによる移動(ポイント��「移動手段」の解決) [#i1aa8e55]
私達のグループでは、コップの探索・運搬にライントレースプログラムを使用している。今回のライントレースプログラムは前回の課題のような高い精度は必要ないため、比例制御式の3段階プログラムを使用している。
●ライントレースの元となる基本式(解決策� ‖�度の変更)
今回、作成したライントレース用の比例制御プログラムは非常に簡単なものとなっている。
また、今回の課題をクリアするにあたって進行方向右側のラインと左側ラインをライントレースする必要があったため、2つの比例制御のサブルーチンを作成した。
また、linetrase_��(int ��)とした時、�,魯薀ぅ鵐肇譟璽垢垢襯薀ぅ鵑鯢修掘�right→右、left→左)、�△枠耄秬�御の段階を表し、�△涼佑鯊腓�くすることでより急なカーブでもライントレースできるようになる。
例)緩やかなカーブの右側のラインをライントレース→ linetrase_right(1.5);
sub linetrase_right(int x) //ライントレース基本(進行方向右側)
{
OnFwd(OUT_A,40+deflection*x);
OnFwd(OUT_B,40-deflection*x);
}
sub linetrase_left(int x) // ライントレース基本(進行方向左側)
{
OnFwd(OUT_A,40-deflection*x);
OnFwd(OUT_B,40+deflection*x);
}
また、速度の基準が40と非常に速く設定されている理由は「解決策� ‖�度の変更」によるためであり、これより下の値となると機体の重量の関係で前進しない可能性が高くなるためである。
●簡単な比例制御ライントレースのプログラム
今回は、前回の課題で使用した「ライントレース交差点識別モード」のプログラムをそのまま使用している。このプログラムでの交差点識別方法は、指定時間曲がり続けても基準線より黒い部分から抜け出せない場合に交差点と認識するものである。
そして今回、交差点識別時間は100と非常に短く設定されている。これは、速度基準を40と非常に速く設定しているため、交差点識別時間を短くしなければ交差点識別せずに通り過ぎてしまうからである。
また、intertify_��()とした場合、�,魯薀ぅ鵐肇譟璽垢垢襯薀ぅ鵑鯢修靴討い襦�(right→右、left→左)
例)右側のラインをライントレース(交差点識別)→ intertify_right();
sub intertify_right() //交差点識別ライントレース(右側)
{
long t = CurrentTick();
while(CurrentTick()-t<100){ // 交差点識別時間は100秒
if(sensor_light>white-5){ // 55より上(白い)の場合→時間リセット
linetrase_right(1.5);
t = CurrentTick();
}else if(sensor_light>black+5){ // 35より上(およそ基準線)の場合→時間リセット
linetrase_right(1.5);
t = CurrentTick();
}else{ // それ以外の場合(黒線)の場合
linetrase_right(1.5);
}
}
adjust;
}
sub intertify_left() //交差点識別ライントレース(進行方向左側)
{
long t = CurrentTick();
while(CurrentTick()-t<100){ // 交差点識別時間は100秒
if(sensor_light>white-5){ // 55より上(白い)の場合→時間リセット
linetrase_left(1.5);
t = CurrentTick();
}else if(sensor_light>black+5){ // 35より上(およそ基準線)の場合→時間リセット
linetrase_left(1.5);
t = CurrentTick();
}else{ // それ以外の場合(黒線)の場合
linetrase_left(1.5);
}
}
adjust;
}
**超音波センサーを用いたコップの探索と入手 [#f5507a3f]
今回、配布された参考資料を基に超音波センサーを用いたコップの探索と入手のプログラムを作成した。
超音波センサを用いたコップの探索
コップまで接近するプログラムと、コップを探査するために機体を左右に揺らすプログラムである。
今回、私たちのグループでは配布されたもの以外に、コップに接近した後、もとに位置まで後退するというプログラムを追加した。
これにより、コップ入手後のライントレースへの復帰が確実とまではいかなくても、だいたいの確率でライントレースに復帰することが可能となった。
void approach(float d) //距離d前進
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤの回転数
RotateMotorEx(OUT_AB,50,angle,0,true,true);
adjust;
}
void back(float d) //距離d後退(追加プログラム)
{
long angle = d/(diameter*pi)*360.0; //必要なタイヤの回転数
RotateMotorEx(OUT_AB,-50,angle,0,true,true);
adjust;
}
void spinAng(long ang) //角度ang度の旋回(時計回り)
{
long angle = track/diameter*ang; //必要なタイヤの回転数
RotateMotorEx(OUT_AB,50,angle,100,true,true);
adjust;
}
void spinAng_opposite(long ang) //角度ang度の旋回(反時計回り)
{
long angle = track/diameter*ang; //必要なタイヤの回転数
RotateMotorEx(OUT_AB,-50,angle,100,true,true);
adjust;
}
●超音波センサを用いたコップの探索
このプログラムは超音波センサを用いて、機体を左右に振ることで障害物(コップ)までの距離を測り、障害物までの距離が最も短い回転角度を記憶、その後その角度に向き障害物に接近するために必要となるものである。
また、int search_distance(long ��)としたとき、�,話戯些囘戮鯢修后�
例)120度の範囲でコップを探す。(右に60度旋回、左に60度旋回)→ search_distance(120);
int search_distance(long ang) // 紙コップの探索(探査角度)
{
long tacho_min; //最も近い距離を実現するタイヤの回転数
int d_min = 300; //最も近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタイヤの回転角を計算
spinAng(ang/2); //指定角度の半分旋回(時計回り)
ResetTachoCount(OUT_AB); //角度計算をリセット
OnFwdSync(OUT_AB,50,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(ultrasonic<d_min){
d_min = ultrasonic;
tacho_min = MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,50,100,RESET_NONE); //時計回りに旋回
until(MotorTachoCount(OUT_A)<=tacho_min || ultrasonic<=d_min);
adjust;
Wait(500);
return d_min;
}
◎応用編「光センサを用いた黒線探索」
このプログラムは、実際には使用されることがなかったが「●超音波センサを用いたコップの探索」を応用して作成されたものである。作成された理由としては、コップ入手後にライントレースに復帰するためのプログラムであったが、「超音波センサを用いたコップの探索」にて説明した後退するプログラムが完成したため、必要がなくなったからである。
また、 search_light_center(long ��)としたとき、�,蓮屐�超音波センサを用いたコップの探索」と同様に探査角度を表している。
sub search_light_center(long ang) // 現在の方向を中心にang度の範囲で黒線の中心を向く
{
long tacho_min; //最も近い距離を実現するタイヤの回転数
int light_min = 300; //最も暗い明るさの仮の最小値
long angle = (track/diameter)*ang; //旋回角度からタイヤの回転角を計算
spinAng(ang/2); //指定角度の半分旋回(時計回り)
ResetTachoCount(OUT_AB); //角度計算をリセット
OnFwdSync(OUT_AB,50,-100);
while(MotorTachoCount(OUT_A)<=angle){
if(sensor_light<light_min){
light_min = sensor_light;
tacho_min = MotorTachoCount(OUT_A);
}
}
OnFwdSyncEx(OUT_AB,50,100,RESET_NONE); //時計回りに旋回
until(MotorTachoCount(OUT_A)<=tacho_min || sensor_light<=light_min);
adjust;
Wait(500);
}
**アームの操作 [#y9d1707d]
私たちのグループでは、アームに2つのモータを使用しているため少々動きが複雑になってしまう。そのため、アームの動きを全てサブルーチンとしてまとめることで、より扱いやすくした。
またその際に、回転角を使用するモータの制御法を用いることで、より確実にコップを入手・運搬・リリースできるようにした。
●アーム制御プログラムの使用法について
「tukamu()」→ コップをつかむ際に使用
「hanasu()」→ コップを離す際に使用
「up_little()」→ コップを運搬(ピンポン玉所持時)する際に使用
「ageru()」→ (コップ所持時)ピンポン玉を枠内に入れる際に使用
→ (コップ未所持時)コップの探査時に使用
「down_little()」→「up_little()」時にずれた分の調整
「sageru()」→ コップを入手する際に使用
アーム関連のプログラムは大体このように使用している。
尚、それぞれのプログラムは以下の通りである。
sub tukamu() //掴む
{
RotateMotor(OUT_A,50,440);
adjust; //もとはOff(OUT_A);Wait(300);
}
sub hanasu() //離す
{
RotateMotor(OUT_A,50,-440);
adjust;
}
sub up_little() //少し上げる
{
RotateMotor(OUT_B,60,-180);
adjust;
}
sub ageru() //上げる
{
RotateMotor(OUT_B,60,-720);
adjust;
}
sub down_little() //すこし下げる
{
RotateMotor(OUT_B,60,180);
adjust;
}
sub sageru() //下げる
{
RotateMotor(OUT_B,60,720);
adjust;
}
**その他のサブルーチン [#yef1d92f]
課題を始めるにあたって、まずAの枠内から抜け出さないと行かない。そのため、以下のような簡単なサブルーチンを作成した。
sub escape_A() // Aからの脱出
{
while(sensor_light<white-5){
OnFwd(OUT_B,50);
OnFwd(OUT_A,30);
}
adjust;
}
*課題の攻略 [#eb2b3c16]
**QS作戦(解決策�◆屮魁璽垢諒儿后廖� [#w04f4faf]
私たちのグループが課題を攻略するにあたって、重要となるのではないかと判断した部分、それは「コース中のQ〜S間」である。
私たちが、なぜここに注目したのかというと、機体をここに移動させることでほぼ「回転」と「コップの探査」の2つの簡単な動作のみで、課題をクリアできるのではないかと考えたからである。
●QS区間にたどり着くために…
QS区間にたどり着くまでの間に問題となってくる場所、それは「PQ区間」をどのように通過するのかということである。円の外周をライントレースするためには縁の内部にある枠が邪魔になってきてしまうことが原因である。
そのために私たちは、「超音波センサーを用いたコップの探索と入手」にて使用した指定の距離前進するというプログラムを用いて、強引に円の真ん中を突っ切ってしまおうという作戦を考えた。
intertify_right(); // B→Pまでライントレース
spinAng(10); // Pにて進路調整
approach(30); // P→Q
while(sensor_light>black+5){ // Q〜S間にてライントレースに復帰��
OnFwd(OUT_A,50);
}
adjust;
while(sensor_light<white-5){ // Q〜S間にてライントレースに復帰��
OnFwd(OUT_B,50);
}
adjust;
intertify_right(); // Sまでライントレース(交差点識別)
またこの時、 approach(30);としているがこれは数回試した結果この数値が最も適していると判断したためである。
**スレイブ(アーム関連担当機体)のプログラム [#ufd00b3d]
今回、課題をクリアするにあたって必要となってくるものが、コップをどのように運搬するかである。特に私たちのグループではコップを持ったまま枠を乗り越えるというコースを通過する。そのためには、紙コップが枠に引っかかることがないように紙コップを若干浮かせる必要がある。
しかし、ここで紙コップを浮かばせすぎると次は中にあるピンポン玉が外へ出てしまう。そのため、私たちはちょうどピンポン玉が外へ出ないような高さの分だけコップを上にあげ、コップを持ったまま枠を乗り越えるという方法を行うことにした。
下の図は「 up_little() // コップを少し上げる」をした後のコップ、ロボットの状態である。
&ref(2017b/Member/yuitom/Mission3/mission3_アーム3.jpg,50%,コップ運搬時のコップの状態);
task main()
{
int msg1; // 紙コップを少し上げる
until(msg1==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg1==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg1 = "";
}
int msg2; // 紙コップを持ち直す
until(msg2==cup_re)
ReceiveRemoteNumber(mail,true,msg2);
while(msg2==cup_re){
down_little();
hanasu();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg2 = "";
}
int msg3; // 紙コップを上げる
until(msg3==cup_age)
ReceiveRemoteNumber(mail,true,msg3);
while(msg3==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg3 = "";
}
int msg4; // 紙コップを置く
until(msg4==cup_sage)
ReceiveRemoteNumber(mail,true,msg4);
while(msg4==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg4 = "";
}
int msg5; // 2番の紙コップを少し上げる
until(msg5==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg5==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg5 = "";
}
int msg6; // 紙コップを上げる
until(msg6==cup_age)
ReceiveRemoteNumber(mail,true,msg6);
while(msg6==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg6 = "";
}
int msg7; // 紙コップを置く
until(msg7==cup_sage)
ReceiveRemoteNumber(mail,true,msg7);
while(msg7==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg7 = "";
}
int msg8; // 3番の紙コップ少し上げる
until(msg8==cup_age_little)
ReceiveRemoteNumber(mail,true,msg1);
while(msg8==cup_age_little){
sageru();
tukamu();
up_little();
SendResponseNumber(mail,fin);
Wait(500);
msg8 = "";
}
int msg9; // 紙コップを上げる
until(msg9==cup_age)
ReceiveRemoteNumber(mail,true,msg9);
while(msg9==cup_age){
down_little();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg9 = "";
}
int msg10; // 紙コップを置く
until(msg10==cup_sage)
ReceiveRemoteNumber(mail,true,msg10);
while(msg10==cup_sage){
sageru();
hanasu();
ageru();
SendResponseNumber(mail,fin);
Wait(500);
msg10 = "";
}
}
また、途中にあるコップの持ち直しに関してはコップが機体の移動時に生じる振動のためにずり落ちてきてしまうという問題を解決するために作成したものであり、これによりコップがズリ落ちてしまうことを最大限解消することができた。
**マスター(移動関連担当機体)のプログラム [#f3fd9950]
&ref(2017b/Member/yuitom/Mission3/mission3_map.jpg,50%,ロボットの動き方);
今回、図のような形で課題をクリアしていきたいと考えている。
大体の流れとしては
「Aをスタート」→「Bからコップ�,涼戯�・入手」→「Bに戻る(ピンポン玉所持)」→「B→Pへ移動(ピンポン玉所持)」
→「P→Sへ移動(ピンポン玉所持)」→「SQ間にてUターン(ピンポン玉所持)」→「P→Sへ移動(ピンポン玉所持)」
→「Sにてピンポン玉リリース」→「SQ間にてUターン(紙コップ所持)」→「Yに紙コップをリリース」
→「Sにて右回り旋回」→「コップ�△涼戯�・入手」→「元の位置へ戻る(ピンポン玉所持)」→「QS間に復帰するまで見い回り旋回(ピンポン玉所持)」
→「Sにてピンポン玉リリース」→「SQ間にてUターン(紙コップ所持)」→「Yに紙コップをリリース」
→同様にコップ��も入手・ピンポン玉、紙コップをリリース→ 終了
という流れで課題をクリアしていこうと思う。
※後の「評価」でも記述しているが、今回はコップを重ねる動作についてのプログラムは考えていない。
今回、注意したこととすると前回の課題と同じように電池消耗によって課題の成功率が左右されないプログラムの作成である。これにより、課題の成功率は(途中までではあるが…)少しは上がったのではないかと私は考えている。
以下が、今回の発表会にて使用したプログラムである。
task main()
{
SetSensorLowspeed(S1);
SetSensorLight(S2);
escape_A(); // Aから抜け出す
intertify_right(); // B地点までライントレース交差点識別モード
int d1 = search_distance(90); // B地点にて90度の範囲でコップ探索
if(d1>10){
approach(d1-5); // コップの5cm前まで前進
}
int msg1; // 通信(1番の紙コップを少し上げる)
while(msg1!=fin){
ReceiveRemoteNumber(mail,true,msg1);
SendRemoteNumber(slave,mail,cup_age_little);
}
back(d1-5); // 前進分だけ後退(B地点まで戻る)
spinAng(80); // BにてP方面へ右旋回
while(sensor_light>black+5){ // BP区間ライントレース復帰準備��
OnFwdSync(OUT_AB,50,0);
}
adjust;
while(sensor_light<white-5){ // BP区間ライントレース復帰準備��
OnFwd(OUT_B,50);
}
adjust;
intertify_right(); // B→Pまでライントレース(交差点識別)
spinAng(10); // Pにて進路調整
approach(30); // P→Qまで前進(Xの枠を乗り越える)
while(sensor_light>black+5){ // QS区間ライントレース復帰準備��
OnFwd(OUT_A,50);
}
adjust;
while(sensor_light<white-5){ // QS区間ライントレース復帰準備��
OnFwd(OUT_B,50);
}
adjust;
intertify_right(); // Q→Sまでライントレース(交差点識別)
spinAng(90); // Sにて右旋回(Xへ向く� �
int msg2; // 通信(紙コップ持ち直す)
while(msg2!=fin){
ReceiveRemoteNumber(mail,true,msg2);
SendRemoteNumber(slave,mail,cup_re);
}
while(sensor_light>black+5){ // Sにて右旋回(Xへ向く�◆�
OnFwdSync(OUT_AB,50,100);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_A,50);
}
adjust;
intertify_left(); // S→Q方向へライントレース(ピンポン玉をX枠内へ)
int msg3; // 通信(紙コップを上げる)
while(msg3!=fin){
ReceiveRemoteNumber(mail,true,msg3);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
spinAng(320); // Yの方向に向く
// 本番はここで終了 //
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
int msg4; // 通信(紙コップを置く)
while(msg4!=fin){
ReceiveRemoteNumber(mail,true,msg4);
SendRemoteNumber(slave,mail,cup_sage);
}
adjust;
// 練習ではここで終了 //
spinAng(90); // 2番の紙コップの方向に向く
int d2 = search_distance(90); // 90度の範囲でコップ探索
if(d2>10){
approach(d2-5); // コップの5cm前まで前進
}
int msg5; // 通信(2番の紙コップを少し上げる)
while(msg5!=fin){
ReceiveRemoteNumber(mail,true,msg5);
SendRemoteNumber(slave,mail,cup_age_little);
back(d2-5); // 前進分だけ後退(元の位置へ戻る)
while(sensor_light>black+5){ // Xの方向へ向く
OnFwdSync(OUT_AB,50,100);
}
adjust;
while(sensor_light<white-5){
OnFwd(OUT_A,50);
}
adjust;
intertify_left(); // S→Q方向へライントレース(ピンポン玉をX枠内へ)
int msg6; // 通信(紙コップを上げる)
while(msg6!=fin){
ReceiveRemoteNumber(mail,true,msg6);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
spinAng(320); // Yの方に向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
int msg7; // 通信(紙コップを置く)
while(msg7!=fin){
ReceiveRemoteNumber(mail,true,msg7);
SendRemoteNumber(slave,mail,cup_sage);
}
spinAng_opposite(90); // 3番の紙コップの方に向く
int d3 = search_distance(90); // 90度の範囲でコップ探索
if(d3>10){
approach(d3-5); // コップの5cm前まで前進
}
int msg8; // 通信(3番の紙コップを少し上げる)
while(msg8!=fin){
ReceiveRemoteNumber(mail,true,msg8);
SendRemoteNumber(slave,mail,cup_age_little);
}
back(d3-5); // 前進分だけ後退(元の位置へ戻る)
while(sensor_light>black+5){ // Xの方に向く
OnFwdSync(OUT_AB,-50,100);
}
adjust;
intertify_right(); // S→Q方向へライントレース(ピンポン玉をX枠内へ)
int msg9; // 通信(紙コップを上げる)
while(msg9!=fin){
ReceiveRemoteNumber(mail,true,msg9);
SendRemoteNumber(slave,mail,cup_age);
}
adjust;
spinAng(320); // Yの方向に向く
while(sensor_light>black+5){
OnFwdSync(OUT_AB,50,0);
}
adjust;
int msg10; // 通信(紙コップを置く)
while(msg10!=fin){
ReceiveRemoteNumber(mail,true,msg10);
SendRemoteNumber(slave,mail,cup_sage);
}
}
●評価
「ピンポン玉→ 2つ、コップ→ 0 得点…4点」
今回は時間が足りず、非常に悔しい結果となってしまった。
-原因と思われる問題点
問題点� 峅魴荳��◆.魁璽垢諒儿后廚竜佑瓩隆鼎�
→ Xの枠を強引に通過するのではなく、超音波センサを利用し他のコップをうまく使用することでもっと確実なコップの輸送ができたのではないかと考える。
問題点�◆.廛蹈哀薀潺鵐阿猟絞顕�
→ 今回はほとんどグループの一人に任せる形となってしまったのだが、そのプログラムをグループ内でさらに共有・改善することにより更に、プログラミングを短く・改善しやすくできたと考えられる。
問題点�� 「解決策�� 機体の軽量化」の未解決
→ 今回時間の関係で、機体の改良に時間を割くことができなかった。そのために明らかに重量オーバーな機体で本番を迎えてしまったのだが、もっと改良し、軽量化・機構の簡略化ができたのではないかと考えている。
問題点�ぁ.灰奪廚鮟鼎佑襪海箸涼杷�
→ 今回時間の関係で、コップを重ねるという動作までに着手できなかった。そもそもそこまで動作が成功しなかったのであるが、やはりプログラムが未完のまま本番に挑むことになってしまったのはとても悔しかった。おそらく、超音波センサを用いることでコップを重ねる動作を成功させることが可能であったと考えている。
*まとめ [#y672585d]
**課題3に関して [#v0ace856]
今回は、時間の関係で完成度の高いロボット、プログラムを作成することができなかった。また、課題の成功率に関してもあまり高いものといえるものを作成することができなかった。
しかし、ロボットはあくまでもプログラムに従って動いてくれたまでであり、完成度が高くないといっても、今回の課題を完全にこなせるレベルのロボットにはなっていたはずなので、あとは私たちがどれほど、プログラミングを工夫できるか、改良できるかに課題の成功が直接関係していたと考える。おそらく、全グループが考えていることであると思うが、もう少しの時間があれば課題をクリアできると考えている。そのため、今回の課題は余計に悔しい結果となってしまった。
**全体を通して [#d2956049]
このゼミを通して私は、自分が今まで完璧な存在だと考えていたロボットがいかに複雑なプログラム動いているか、尚且つ市販のロボットがいかに洗練されているものなのか、ということを身に沁みて退官することができた。
私たちが今回扱ってきたロボットは、とても簡単なつくりである。しかし、その簡単なロボットを動かすために長い時間と調節と改良を行い、ようやく少しはまともな動きにすることができるようになった。簡単なモータとセンサを用いてもこれだけの難易度であるから、おそらく市販の複雑なロボットはさらにその何十倍も難しいものなのであろう。
私が今回のゼミを通し、学んだことはとても大きかった。きっとこれから自身の学科にて同じような、それより難しいロボットを研究・開発していくことになるのだと思う。しかし、そこで行き詰まったとき時、このゼミで仲間と学んだことを思い出したいと思う。そしていつか、誰もが思い描くような夢のロボットを作り上げることができるように、これからも日々努力していきたいと思う。
最後にこの「ロボティクス入門ゼミ」で、私を助けてくださった先生へ、仲間へ向けて感謝を述べたいと思います。
本当にありがとうございました。