2017b/Member/onodera/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題 [#ee25234f]
今回の課題はピンポン玉&紙コップ回収ロボットの作成である。
決められた場所にあるコップとピンポン玉を指定された別の場...
詳しくは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/...
*ロボットについて [#p0ad5ff6]
私たちのグループのロボットは一度完成させた後にアームの構...
**試作機1 [#u6f2b651]
#ref(./DSC_0181.JPG,50%,車体横)
横から見るとこのような感じでホイールベースが非常に長くな...
#ref(./DSC_0183.JPG,50%,車体上)
NXT本体を二つ並べて設置した。この画像ではUSBポートが車体...
#ref(./DSC_0185.JPG,50%,光センサ)
ホイールベースが長くなってしまった分車体とセンサを近づけ...
&ref(./アーム1.png,30%,アーム1);&ref(./アーム2.png,30%,...
また、アームの構造はモーターを二つ使い片方はポップをつか...
**完成機 [#dea458c0]
#ref(./1518254325726.jpg,70%,完成機)
全体像はこのような感じ
試作機と大きく異なる点はアームと後輪の二点である。
#ref(./1518254323032.jpg,50%,アーム改)
アームの構造をクワガタのような形にしてコップを挟み持ち上...
&ref(./DSC_0184_LI.jpg,50%,後輪);&ref(./1518254329194.jpg...
後輪は試作機では車輪一個であったがそれではこの重い機体を...
その他の部分は試作機と同様。
*作戦[#xfe9bc53]
時間や技術的なことを考えて完璧を目指すつもりは初めからな...
#ref(./2017b-mission3_LI (2).jpg,60%,コース作戦)
区間? 一個目のコップを取りに行く。スタート地点から直進す...
区間? 車体が大きいのでコップをつかんでからほぼ90°右に旋回...
区間? 少し後退してから左に旋回し地点Yのほうへ向く。
区間? そのまま直進し地点Yまで行きコップを置く。トレースで...
基本的に前進、後退、旋回などの動作は電池消費による影響を...
*プログラム [#kea5af38]
直接プログラムを書いたのは自分ではないがわかる限り詳しく...
**マクロ マスター側(タイヤを動かす方) [#wb9a2135]
定義したが結局使わなかったものもあるので使ったものを説明
#define SPEED 55
#define SPEED_SLOW 45
#define SPEED_CURVE 45
#define SPEED_FAST 55
#define THRESHOLD 38
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_FAST,SPEED_FAST);
#define turn_right_high OnRL(-30,SPEED_CURVE);
#define turn_right_low OnRL (0,SPEED_CURVE);
#define turn_left_high OnRL(SPEED_CURVE,-30);
#define turn_left_low OnRL (SPEED_CURVE,0);
#define CONN 1
#define SIGNAL_CATCH 11 //コップをつかむ
#define SIGNAL_RELEASE 12 //コップを離す
#define SIGNAL_UP 13 // アームを上げる
#define SIGNAL_UP1 14 //アームを上げる
#define SIGNAL_DOWN 15 //アームを下げる
**空き缶を探すプログラム [#u0f10117]
これは授業で先生からもらったプリントを参考にした
const float diameter = 5.45; //タイヤの直径
const float track = 10.35; //タイヤのトレ...
const float pi = 3.1415; //円周率
void fwdDist(float d) //距離d前進
{
long angle = d/(diameter*pi)*360.0; //角度を計...
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, tr...
}
void turnAng(long ang) //角度ang度時計回り旋回
{
long angle = track/diameter * ang; //必要なタ...
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true,t...
}
int searchDirection(long ang) //現在の方向...
{
long tacho_min; //最も近い距離を実現するタイ...
int d_min = 300; //最も近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度から...
turnAng(ang/2); //指定された...
ResetTachoCount(OUT_BC); //角度計算を...
OnFwdSync(OUT_BC,SPEED_SLOW,-100); //反時計回り...
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S3)<d_min){ //現在の距離...
d_min = SensorUS(S3); //仮の最小値...
tacho_min = MotorTachoCount(OUT_B); //この時の...
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min || SensorUS(...
Wait(14);
Off(OUT_BC);
Wait(500);
return d_min;
}
**区間?で使用するマクロ [#be1537a4]
90°旋回する時に使用した。
#define Ninety 15.9/(diameter*pi)*360.0 //90°...
#define usetu RotateMotorEx(OUT_BC,40,Ninety,100,true,fa...
**メインタスク マスター側 [#h4bbed47]
task main()
{
SetSensorLight(S2);
RotateMotor(OUT_BC,35,315);
Wait(1000); //...
RotateMotor(OUT_BC,35,320);
Wait(1000);
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_CATCH); /...
Wait(2000);
Wait(1000);
RotateMotor(OUT_C,55,180); //区...
RotateMotor(OUT_B,-55,310);
Wait(1000);
RotateMotor(OUT_BC,35,260); //...
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_UP); //...
Wait(2000);
↓地点Xから地点Yへ移動(区間??の部分)
RotateMotor(OUT_C,-55,360);
RotateMotor(OUT_BC,55,600);
RotateMotor(OUT_B,-55,330);
RotateMotor(OUT_C,55,50);
RotateMotor(OUT_BC,55,900);
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_DOWN); //...
Wait(1500);
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_RELEASE); /...
Wait(2000);
これで区間?〜区間?まで終了。以降二個目のコップを運ぶわけ...
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_UP);
Wait(2000);
RotateMotor(OUT_BC,-55,100);
OnFwd(OUT_B,55);
OnFwd(OUT_C,55);
Wait(1000);
Off(OUT_BC);
SetSensorLowspeed(S3);
int d = searchDirection(60);
if (d > 5){
fwdDist(d-5.0);
}
}
**マクロ スレーブ側(アームを)動かす方 [#c94fe07a]
マスター側と同じ
#define SIGNAL_CATCH 11
#define SIGNAL_RELEASE 12
#define SIGNAL_UP 13
#define SIGNAL_UP1 14
#define SIGNAL_DOWN 15
マスター側からメッセージが送られてきたときif文を使ってス...
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == SIGNAL_CATCH) { //コップをつかむ
OnFwd(OUT_C,40);
Wait(800);
Off(OUT_C);
}else{
if (msg == SIGNAL_RELEASE) { //コップを離す
RotateMotor(OUT_C,-20,38);
}else if
(msg == SIGNAL_UP) { //アームを上げる
RotateMotor(OUT_B,-45,120);
}else if
(msg == SIGNAL_DOWN) { //アームを下げる
RotateMotor(OUT_B,45,94);
}else if
(msg == SIGNAL_UP1) { //アームを上げる
OnFwd(OUT_B,-50);
Wait(1000);
Off(OUT_B);
}
}
}
}
*反省と感想 [#a749baa3]
プログラムの大体はぎりぎりに完成したというわけではないの...
今までの課題を振り返って感じたことは正確なロボットを作る...
終了行:
目次
#contents
*課題 [#ee25234f]
今回の課題はピンポン玉&紙コップ回収ロボットの作成である。
決められた場所にあるコップとピンポン玉を指定された別の場...
詳しくは[[こちら:http://yakushi.shinshu-u.ac.jp/robotics/...
*ロボットについて [#p0ad5ff6]
私たちのグループのロボットは一度完成させた後にアームの構...
**試作機1 [#u6f2b651]
#ref(./DSC_0181.JPG,50%,車体横)
横から見るとこのような感じでホイールベースが非常に長くな...
#ref(./DSC_0183.JPG,50%,車体上)
NXT本体を二つ並べて設置した。この画像ではUSBポートが車体...
#ref(./DSC_0185.JPG,50%,光センサ)
ホイールベースが長くなってしまった分車体とセンサを近づけ...
&ref(./アーム1.png,30%,アーム1);&ref(./アーム2.png,30%,...
また、アームの構造はモーターを二つ使い片方はポップをつか...
**完成機 [#dea458c0]
#ref(./1518254325726.jpg,70%,完成機)
全体像はこのような感じ
試作機と大きく異なる点はアームと後輪の二点である。
#ref(./1518254323032.jpg,50%,アーム改)
アームの構造をクワガタのような形にしてコップを挟み持ち上...
&ref(./DSC_0184_LI.jpg,50%,後輪);&ref(./1518254329194.jpg...
後輪は試作機では車輪一個であったがそれではこの重い機体を...
その他の部分は試作機と同様。
*作戦[#xfe9bc53]
時間や技術的なことを考えて完璧を目指すつもりは初めからな...
#ref(./2017b-mission3_LI (2).jpg,60%,コース作戦)
区間? 一個目のコップを取りに行く。スタート地点から直進す...
区間? 車体が大きいのでコップをつかんでからほぼ90°右に旋回...
区間? 少し後退してから左に旋回し地点Yのほうへ向く。
区間? そのまま直進し地点Yまで行きコップを置く。トレースで...
基本的に前進、後退、旋回などの動作は電池消費による影響を...
*プログラム [#kea5af38]
直接プログラムを書いたのは自分ではないがわかる限り詳しく...
**マクロ マスター側(タイヤを動かす方) [#wb9a2135]
定義したが結局使わなかったものもあるので使ったものを説明
#define SPEED 55
#define SPEED_SLOW 45
#define SPEED_CURVE 45
#define SPEED_FAST 55
#define THRESHOLD 38
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_FAST,SPEED_FAST);
#define turn_right_high OnRL(-30,SPEED_CURVE);
#define turn_right_low OnRL (0,SPEED_CURVE);
#define turn_left_high OnRL(SPEED_CURVE,-30);
#define turn_left_low OnRL (SPEED_CURVE,0);
#define CONN 1
#define SIGNAL_CATCH 11 //コップをつかむ
#define SIGNAL_RELEASE 12 //コップを離す
#define SIGNAL_UP 13 // アームを上げる
#define SIGNAL_UP1 14 //アームを上げる
#define SIGNAL_DOWN 15 //アームを下げる
**空き缶を探すプログラム [#u0f10117]
これは授業で先生からもらったプリントを参考にした
const float diameter = 5.45; //タイヤの直径
const float track = 10.35; //タイヤのトレ...
const float pi = 3.1415; //円周率
void fwdDist(float d) //距離d前進
{
long angle = d/(diameter*pi)*360.0; //角度を計...
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 0, true, tr...
}
void turnAng(long ang) //角度ang度時計回り旋回
{
long angle = track/diameter * ang; //必要なタ...
RotateMotorEx(OUT_BC, SPEED_SLOW, angle, 100, true,t...
}
int searchDirection(long ang) //現在の方向...
{
long tacho_min; //最も近い距離を実現するタイ...
int d_min = 300; //最も近い距離の仮の最小値
long angle = (track/diameter)*ang; //旋回角度から...
turnAng(ang/2); //指定された...
ResetTachoCount(OUT_BC); //角度計算を...
OnFwdSync(OUT_BC,SPEED_SLOW,-100); //反時計回り...
while(MotorTachoCount(OUT_B)<=angle){
if(SensorUS(S3)<d_min){ //現在の距離...
d_min = SensorUS(S3); //仮の最小値...
tacho_min = MotorTachoCount(OUT_B); //この時の...
}
}
OnFwdSyncEx(OUT_BC,SPEED_SLOW,100,RESET_NONE);
until(MotorTachoCount(OUT_B)<=tacho_min || SensorUS(...
Wait(14);
Off(OUT_BC);
Wait(500);
return d_min;
}
**区間?で使用するマクロ [#be1537a4]
90°旋回する時に使用した。
#define Ninety 15.9/(diameter*pi)*360.0 //90°...
#define usetu RotateMotorEx(OUT_BC,40,Ninety,100,true,fa...
**メインタスク マスター側 [#h4bbed47]
task main()
{
SetSensorLight(S2);
RotateMotor(OUT_BC,35,315);
Wait(1000); //...
RotateMotor(OUT_BC,35,320);
Wait(1000);
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_CATCH); /...
Wait(2000);
Wait(1000);
RotateMotor(OUT_C,55,180); //区...
RotateMotor(OUT_B,-55,310);
Wait(1000);
RotateMotor(OUT_BC,35,260); //...
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_UP); //...
Wait(2000);
↓地点Xから地点Yへ移動(区間??の部分)
RotateMotor(OUT_C,-55,360);
RotateMotor(OUT_BC,55,600);
RotateMotor(OUT_B,-55,330);
RotateMotor(OUT_C,55,50);
RotateMotor(OUT_BC,55,900);
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_DOWN); //...
Wait(1500);
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_RELEASE); /...
Wait(2000);
これで区間?〜区間?まで終了。以降二個目のコップを運ぶわけ...
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_UP);
Wait(2000);
RotateMotor(OUT_BC,-55,100);
OnFwd(OUT_B,55);
OnFwd(OUT_C,55);
Wait(1000);
Off(OUT_BC);
SetSensorLowspeed(S3);
int d = searchDirection(60);
if (d > 5){
fwdDist(d-5.0);
}
}
**マクロ スレーブ側(アームを)動かす方 [#c94fe07a]
マスター側と同じ
#define SIGNAL_CATCH 11
#define SIGNAL_RELEASE 12
#define SIGNAL_UP 13
#define SIGNAL_UP1 14
#define SIGNAL_DOWN 15
マスター側からメッセージが送られてきたときif文を使ってス...
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if (msg == SIGNAL_CATCH) { //コップをつかむ
OnFwd(OUT_C,40);
Wait(800);
Off(OUT_C);
}else{
if (msg == SIGNAL_RELEASE) { //コップを離す
RotateMotor(OUT_C,-20,38);
}else if
(msg == SIGNAL_UP) { //アームを上げる
RotateMotor(OUT_B,-45,120);
}else if
(msg == SIGNAL_DOWN) { //アームを下げる
RotateMotor(OUT_B,45,94);
}else if
(msg == SIGNAL_UP1) { //アームを上げる
OnFwd(OUT_B,-50);
Wait(1000);
Off(OUT_B);
}
}
}
}
*反省と感想 [#a749baa3]
プログラムの大体はぎりぎりに完成したというわけではないの...
今までの課題を振り返って感じたことは正確なロボットを作る...
ページ名: