2016b/Member/pen/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016b/Member]]&br;
目次&br;
#contents
*初めに [#v1b14758]
今回の課題では、文字(漢字7画以上)をロボットで書くという...
NXTを使いどのような構成でロボットを作り、プログラムを考え...
*構想 [#l15685e5]
まずロボット自体の構造として、&br;
+ロボット自身が走行して文字を書く
--初めから動きをプログラミングする
--光センサーで最初に文字をトレースし、そのデータを元に再...
+ロボットをXYで制御して書く
--プリンターのようにX軸を1進め、その一列に存在するY軸の書...
--一画ずつ制御する(一筆書き)
以上のことを考えたが、そもそもレゴ初心者+ロボット初心者+...
過去のレポートを参考にしつつ、ロボットを自走し、その経路...
*ロボット本体 [#w7351ffc]
今回ロボットの制作にあたり、4世代の改良を行った&br;
実際に文字を書くのに行き着いたのは、2世代と3世代である。&...
&ref(2016b/Member/pen/Mission1/robo_1.jpg,50%,2世代);
まず最初の機体を作る上で考慮したのは、ペンを回転軸の中心...
中心にペンがない場合、プログラミングにおいて誤差を考慮し...
ただ動かすだけではうまく行かないと考えたからです。&br;
初期型は考えなしに作りましたが、ペンの筆圧が不安定でした...
原因としては、使っているマイネームが、レゴのパーツと大き...
これを解消すべく2号機ではレゴの棒を使うことにより、骨組み...
初号機のゴムでの固定をやめ、挟み込む設計に変更しました。&...
ペンの機構はモジュール化し、改良がしやすいように工夫をし...
&ref(2016b/Member/pen/Mission1/pen_1.jpg,50%,ペンモジュー...
三号機は、発表会でのペンが引っかかる問題への解決策として...
ペンの機構自体を高めに変更して、なるべく垂直になり、
かつ、前後の運動に強くなるように、二箇所による固定をする...
&ref(2016b/Member/pen/Mission1/robo_2.jpg,50%,3号機);&br;
*プログラミング [#kb2c2876]
今回は角度制御を行ってなるべく簡単に(誤差があると思われ...
動かし書くことができるようなプログラム&br;
にしていきたいと思い考えました。
**角度制御 [#le14cabf]
角度制御では、&br;
RotateMotor(OUT_AB,p,a) //pはモーター出力、...
RotateMotorEx(OUT_AB,p,a,s,true,true)//pはモーター出力、...
を使った。&br;
資料にも乗っているが、こちらのサイトにかなり関数がまとま...
http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/group___...
&br;
メインタスクでこのような関数を書き込み続けたら、読めなく...
#define move_AB(p,a) ResetTachoCount(OUT_AB);RotateMotor...
#define turn_AB(p,a,s) ResetTachoCount(OUT_AB);RotateMot...
と定義した。※ResetTachoCount(OUT_AB)を行っているのは、後...
**NXTに計算させてみよう(サブルーチン) [#xd8bdd66]
この定義によってかなり短く出来たが、これでも毎回回転する...
NXT自体に計算させることにした。&br;
//計算ルーチンはじめ
float Calculation_move_AB(float d)//全身、後退したい(cm)...
{
const float diameter=56; //タイヤの直径(mm指定),cons...
const float pi=3.1415; //円周率(π)
float ang = -1*(d*10)*360/(pi*diameter); //前進に必要...
return ang; //ルーチンを呼び出したところに値を返す
}
float calculation_turn_AB(float u)//その場でロボット本体...
{
const float interval_of_tire=134; //タイヤの間隔(mm...
const float diameter=56; //タイヤの直径(mm指定)
float ang = interval_of_tire*u/diameter; //全身に必要...
return ang; //ルーチンを呼び出したところに値 を返...
}
//計算ルーチン終わり
これは資料に乗っていたものを参考にし、前進後退用と、回転...
**もっとtask mainに書くコード短くしたいな編 [#l160cc81]
#define ですでに角度制御を行うマクロを作ったが、それでも
task main()
{
turn_AB(p,calculation_turn_AB(d),s)
・・・・・以下に続く
}
のように書くのは長くて辛いと感じました
そこで新たにマクロを短くできないのかということで&br;
#define move_AB_cm(p,c) move_AB(p,Calculation_move_AB(c)...
#define turn_AB_Degree(p,d,s) turn_AB(p,calculation_turn...
を定義しました。&br;
そしてよく使う&br;
45度&br;
90度&br;
180度&br;
を、すぐに呼び出せるように
#define turn_180 turn_AB_Degree(power,180,+100); //180...
#define turn_45r turn_AB_Degree(power,45,+100); //右に...
#define turn_45l turn_AB_Degree(power,45,-100); //左に...
#define turn_90r turn_AB_Degree(power,90,+100); //右に...
#define turn_90l turn_AB_Degree(power,90,-100); //左に...
#define turn_135r turn_AB_Degree(power,135,+100); //右...
#define turn_135l turn_AB_Degree(power,135,-100); //左...
と定義したので
task main()
{
turn_90l
}
とするだけで、90左ターンしてくれるようになりました。
これなら何度見ても可読性が高いのでなんとかなります。&br;
**45度問題 [#xfcf6d31]
メインタスクに書き込む文字を簡単にできるようになったので...
turn_90l
などを20回など繰り返しおこない、タイヤの間隔の誤差を修正...
45度の時だけ、2回目以降の駆動がよく回らない現象に出くわし...
要するに、1回目の45度では45度ロボットが回れるぐらいにモー...
二回目以降明らかに回転が足りない、
ということです。
不思議なことにこの現象は45度の左右のみでしか起らないとい...
計算ルーチンはうまく動いているはずなのになぜうまく行かな...
**45度問題への解決策 [#e9e1548d]
NXT自身のスペックは高くないというディスリスペクトをしてく...
定義を
#define turn_180 turn_AB(power,471,+100); //180度ターン
#define turn_45r turn_AB(power,108,+100); //右に45度...
#define turn_45l turn_AB(power,108,-100); //左に45度...
#define turn_90r turn_AB(power,217,+100); //右に90度...
#define turn_90l turn_AB(power,190,-100); //左に90度...
#define turn_135r turn_AB(power,323,+100); //右に135...
#define turn_135l turn_AB(power,323,-100); //左に135...
に変更して、一々値を計算しないように変更を行いました。
変更したところも45度問題はなくなりましたが、なぜこのよう...
実際のところ、電卓の変数機能を使って計算すれば、NXTに計算...
ですが、前後の移動は流石に数が多いので、計算ルーチンを引...
※問題は起きていないので&br;
**ペンの稼働のための定義 [#l927ca33]
これもできるだけ短くかつ、わかりやすくしたいので、マクロ...
#define on ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,4...
#define off ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,...
ここで動かくモーターの角度は、世代ごとに異なるのでその都...
*文字を書いてみよう!編 [#m3f8151c]
前置きが長くなりましたがこれで、コンパクトに文字を書く時...
今回挑戦したのは「食」です。
これを選んだ理由は、45,90,180,135度のターンと直線ができれ...
文字の設計段階では、文字を正方形のブロックをベースとして...
&ref(2016b/Member/pen/Mission1/syoku_sekkeizu.jpeg,50%,設...
#define power 30 //モーターの出力を一律に設定する
#define move_AB(p,a) RotateMotor(OUT_AB,p,a); //(p=出...
#define turn_AB(p,a,s) RotateMotorEx(OUT_AB,p,a,s,true,t...
#define move_AB_cm(p,c) move_AB(p,Calculation_move_AB(c)...
#define turn_AB_Degree(p,d,s) turn_AB(p,calculation_turn...
#define turn_180 turn_AB(power,471,+100); //180度ターン
#define turn_45r turn_AB(power,108,+100); //右に45度...
#define turn_45l turn_AB(power,108,-100); //左に45度...
#define turn_90r turn_AB(power,217,+100); //右に90度...
#define turn_90l turn_AB(power,190,-100); //左に90度...
#define turn_135r turn_AB(power,323,+100); //右に135...
#define turn_135l turn_AB(power,323,-100); //左に135...
#define on ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,4...
#define off ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,...
#define move(c) move_AB_cm(power,c) //move_AB_cmのモータ...
//計算ルーチンはじめ
float Calculation_move_AB(float d) //全身、後退した...
{
const float diameter=56; //タイヤの直径(mm指定),c...
const float pi=3.1415; //円周率(π)
float ang = 1*(d*10)*360/(pi*diameter); //前進に...
return ang; //ルーチンを呼び出したところに値を...
}
float calculation_turn_AB(float u) //その場でロボッ...
{
const float interval_of_tire=134; //タイヤの間隔(...
const float diameter=56; //タイヤの直径(mm指定)
float ang = interval_of_tire*u/diameter; //全身に必...
return ang; //ルーチンを呼び出したところに値 を...
}
//計算ルーチン終わり
task main()
{
const float x=0.5; //xは全体の拡大率(cm)
const float sqrt_2=1.41421356237; //√2の値
turn_45r;
on; //一画目
move(4*sqrt_2*x); //xによって文字の大きさを...
off;
turn_180;
move(4*sqrt_2*x);
turn_90r;
on; //2画目
move(3*sqrt_2*x);
off;
turn_180;
move(3*sqrt_2*x);
turn_135l;
on; //3画目
move(4*x);
off;
turn_90r;
move(2*x);
turn_180;
on; //4画目
move(4*x);
turn_90r;
move(3*x);
off;
turn_90r;
move(4*x);
turn_90r;
move(1.5*x);
turn_90r;
on; //5画目
move(4*x);
off;
turn_90r;
move(1.5*x);
turn_90r;
move(4*x);
turn_180;
on; //6画目
move(4*x);
off;
turn_90l;
move(3*x);
turn_90l;
move(4*x);
turn_90l;
on; //7画目
move(8*x);
turn_135l;
move(2*sqrt_2*x);
off;
turn_90r;
move(2*sqrt_2*x);
turn_45r;
move(x);
turn_135r;
on; //8画目
move(5*sqrt_2*x);
off;
turn_180;
move(1.5*sqrt_2*x);
on; //9画目
turn_90r;
move(2*sqrt_2*x);
off;
}
**実際に書いてみて [#rd1f2a37]
&ref(2016b/Member/pen/Mission1/taberu.jpg,50%,実際に書い...
カレンダー級の大きさで書いた時は、あまり気にならなかった...
画像では5cm*7cmの枠に入るサイズで書かれている
原因としては、&br;
-完璧には中心を捉えきれていないこと
-移動中にペンがずれてしまうこと
-積み重なるターン時の誤差
-ペンを垂直におろしきれていないので、ペンの着地地点がずれる
等が考えられる。&br;
*まとめ [#qddb9965]
プログラミング自体は厳格にしなければならないが、ロボット...
一番身にしみたのは、コンパイルエラーは、「コンパイルした...
マクロや、ルーチンを組んでいる場合、そちらにエラーがあっ...
エラーにならないということを考えると、マクロも複雑になら...
実際にロボコンに参加している人は裏でかなり苦労しているこ...
今回はロボットを出来る限りの問題に対応できるよう考えて作...
今回の経験を元に、新しいロボットを作っていけるようにして...
そして、今回の課題を作る上で、いろいろと協力してくれた受...
ありがとうございました。
終了行:
[[2016b/Member]]&br;
目次&br;
#contents
*初めに [#v1b14758]
今回の課題では、文字(漢字7画以上)をロボットで書くという...
NXTを使いどのような構成でロボットを作り、プログラムを考え...
*構想 [#l15685e5]
まずロボット自体の構造として、&br;
+ロボット自身が走行して文字を書く
--初めから動きをプログラミングする
--光センサーで最初に文字をトレースし、そのデータを元に再...
+ロボットをXYで制御して書く
--プリンターのようにX軸を1進め、その一列に存在するY軸の書...
--一画ずつ制御する(一筆書き)
以上のことを考えたが、そもそもレゴ初心者+ロボット初心者+...
過去のレポートを参考にしつつ、ロボットを自走し、その経路...
*ロボット本体 [#w7351ffc]
今回ロボットの制作にあたり、4世代の改良を行った&br;
実際に文字を書くのに行き着いたのは、2世代と3世代である。&...
&ref(2016b/Member/pen/Mission1/robo_1.jpg,50%,2世代);
まず最初の機体を作る上で考慮したのは、ペンを回転軸の中心...
中心にペンがない場合、プログラミングにおいて誤差を考慮し...
ただ動かすだけではうまく行かないと考えたからです。&br;
初期型は考えなしに作りましたが、ペンの筆圧が不安定でした...
原因としては、使っているマイネームが、レゴのパーツと大き...
これを解消すべく2号機ではレゴの棒を使うことにより、骨組み...
初号機のゴムでの固定をやめ、挟み込む設計に変更しました。&...
ペンの機構はモジュール化し、改良がしやすいように工夫をし...
&ref(2016b/Member/pen/Mission1/pen_1.jpg,50%,ペンモジュー...
三号機は、発表会でのペンが引っかかる問題への解決策として...
ペンの機構自体を高めに変更して、なるべく垂直になり、
かつ、前後の運動に強くなるように、二箇所による固定をする...
&ref(2016b/Member/pen/Mission1/robo_2.jpg,50%,3号機);&br;
*プログラミング [#kb2c2876]
今回は角度制御を行ってなるべく簡単に(誤差があると思われ...
動かし書くことができるようなプログラム&br;
にしていきたいと思い考えました。
**角度制御 [#le14cabf]
角度制御では、&br;
RotateMotor(OUT_AB,p,a) //pはモーター出力、...
RotateMotorEx(OUT_AB,p,a,s,true,true)//pはモーター出力、...
を使った。&br;
資料にも乗っているが、こちらのサイトにかなり関数がまとま...
http://bricxcc.sourceforge.net/nbc/nxcdoc/nxcapi/group___...
&br;
メインタスクでこのような関数を書き込み続けたら、読めなく...
#define move_AB(p,a) ResetTachoCount(OUT_AB);RotateMotor...
#define turn_AB(p,a,s) ResetTachoCount(OUT_AB);RotateMot...
と定義した。※ResetTachoCount(OUT_AB)を行っているのは、後...
**NXTに計算させてみよう(サブルーチン) [#xd8bdd66]
この定義によってかなり短く出来たが、これでも毎回回転する...
NXT自体に計算させることにした。&br;
//計算ルーチンはじめ
float Calculation_move_AB(float d)//全身、後退したい(cm)...
{
const float diameter=56; //タイヤの直径(mm指定),cons...
const float pi=3.1415; //円周率(π)
float ang = -1*(d*10)*360/(pi*diameter); //前進に必要...
return ang; //ルーチンを呼び出したところに値を返す
}
float calculation_turn_AB(float u)//その場でロボット本体...
{
const float interval_of_tire=134; //タイヤの間隔(mm...
const float diameter=56; //タイヤの直径(mm指定)
float ang = interval_of_tire*u/diameter; //全身に必要...
return ang; //ルーチンを呼び出したところに値 を返...
}
//計算ルーチン終わり
これは資料に乗っていたものを参考にし、前進後退用と、回転...
**もっとtask mainに書くコード短くしたいな編 [#l160cc81]
#define ですでに角度制御を行うマクロを作ったが、それでも
task main()
{
turn_AB(p,calculation_turn_AB(d),s)
・・・・・以下に続く
}
のように書くのは長くて辛いと感じました
そこで新たにマクロを短くできないのかということで&br;
#define move_AB_cm(p,c) move_AB(p,Calculation_move_AB(c)...
#define turn_AB_Degree(p,d,s) turn_AB(p,calculation_turn...
を定義しました。&br;
そしてよく使う&br;
45度&br;
90度&br;
180度&br;
を、すぐに呼び出せるように
#define turn_180 turn_AB_Degree(power,180,+100); //180...
#define turn_45r turn_AB_Degree(power,45,+100); //右に...
#define turn_45l turn_AB_Degree(power,45,-100); //左に...
#define turn_90r turn_AB_Degree(power,90,+100); //右に...
#define turn_90l turn_AB_Degree(power,90,-100); //左に...
#define turn_135r turn_AB_Degree(power,135,+100); //右...
#define turn_135l turn_AB_Degree(power,135,-100); //左...
と定義したので
task main()
{
turn_90l
}
とするだけで、90左ターンしてくれるようになりました。
これなら何度見ても可読性が高いのでなんとかなります。&br;
**45度問題 [#xfcf6d31]
メインタスクに書き込む文字を簡単にできるようになったので...
turn_90l
などを20回など繰り返しおこない、タイヤの間隔の誤差を修正...
45度の時だけ、2回目以降の駆動がよく回らない現象に出くわし...
要するに、1回目の45度では45度ロボットが回れるぐらいにモー...
二回目以降明らかに回転が足りない、
ということです。
不思議なことにこの現象は45度の左右のみでしか起らないとい...
計算ルーチンはうまく動いているはずなのになぜうまく行かな...
**45度問題への解決策 [#e9e1548d]
NXT自身のスペックは高くないというディスリスペクトをしてく...
定義を
#define turn_180 turn_AB(power,471,+100); //180度ターン
#define turn_45r turn_AB(power,108,+100); //右に45度...
#define turn_45l turn_AB(power,108,-100); //左に45度...
#define turn_90r turn_AB(power,217,+100); //右に90度...
#define turn_90l turn_AB(power,190,-100); //左に90度...
#define turn_135r turn_AB(power,323,+100); //右に135...
#define turn_135l turn_AB(power,323,-100); //左に135...
に変更して、一々値を計算しないように変更を行いました。
変更したところも45度問題はなくなりましたが、なぜこのよう...
実際のところ、電卓の変数機能を使って計算すれば、NXTに計算...
ですが、前後の移動は流石に数が多いので、計算ルーチンを引...
※問題は起きていないので&br;
**ペンの稼働のための定義 [#l927ca33]
これもできるだけ短くかつ、わかりやすくしたいので、マクロ...
#define on ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,4...
#define off ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,...
ここで動かくモーターの角度は、世代ごとに異なるのでその都...
*文字を書いてみよう!編 [#m3f8151c]
前置きが長くなりましたがこれで、コンパクトに文字を書く時...
今回挑戦したのは「食」です。
これを選んだ理由は、45,90,180,135度のターンと直線ができれ...
文字の設計段階では、文字を正方形のブロックをベースとして...
&ref(2016b/Member/pen/Mission1/syoku_sekkeizu.jpeg,50%,設...
#define power 30 //モーターの出力を一律に設定する
#define move_AB(p,a) RotateMotor(OUT_AB,p,a); //(p=出...
#define turn_AB(p,a,s) RotateMotorEx(OUT_AB,p,a,s,true,t...
#define move_AB_cm(p,c) move_AB(p,Calculation_move_AB(c)...
#define turn_AB_Degree(p,d,s) turn_AB(p,calculation_turn...
#define turn_180 turn_AB(power,471,+100); //180度ターン
#define turn_45r turn_AB(power,108,+100); //右に45度...
#define turn_45l turn_AB(power,108,-100); //左に45度...
#define turn_90r turn_AB(power,217,+100); //右に90度...
#define turn_90l turn_AB(power,190,-100); //左に90度...
#define turn_135r turn_AB(power,323,+100); //右に135...
#define turn_135l turn_AB(power,323,-100); //左に135...
#define on ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,4...
#define off ResetTachoCount(OUT_C);RotateMotor(OUT_C,20,...
#define move(c) move_AB_cm(power,c) //move_AB_cmのモータ...
//計算ルーチンはじめ
float Calculation_move_AB(float d) //全身、後退した...
{
const float diameter=56; //タイヤの直径(mm指定),c...
const float pi=3.1415; //円周率(π)
float ang = 1*(d*10)*360/(pi*diameter); //前進に...
return ang; //ルーチンを呼び出したところに値を...
}
float calculation_turn_AB(float u) //その場でロボッ...
{
const float interval_of_tire=134; //タイヤの間隔(...
const float diameter=56; //タイヤの直径(mm指定)
float ang = interval_of_tire*u/diameter; //全身に必...
return ang; //ルーチンを呼び出したところに値 を...
}
//計算ルーチン終わり
task main()
{
const float x=0.5; //xは全体の拡大率(cm)
const float sqrt_2=1.41421356237; //√2の値
turn_45r;
on; //一画目
move(4*sqrt_2*x); //xによって文字の大きさを...
off;
turn_180;
move(4*sqrt_2*x);
turn_90r;
on; //2画目
move(3*sqrt_2*x);
off;
turn_180;
move(3*sqrt_2*x);
turn_135l;
on; //3画目
move(4*x);
off;
turn_90r;
move(2*x);
turn_180;
on; //4画目
move(4*x);
turn_90r;
move(3*x);
off;
turn_90r;
move(4*x);
turn_90r;
move(1.5*x);
turn_90r;
on; //5画目
move(4*x);
off;
turn_90r;
move(1.5*x);
turn_90r;
move(4*x);
turn_180;
on; //6画目
move(4*x);
off;
turn_90l;
move(3*x);
turn_90l;
move(4*x);
turn_90l;
on; //7画目
move(8*x);
turn_135l;
move(2*sqrt_2*x);
off;
turn_90r;
move(2*sqrt_2*x);
turn_45r;
move(x);
turn_135r;
on; //8画目
move(5*sqrt_2*x);
off;
turn_180;
move(1.5*sqrt_2*x);
on; //9画目
turn_90r;
move(2*sqrt_2*x);
off;
}
**実際に書いてみて [#rd1f2a37]
&ref(2016b/Member/pen/Mission1/taberu.jpg,50%,実際に書い...
カレンダー級の大きさで書いた時は、あまり気にならなかった...
画像では5cm*7cmの枠に入るサイズで書かれている
原因としては、&br;
-完璧には中心を捉えきれていないこと
-移動中にペンがずれてしまうこと
-積み重なるターン時の誤差
-ペンを垂直におろしきれていないので、ペンの着地地点がずれる
等が考えられる。&br;
*まとめ [#qddb9965]
プログラミング自体は厳格にしなければならないが、ロボット...
一番身にしみたのは、コンパイルエラーは、「コンパイルした...
マクロや、ルーチンを組んでいる場合、そちらにエラーがあっ...
エラーにならないということを考えると、マクロも複雑になら...
実際にロボコンに参加している人は裏でかなり苦労しているこ...
今回はロボットを出来る限りの問題に対応できるよう考えて作...
今回の経験を元に、新しいロボットを作っていけるようにして...
そして、今回の課題を作る上で、いろいろと協力してくれた受...
ありがとうございました。
ページ名: