- 追加された行はこの色です。
- 削除された行はこの色です。
[[2006a/C2]]
#hr
CENTER:&size(25){課題2:黒い線に沿って動くロボット };
#hr
CENTER:製作者:佐藤 堀 (五十音順)
RIGHT:カウンタ&counter;
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]
------------
目次
#contents
-------
*この課題について [#n09e55e3]
-この課題ではスピードと確実性をできる限り両立させたマシンとプログラムを作製しなければならない。
-コースのショートカットをしないようにする。コースアウトをしないようにする。
-主に[[NQC入門]]の[[ここ>NQC入門/5. センサを使う]]を参考にプログラムの開発を行う。
-----------
*この課題の解決への方針 予想される問題点 [#m118daf0]
-この課題では、正確性と迅速性といった相反する性質をマシンに与えることが目標である。しかし、マシンの速度を上げると正確性が落ち、速度を落とせば正確性が上昇するが、迅速性が無くなる。
-マシンを回転させる方法は大きく分けて2種類ある。ひとつは左と右のタイヤを逆に回転させる方法。もうひとつは、片方のタイヤのみを回転させ、もう片方のタイヤを止めるあるいは、トルクをかけないという方法である。
--前者は機敏に動き、後者は滑らかに動くであろうということが予想される。
------------
*マシンの紹介) [#ya896662]
*マシンの紹介 [#ya896662]
***マシンの名前 [#saa248bf]
命名:BE▲GO
-マシンがトレイスをしている感じを見る人により強く印象つけるために、マシンを
%%%小型化%%%
した。
-タッチセンサー郡を小型化することで、マシン全体を小さく、また正方形に近い形することが出来た。これにより、前方のマシンと衝突した場合でも、
%%%反転のための動きで、再び他機と衝突することを防ぐために自機を後退させる必要が無くなり、無駄なアクションを減らすことが出来る。%%%
**マシン作り [#z4ad0dd9]
-マシンを作り、テスト走行させ、改善し、また走らせるという作業を繰り返していくうちに分かったことがあります
+前輪と後輪の距離を広げると、旋回が遅くなり、比較的ゆるく、曲がりやすいコースでもすぐにコースアウトしてしまう。
+前輪と後輪の距離を広げると、回転が遅くなり、比較的ゆるく、曲がりやすいコースでもすぐにコースアウトしてしまう。
+自動車のようなステアリング機構を再現するのは、非常に難しい
+車体の横幅を小さくしたほうがすばやい旋回が出来る
+かといってあまり狭くしすぎても、うまく曲がってくれない
+結局普通のドライブベースが一番安定してる
+結局普通のドライブベースが一番((お手軽でしかも結構編安定している。おまけに抜群の強度を誇る。基本のドライブベース・・・・以外にあなどれないやヤツです。))
----------------
*前方のロボットに接触したら反転して進むロボット [#y7381ced]
前半後半に課題を分けさせてもらいますと、前半となりますこの課題。とりあえず、ライントレースをするプログラムにタッチセンサーに反応があった場合、反転することを命ずる部分を追加した。
-----------
**プログラムの紹介 [#l69cf354]
モーターA 車体左側の動力担当 順回転で前進
モーターC 車体右側の動力担当 順回転で前進
センサー1 光センサー 車体左側の監視を担当
センサー3 光センサー 車体右側の監視を担当
サンサー2 タッチセンサー マシン前方の中央に設置
#define THRESHOLD 40 //閾値
#define TIME 160 //マシンが反転するのにかかる時間、課題1と同様に直前に測定する。
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);//1a //センサー1(左)が光センサーであることを宣言
SetSensor(SENSOR_3, SENSOR_LIGHT);//3c //センサー3(右)も光センサーであることを宣言
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサー2(中央)がタッチセンサーであることを宣言
while(true){
f((SENSOR_1>THRESHOLD)&&(SENSOR_3>THRESHOLD))//1&3w //センサー1(左)と2 (右)が白を感知した場合
{ OnFwd(OUT_A+OUT_C);} 問題なし。ひたすら前進する
{ OnFwd(OUT_A+OUT_C);} 前進する
if((SENSOR_1>THRESHOLD)&&(SENSOR_3<THRESHOLD)) //1w 3b //センサー1(左)が白 センサー3(右)が黒を感知した場合
(マシンが左にずれた場合)
{OnRev(OUT_C); OnFwd(OUT_A);} 右へ急旋回し、軌道の修正を図る
{OnRev(OUT_C); OnFwd(OUT_A);} 右へ回転し、軌道の修正を図る
if((SENSOR_1<THRESHOLD)&&(SENSOR_3>THRESHOLD))//1b 3w //センサー1(左)が黒 センサー3(右)が白を感知した場合
(マシンが右にずれた場合)
{OnRev(OUT_A); OnFwd(OUT_C);} //左へ急旋回し、軌道の修正を図る
{OnRev(OUT_A); OnFwd(OUT_C);} //左へ回転し、軌道の修正を図る
if((SENSOR_1<THRESHOLD)&&(SENSOR_3<THRESHOLD))//1b 3b //センサー1(左)と2(右)が黒を感知してしまった場合
{OnRev(OUT_A);OnFwd(OUT_C);} とりあえず回ってみる
if(SENSOR_2==1) //タッチセンサーに反応があった場合
{OnRev(OUT_A);OnFwd(OUT_C);Wait(TIME);} //180°回転する 。
}
}
-----------
***プログラムの説明、解説 [#s91d13af]
-上記の通り、ライントレイスするように命じるためのプログラムに、タッチセンサーに反応があった場合、反転するプログラムを追加したもの
-[[課題1>2006a/C2/課題1右/program-1]]のように
-両方の光センサーが白を感知している場合モーターACを順回転させ、前進する
-左側のセンサーが黒を感知し、右側のセンサーが白を感知している場合、モーターAを逆回転、モーターCを順回転させ、左回転する
-左側のセンサーが白を感知し、右側のセンサーが黒を感知している場合、モーターAを順回転、モーターCを正回転させ、左回転する
-両方のセンサーが黒を感知してしまった場合、とり合えず回転させてみる。((とりあえずというのはこの命令部分に自信が無いからです。うまくライン上に復帰させることが出来るかどうか・・・))
-上記のプログラムでは、障害物に接触した場合180°回転させることになっていますが、これではカーブで接触した場合、ライン上に復帰できません。しかしこの課題では、『前方のロボットに接触したら反転((位置・動きの方向などが反対になること。また、反対にすること。 〜大辞林 第二版 (三省堂)Excite エキサイト 辞書:国語辞典より))して進む 』という表記から、カーブでの接触は無いだろうと考え、このままにしてあります。
---------------------
*前方のロボットに接触したらそのロボットを右側から追い抜いて再びライン上に戻って進むロボット [#ze40fe3a]
後半にあたりますこちらのプログラム。このプログラムではロボットが接触した場合、右側に避けつつ追い抜いて行くようにプログラムを書いています。
----------------
**プログラムの紹介 [#l140f428]
今回プログラムを作りましたが、全く同じ内容で別の雰囲気を醸し出すプログラムを三つほど作りました。プログラム自体が行っている処理は表面的に見えるところでは全く変化していないはずです。
-switch文を用いたプログラム
--[[2006a/C2/課題2左/program01]]
-if文を主要な部分で用いたプログラム
--[[2006a/C2/課題2左/program02]]
-サブルーチンを用いたプログラム
--[[2006a/C2/課題2左/program03]]
----------------
*反省点 [#p8e92b60]
-うまく時間が取れなくて実際のコースで走行させる機会を作れなかったこと。課題1の場合は実際のコースというものは無く、ただ紙さえあれば、開発を進められたが、今回はコースがないと思うように作業を進められなかった。
-今回のチームは、全員が寮生であったため、「いつでも作業できるや」とか、「夜中でも作業できるからいいや」などといった怠け心がはたらき、マシン、プログラムの開発が遅れた。
*先生及びTAの方々のコメント [#x6621bd3]
学生にとって、先生そしてTAのアドバイスは三度の飯より重要です。
プログラムやマシン・レポートの良い点・悪い点・改良するべき点などがございましたら、どんな些細なことでもよろしいので、お書きくださいませ。
-教員のコメントよりもTAのコメントのほうが役に立つ場合も多いのでTAにもアドバイスを求めましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:01:29};
-文法上の話ではありませんが、それなりに意味のある定数名や変数名は多少長くなっても役割がわかりやすい名前にしましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:03:09};
-後半の switch を使用したプログラムについて。switchを使わず、ifの中に直接それぞれの場合の命令を記述したほうが簡明なプログラムになると思います。マクロも活用しましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:07:58};
-半角のカタカナを使うのは止めましょう。 -- [[松本(教員)]] &new{2006-06-14 (水) 10:09:23};
-流れがつかみやすいレポートでなかなかよいのではないでしょうか。また同じタスクを複数のプログラムで表現してあることも評価できます。あと苦労した点についてのまとめや、マシンの詳細や組み立て時の情報などを付け加えるとよりすばらしいレポートとなるでしょう&wink; とりあえず限りなく◎に近い○としておきます。-- [[まいける(TA)]] &new{2006-06-16 (金) 00:38:31};
#comment
----------------
RIGHT:[[ロボティクス入門ゼミ]]
RIGHT:[[2006a/C2]]
-------------------
-----------
--------