2019a/Member/ohta/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
目次
#contents
*課題について [#va34cc61]
**課題の内容 [#g93b83e2]
下の図のようなコースを各チームで作成し、「ミッション」を...
ミッションの内容等は [[2019a/Mission2]]を参照。
#ref(2019a/Member/ohta/Mission2/課題コース.png,50%,課題コ...
**選んだコース [#q0bf97ed]
私たちのグループは以下のようなコースを選択した。~
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E →...
→ G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(...
→ K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
**コースに関する戦略 [#yadb5565]
私たちの班は以下のようにこのコースを進む作戦を立てた。~
#ref(2019a/Member/ohta/Mission2/コース.png,50%,コース)
スタート地点からまっすぐ進んだ後、右側の直線をライントレ...
交差点?(図では交?)では交差点で一時停止後、直進する。~
それまでの過程を緑→で表している。~
その後、K地点からボールをキャッチするまでは手動で設定して...
その過程を青→で表している。~
最後は左側の直線をライントレースしていき、ゴール直前で球...
それまでの過程をオレンジ→で表している。~
ライントレースや交差点での動作(プログラミング)の仕組みに...
*ロボットについて [#e6876581]
**全体のパーツ [#y3762732]
主なパーツは車体、本体、アーム、光センサーである。~
詳しくは以下の写真を参照。~
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0001.jpg,...
**ロボット全体像 [#d3cbddf7]
#ref(2019a/Member/ohta/Mission2/全体図.jpg,20%,全体像)
上の写真が今回作成したロボットの全体である。~
写真左向きが前方向である。~
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0008.jpg,...
前方には光センサーがついており、これが色の明度を測りプロ...
後方にはアームがついており、これがピンポン玉をキャッチす...
今回は前回の課題で失敗した点、車体の重さで後輪がスムーズ...
重心を前方に持ってくることで克服している。
**ケーブルの収納 [#b279f47e]
#ref(2019a/Member/ohta/Mission2/ケーブル.jpg,20%,コード)
今回工夫した点の一つが、このケーブル収納である。~
この課題では、モータ3つ分+センサー1つ分の4つのケーブルを...
そのため必然的にケーブルがごちゃごちゃしてしまい、時とし...
邪魔してしまう可能性がある。それを解決するのがこの収納で...
この囲い部分にくるくる巻き付けることでコンパクトに装着で...
収納時の写真は [[#d3cbddf7]] を参照。~
**アームの構造 [#o909993d]
これが作成したアームである。~
一方の指は固定されており、もう片方の指が歯車でモータと連...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0003.jpg,...
-球のキャッチ~
可動する指が閉まることで球を挟みキャッチする単純な構造で...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0010.jpg,...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0009.jpg,...
-球のシュート~
挟んでいる状態から可動指が開く。そしてアームの空いた方向...
それにより、固定指が球を押し出す。このようにしてゴールに...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0027.jpg,...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0026.jpg,...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0025.jpg,...
*プログラミングについいて [#e208e56b]
**使用した定義 [#dea9a98f]
-値~
以下の定義は後述するプログラミングに使う値を定義したもの...
この部分を変更するだけでいちいち関数に組み込んだの値を変...
#define MOVE_TIME 250 //ライントレースの条件用の時間(...
#define SPEED_H 35 //スピードの値(統一することで簡易化)
#define SPEED_L 20
#define B1 43 //明度の値(詳細は後述)
#define G 53
#define W1 59
#define W2 61
-OnRL~
この定義はOnRL(x,y)とした時、x=(モーターBの速さ)y=(モータ...
モーターBが右の車輪、モーターCが左の車輪に連携していて、...
ことで車体が前後運動、方向転換を行うことができる。~
この定義により後述する定義等の簡略化に貢献している。~
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
-前後運動、方向転換~
--前進
#define go_straight OnRL(SPEED_H,SPEED_H);
--旋回(急激な方向転換)
#define rot_r OnRL(-SPEED_L,SPEED_L); //右旋回
#define rot_l OnRL(SPEED_L,-SPEED_L); //左旋回
--回転(緩やかな方向転換)
#define turn_r OnRL(0,SPEED_L); //右回転
#define turn_l OnRL(SPEED_L,0); //左回転
--アームの開閉
#define arm_open OnRev(OUT_A,20);Wait(1000);Off(OUT_A); ...
#define arm_close OnFwd(OUT_A,30);Wait(600);Off(OUT_A); ...
**subルーチンについて [#adc6e636]
今回作ったサブルーチン関数は以下の通りである。
-ライントレース[follow_line]~
この関数は光センサーでコースの線の明度を計測し、~
条件に沿って指定した動作をしながら線上を動ていくものだ。~
以下がその関数である。~
--左側の直線トレース
sub follow_line_l()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_r;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_r;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_l;t0=CurrentTick();
}
else{
rot_l;
}
}
}
--右側の直線トレース
sub follow_line_r()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_l;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_l;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_r;t0=CurrentTick();
}
else{
rot_r;
}
}
}
詳細について述べていく。今回は左側直線トレースを取り上げ...
光センサーがコースの線路の明度を計測。明度ごとに設定され...
明度と命令の設定は以下。~
#ref(2019a/Member/ohta/Mission2/表.png,50%,ライン)
この表を図化したものが以下である。~
緑→が前進、オレンジ→が回転、青→が旋回を示している。~
(*見やすくするため、〇の中の数字は定義した値にしている...
#ref(2019a/Member/ohta/Mission2/ライン制御.png,50%,ライン)
「follow_line_l」をフローチャート化すると次のようになる。
#ref(2019a/Member/ohta/Mission2/チャート改.png,65%,チャー...
始めにCurrentTickをt0に(リセット)する。~
次に「CurrentTick()-t0<MOVE_TIME」によってCurrentTick...
MOVE_TIME(250)を超えるまでwhileの中をループし続ける。~
while文の中にはif文、else文で構成されていて、光センサ...
異なるようになっている。光センサーの値が43より大きい...
CurrentTickの値は命令遂行後、常にリセットされ、ループ...
しかし光センサーの値が45以下の時(黒の時)、CurrentTi...
この状態が一定の時間(MOVE_TIME)続くことで、交差点で...
このループから抜け、止まる構造となっている。~
-交差点での動作~
ライントレース中、交差点と判断して止まった後の動作は3つに...
--交差点を緩やかに直進[cross_line_1]~
sub cross_line_1()
{
while(SENSOR_1<W1){
go_straight;
}
while(SENSOR_1>G){
turn_l;
}
Off(OUT_BC);
}
--交差点を急激に直進[cross_line_2]~
sub cross_line_2()
{
while(SENSOR_1<W1){
go_straight;
}
while(SENSOR_1>G){
rot_l;
}
Off(OUT_BC);
}
今回は右側直線トレース後の交差点なので右側での交差点直進...
この2つの関数の仕組みは同じである。~
まず交差点で停止後、設定明度〈白〉を見つけるまで直進する。~
車体は右側に傾いているので直進すれば白色(線路以外の場所)...
白を見つけたら、設定明度〈灰〉をみつけるまで~
緩い直進であれば左回転、急激な直進であれば左旋回をする。~
灰を見つけたら停止する。
#ref(2019a/Member/ohta/Mission2/交差点改.png,50%,交差点)
--交差点を直角に曲がる[follow_line_r]~
交差点で停止後、直角に曲がる場合は再度「follow_line」を命...
そのままライントレースをし続け直角に曲がることができる。~
今回のコースでは右に曲がるのみなので「follow_line_r」のみ...
-交差点での停止[short_break]~
このミッションでは「交差点では1秒間停止し、丁字路では直角...
を義務づけている。そのためこの関数を挟むことでその条件を...
sub short_break()
{
Off(OUT_BC);
Wait(1000);
}
-球をキャッチする[ball_catch]~
コースのK地点から球をキャッチするまでは手動のプログラミン...
それが以下の関数である。キャッチの仕組みに関しては [[#o90...
sub ball_catch()
{
rot_l; //左旋回
Wait(350);
Off(OUT_BC);
go_straight; //前進
Wait(2000);
Off(OUT_BC);
OnRL(-SPEED_L,0); //右車輪を後転させ右回転
Wait(1000);
Off(OUT_B);
OnRL(-SPEED_L,-SPEED_L); //後退
Wait(1500);
Off(OUT_BC);
arm_close; //アームを閉じる
rot_r;
Wait(1300);
go_straight; //前進
Wait(800);
Off(OUT_BC);
}
-球をシュート、車体もゴール[shoot_goal]~
左側の直線をトレースしてM地点に到達した後の関数である。~
この関数は球をシュートして車体本体がゴールするまでの関数...
シュートの仕方については [[#o909993d]] を参照。~
sub shoot_goal()
{
rot_l; //左旋回
Wait(300);
Off(OUT_BC);
go_straight;//前進(ゴールに対して横向きになる)
Wait(1300);
arm_open; //アームを開く
rot_l; //左旋回(動作に合わせて球をシュート)
Wait(500);
Off(OUT_BC);
go_straight;//前進(車体がゴール)
Wait(500);
Off(OUT_BC);
}
**メインプログラム [#m1a442bb]
以上のサブルーチン関数を使用してロボットがスタートしボー...
シュートをしてゴールするまでの動作のプログラミングをして...
以下がメインのプログラミングだ。~
*コース地点の名前は [[#q0bf97ed]] を参照。~
task main()
{
go_straight; //スタート(A)〜B
Wait(1000);
Off(OUT_BC);
follow_line_r(); //B〜C(T字路)
cross_line_1(); //T字路直進
follow_line_r(); //C〜D(交差点)
short_break(); //交差点のため一時停止
cross_line_1(); //交差点直進
follow_line_r(); //D〜E
follow_line_r();
follow_line_r(); //E〜F
follow_line_r();
follow_line_r(); //F〜H
cross_line_2(); //H(T字路直進)
follow_line_r(); //H〜I
cross_line_2(); //I(T字路直進)
follow_line_r(); //I〜J
follow_line_r(); //J〜K
ball_catch(); //K〜球キャッチ
follow_line_l(); //L〜M
shoot_goal(); //M〜球シュート〜ゴール
}
*感想 [#a6751cd0]
**ロボットに関して [#l6947958]
今回はペアの人がロボット作りが上手で前回のような課題点も...
動くロボットを作れた。またアーム部分ではシュート動作が工...
**プログラミングに関して [#wc1f2ec2]
サブルーチン関数を使うことにより、メインプログラムを簡略...
またNXTの取説を参考にしたOnRLの定義はサブルーチン関数も含...
簡略化することに貢献してくれたのでこれからも使用していき...
**全体を通して [#i55b5170]
この課題はミッションをうまくこなすことができた。ペアとの...
ロボットが得意なペアの人はロボット作りを、プログラミング...
プログラミングを主に分担することで作業の効率化ができた。~
次の課題でもこの成功点を生かして取り組んでいきたい。
終了行:
[[2019a/Member]]
目次
#contents
*課題について [#va34cc61]
**課題の内容 [#g93b83e2]
下の図のようなコースを各チームで作成し、「ミッション」を...
ミッションの内容等は [[2019a/Mission2]]を参照。
#ref(2019a/Member/ohta/Mission2/課題コース.png,50%,課題コ...
**選んだコース [#q0bf97ed]
私たちのグループは以下のようなコースを選択した。~
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E →...
→ G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(...
→ K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
**コースに関する戦略 [#yadb5565]
私たちの班は以下のようにこのコースを進む作戦を立てた。~
#ref(2019a/Member/ohta/Mission2/コース.png,50%,コース)
スタート地点からまっすぐ進んだ後、右側の直線をライントレ...
交差点?(図では交?)では交差点で一時停止後、直進する。~
それまでの過程を緑→で表している。~
その後、K地点からボールをキャッチするまでは手動で設定して...
その過程を青→で表している。~
最後は左側の直線をライントレースしていき、ゴール直前で球...
それまでの過程をオレンジ→で表している。~
ライントレースや交差点での動作(プログラミング)の仕組みに...
*ロボットについて [#e6876581]
**全体のパーツ [#y3762732]
主なパーツは車体、本体、アーム、光センサーである。~
詳しくは以下の写真を参照。~
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0001.jpg,...
**ロボット全体像 [#d3cbddf7]
#ref(2019a/Member/ohta/Mission2/全体図.jpg,20%,全体像)
上の写真が今回作成したロボットの全体である。~
写真左向きが前方向である。~
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0008.jpg,...
前方には光センサーがついており、これが色の明度を測りプロ...
後方にはアームがついており、これがピンポン玉をキャッチす...
今回は前回の課題で失敗した点、車体の重さで後輪がスムーズ...
重心を前方に持ってくることで克服している。
**ケーブルの収納 [#b279f47e]
#ref(2019a/Member/ohta/Mission2/ケーブル.jpg,20%,コード)
今回工夫した点の一つが、このケーブル収納である。~
この課題では、モータ3つ分+センサー1つ分の4つのケーブルを...
そのため必然的にケーブルがごちゃごちゃしてしまい、時とし...
邪魔してしまう可能性がある。それを解決するのがこの収納で...
この囲い部分にくるくる巻き付けることでコンパクトに装着で...
収納時の写真は [[#d3cbddf7]] を参照。~
**アームの構造 [#o909993d]
これが作成したアームである。~
一方の指は固定されており、もう片方の指が歯車でモータと連...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0003.jpg,...
-球のキャッチ~
可動する指が閉まることで球を挟みキャッチする単純な構造で...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0010.jpg,...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0009.jpg,...
-球のシュート~
挟んでいる状態から可動指が開く。そしてアームの空いた方向...
それにより、固定指が球を押し出す。このようにしてゴールに...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0027.jpg,...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0026.jpg,...
#ref(2019a/Member/ohta/Mission2/ロボット_190718_0025.jpg,...
*プログラミングについいて [#e208e56b]
**使用した定義 [#dea9a98f]
-値~
以下の定義は後述するプログラミングに使う値を定義したもの...
この部分を変更するだけでいちいち関数に組み込んだの値を変...
#define MOVE_TIME 250 //ライントレースの条件用の時間(...
#define SPEED_H 35 //スピードの値(統一することで簡易化)
#define SPEED_L 20
#define B1 43 //明度の値(詳細は後述)
#define G 53
#define W1 59
#define W2 61
-OnRL~
この定義はOnRL(x,y)とした時、x=(モーターBの速さ)y=(モータ...
モーターBが右の車輪、モーターCが左の車輪に連携していて、...
ことで車体が前後運動、方向転換を行うことができる。~
この定義により後述する定義等の簡略化に貢献している。~
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
-前後運動、方向転換~
--前進
#define go_straight OnRL(SPEED_H,SPEED_H);
--旋回(急激な方向転換)
#define rot_r OnRL(-SPEED_L,SPEED_L); //右旋回
#define rot_l OnRL(SPEED_L,-SPEED_L); //左旋回
--回転(緩やかな方向転換)
#define turn_r OnRL(0,SPEED_L); //右回転
#define turn_l OnRL(SPEED_L,0); //左回転
--アームの開閉
#define arm_open OnRev(OUT_A,20);Wait(1000);Off(OUT_A); ...
#define arm_close OnFwd(OUT_A,30);Wait(600);Off(OUT_A); ...
**subルーチンについて [#adc6e636]
今回作ったサブルーチン関数は以下の通りである。
-ライントレース[follow_line]~
この関数は光センサーでコースの線の明度を計測し、~
条件に沿って指定した動作をしながら線上を動ていくものだ。~
以下がその関数である。~
--左側の直線トレース
sub follow_line_l()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_r;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_r;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_l;t0=CurrentTick();
}
else{
rot_l;
}
}
}
--右側の直線トレース
sub follow_line_r()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<MOVE_TIME){
if(SENSOR_1>W1){
rot_l;t0=CurrentTick();
}
else if(SENSOR_1>W2){
turn_l;t0=CurrentTick();
}
else if(SENSOR_1>G){
go_straight;t0=CurrentTick();
}
else if(SENSOR_1>B1){
turn_r;t0=CurrentTick();
}
else{
rot_r;
}
}
}
詳細について述べていく。今回は左側直線トレースを取り上げ...
光センサーがコースの線路の明度を計測。明度ごとに設定され...
明度と命令の設定は以下。~
#ref(2019a/Member/ohta/Mission2/表.png,50%,ライン)
この表を図化したものが以下である。~
緑→が前進、オレンジ→が回転、青→が旋回を示している。~
(*見やすくするため、〇の中の数字は定義した値にしている...
#ref(2019a/Member/ohta/Mission2/ライン制御.png,50%,ライン)
「follow_line_l」をフローチャート化すると次のようになる。
#ref(2019a/Member/ohta/Mission2/チャート改.png,65%,チャー...
始めにCurrentTickをt0に(リセット)する。~
次に「CurrentTick()-t0<MOVE_TIME」によってCurrentTick...
MOVE_TIME(250)を超えるまでwhileの中をループし続ける。~
while文の中にはif文、else文で構成されていて、光センサ...
異なるようになっている。光センサーの値が43より大きい...
CurrentTickの値は命令遂行後、常にリセットされ、ループ...
しかし光センサーの値が45以下の時(黒の時)、CurrentTi...
この状態が一定の時間(MOVE_TIME)続くことで、交差点で...
このループから抜け、止まる構造となっている。~
-交差点での動作~
ライントレース中、交差点と判断して止まった後の動作は3つに...
--交差点を緩やかに直進[cross_line_1]~
sub cross_line_1()
{
while(SENSOR_1<W1){
go_straight;
}
while(SENSOR_1>G){
turn_l;
}
Off(OUT_BC);
}
--交差点を急激に直進[cross_line_2]~
sub cross_line_2()
{
while(SENSOR_1<W1){
go_straight;
}
while(SENSOR_1>G){
rot_l;
}
Off(OUT_BC);
}
今回は右側直線トレース後の交差点なので右側での交差点直進...
この2つの関数の仕組みは同じである。~
まず交差点で停止後、設定明度〈白〉を見つけるまで直進する。~
車体は右側に傾いているので直進すれば白色(線路以外の場所)...
白を見つけたら、設定明度〈灰〉をみつけるまで~
緩い直進であれば左回転、急激な直進であれば左旋回をする。~
灰を見つけたら停止する。
#ref(2019a/Member/ohta/Mission2/交差点改.png,50%,交差点)
--交差点を直角に曲がる[follow_line_r]~
交差点で停止後、直角に曲がる場合は再度「follow_line」を命...
そのままライントレースをし続け直角に曲がることができる。~
今回のコースでは右に曲がるのみなので「follow_line_r」のみ...
-交差点での停止[short_break]~
このミッションでは「交差点では1秒間停止し、丁字路では直角...
を義務づけている。そのためこの関数を挟むことでその条件を...
sub short_break()
{
Off(OUT_BC);
Wait(1000);
}
-球をキャッチする[ball_catch]~
コースのK地点から球をキャッチするまでは手動のプログラミン...
それが以下の関数である。キャッチの仕組みに関しては [[#o90...
sub ball_catch()
{
rot_l; //左旋回
Wait(350);
Off(OUT_BC);
go_straight; //前進
Wait(2000);
Off(OUT_BC);
OnRL(-SPEED_L,0); //右車輪を後転させ右回転
Wait(1000);
Off(OUT_B);
OnRL(-SPEED_L,-SPEED_L); //後退
Wait(1500);
Off(OUT_BC);
arm_close; //アームを閉じる
rot_r;
Wait(1300);
go_straight; //前進
Wait(800);
Off(OUT_BC);
}
-球をシュート、車体もゴール[shoot_goal]~
左側の直線をトレースしてM地点に到達した後の関数である。~
この関数は球をシュートして車体本体がゴールするまでの関数...
シュートの仕方については [[#o909993d]] を参照。~
sub shoot_goal()
{
rot_l; //左旋回
Wait(300);
Off(OUT_BC);
go_straight;//前進(ゴールに対して横向きになる)
Wait(1300);
arm_open; //アームを開く
rot_l; //左旋回(動作に合わせて球をシュート)
Wait(500);
Off(OUT_BC);
go_straight;//前進(車体がゴール)
Wait(500);
Off(OUT_BC);
}
**メインプログラム [#m1a442bb]
以上のサブルーチン関数を使用してロボットがスタートしボー...
シュートをしてゴールするまでの動作のプログラミングをして...
以下がメインのプログラミングだ。~
*コース地点の名前は [[#q0bf97ed]] を参照。~
task main()
{
go_straight; //スタート(A)〜B
Wait(1000);
Off(OUT_BC);
follow_line_r(); //B〜C(T字路)
cross_line_1(); //T字路直進
follow_line_r(); //C〜D(交差点)
short_break(); //交差点のため一時停止
cross_line_1(); //交差点直進
follow_line_r(); //D〜E
follow_line_r();
follow_line_r(); //E〜F
follow_line_r();
follow_line_r(); //F〜H
cross_line_2(); //H(T字路直進)
follow_line_r(); //H〜I
cross_line_2(); //I(T字路直進)
follow_line_r(); //I〜J
follow_line_r(); //J〜K
ball_catch(); //K〜球キャッチ
follow_line_l(); //L〜M
shoot_goal(); //M〜球シュート〜ゴール
}
*感想 [#a6751cd0]
**ロボットに関して [#l6947958]
今回はペアの人がロボット作りが上手で前回のような課題点も...
動くロボットを作れた。またアーム部分ではシュート動作が工...
**プログラミングに関して [#wc1f2ec2]
サブルーチン関数を使うことにより、メインプログラムを簡略...
またNXTの取説を参考にしたOnRLの定義はサブルーチン関数も含...
簡略化することに貢献してくれたのでこれからも使用していき...
**全体を通して [#i55b5170]
この課題はミッションをうまくこなすことができた。ペアとの...
ロボットが得意なペアの人はロボット作りを、プログラミング...
プログラミングを主に分担することで作業の効率化ができた。~
次の課題でもこの成功点を生かして取り組んでいきたい。
ページ名: