2017b/Member/yuitom/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2017b/Member]]
目次
#contents
*課題をクリアしていくために… [#k81a7a84]
今回私たちのグループはこの課題をクリアするにあたって重要...
?コップの探査方法
?コップの持ち運び方法
?移動手段
?二つのロボットの協力方法
今回は、上記の4つのポイントに注目してロボット、プログラム...
*ロボットの説明 [#y206a328]
**ロボットの選択(ポイント?の解決) [#uda29c80]
●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.j...
上の図のように車輪を取り付けることで、コップとアームの...
-動力1つでのアームの制御を実現するために
&ref(2017b/Member/yuitom/Mission3/mission3_アーム4.jpg,50...
上の画像のように歯車を使用することで、アームを開く閉じ...
●コップを上げる機構
&ref(2017b/Member/yuitom/Mission3/mission3_アーム5.jpg,50...
私達のグループでは、前で述べたようにコップを持ち上げるた...
そこで、私達のグループは上の画像のように、モータと歯車を...
●コップを探す超音波センサと移動のための光センサ
今回の課題にてより確実にコップを探すために必要不可欠な...
&ref(2017b/Member/yuitom/Mission3/mission3_センサ.jpg,50%...
&ref(2017b/Member/yuitom/Mission3/mission3_センサ2.jpg,50...
今回は、上の図のように超音波センサと光センサを取り付け...
実際にコップの探査プログラムを使用し試したところ、アーム...
ライントレースについては下の「●ロボットを移動させる光セ...
**ロボットの移動手段の決定(ポイント?、課題?の解決) [#m4...
●ロボットを移動させる光センサ(ポイント?「移動手段」の解...
今回、私たちのグループではコップを入手・運搬するために...
●ロボットの重量を支える4つの車輪(課題?「車輪を増やす」の...
&ref(2017b/Member/yuitom/Mission3/mission3_車輪.jpg,70%,4...
図のように今回は駆動輪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; //円周率
それぞれ、この数値を元に正確な前進後退ができるようにな...
**マスター(移動関連担当機体)とスレイブ(アーム関連担当...
今回私達のグループでは2つのロボットを1つのものとして使...
#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]
**ライントレースによる移動(ポイント?「移動手段」の解決)...
私達のグループでは、コップの探索・運搬にライントレース...
●ライントレースの元となる基本式(解決策? 速度の変更)
今回、作成したライントレース用の比例制御プログラムは非...
また、今回の課題をクリアするにあたって進行方向右側のライ...
また、linetrase_?(int ?)とした時、?はライントレースする...
例)緩やかなカーブの右側のラインをライントレース→ line...
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と非常に短く設定されてい...
また、intertify_?()とした場合、?はライントレースするラ...
例)右側のラインをライントレース(交差点識別)→ intert...
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度...
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 || ultrasoni...
adjust;
Wait(500);
return d_min;
}
◎応用編「光センサを用いた黒線探索」
このプログラムは、実際には使用されることがなかったが「●...
また、 search_light_center(long ?)としたとき、?は「●超...
sub search_light_center(long 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_li...
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]
私たちのグループが課題を攻略するにあたって、重要となる...
私たちが、なぜここに注目したのかというと、機体をここに移...
●QS区間にたどり着くために…
QS区間にたどり着くまでの間に問題となってくる場所、それ...
そのために私たちは、「超音波センサーを用いたコップの探...
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に戻る...
→「P→Sへ移動(ピンポン玉所持)」→「SQ間にてUターン(ピ...
→「Sにてピンポン玉リリース」→「SQ間にてUターン(紙コッ...
→「Sにて右回り旋回」→「コップ?の探索・入手」→「元の位置...
→「Sにてピンポン玉リリース」→「SQ間にてUターン(紙コッ...
→同様にコップ?も入手・ピンポン玉、紙コップをリリース→ ...
という流れで課題をクリアしていこうと思う。
※後の「評価」でも記述しているが、今回はコップを重ねる動作...
今回、注意したこととすると前回の課題と同じように電池消...
以下が、今回の発表会にて使用したプログラムである。
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方向へライントレース(ピンポ...
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方向へライントレース(ピンポ...
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方向へライントレース(ピン...
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]
このゼミを通して私は、自分が今まで完璧な存在だと考えて...
私たちが今回扱ってきたロボットは、とても簡単なつくりで...
私が今回のゼミを通し、学んだことはとても大きかった。き...
最後にこの「ロボティクス入門ゼミ」で、私を助けてくださ...
本当にありがとうございました。
終了行:
[[2017b/Member]]
目次
#contents
*課題をクリアしていくために… [#k81a7a84]
今回私たちのグループはこの課題をクリアするにあたって重要...
?コップの探査方法
?コップの持ち運び方法
?移動手段
?二つのロボットの協力方法
今回は、上記の4つのポイントに注目してロボット、プログラム...
*ロボットの説明 [#y206a328]
**ロボットの選択(ポイント?の解決) [#uda29c80]
●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.j...
上の図のように車輪を取り付けることで、コップとアームの...
-動力1つでのアームの制御を実現するために
&ref(2017b/Member/yuitom/Mission3/mission3_アーム4.jpg,50...
上の画像のように歯車を使用することで、アームを開く閉じ...
●コップを上げる機構
&ref(2017b/Member/yuitom/Mission3/mission3_アーム5.jpg,50...
私達のグループでは、前で述べたようにコップを持ち上げるた...
そこで、私達のグループは上の画像のように、モータと歯車を...
●コップを探す超音波センサと移動のための光センサ
今回の課題にてより確実にコップを探すために必要不可欠な...
&ref(2017b/Member/yuitom/Mission3/mission3_センサ.jpg,50%...
&ref(2017b/Member/yuitom/Mission3/mission3_センサ2.jpg,50...
今回は、上の図のように超音波センサと光センサを取り付け...
実際にコップの探査プログラムを使用し試したところ、アーム...
ライントレースについては下の「●ロボットを移動させる光セ...
**ロボットの移動手段の決定(ポイント?、課題?の解決) [#m4...
●ロボットを移動させる光センサ(ポイント?「移動手段」の解...
今回、私たちのグループではコップを入手・運搬するために...
●ロボットの重量を支える4つの車輪(課題?「車輪を増やす」の...
&ref(2017b/Member/yuitom/Mission3/mission3_車輪.jpg,70%,4...
図のように今回は駆動輪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; //円周率
それぞれ、この数値を元に正確な前進後退ができるようにな...
**マスター(移動関連担当機体)とスレイブ(アーム関連担当...
今回私達のグループでは2つのロボットを1つのものとして使...
#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]
**ライントレースによる移動(ポイント?「移動手段」の解決)...
私達のグループでは、コップの探索・運搬にライントレース...
●ライントレースの元となる基本式(解決策? 速度の変更)
今回、作成したライントレース用の比例制御プログラムは非...
また、今回の課題をクリアするにあたって進行方向右側のライ...
また、linetrase_?(int ?)とした時、?はライントレースする...
例)緩やかなカーブの右側のラインをライントレース→ line...
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と非常に短く設定されてい...
また、intertify_?()とした場合、?はライントレースするラ...
例)右側のラインをライントレース(交差点識別)→ intert...
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度...
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 || ultrasoni...
adjust;
Wait(500);
return d_min;
}
◎応用編「光センサを用いた黒線探索」
このプログラムは、実際には使用されることがなかったが「●...
また、 search_light_center(long ?)としたとき、?は「●超...
sub search_light_center(long 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_li...
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]
私たちのグループが課題を攻略するにあたって、重要となる...
私たちが、なぜここに注目したのかというと、機体をここに移...
●QS区間にたどり着くために…
QS区間にたどり着くまでの間に問題となってくる場所、それ...
そのために私たちは、「超音波センサーを用いたコップの探...
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に戻る...
→「P→Sへ移動(ピンポン玉所持)」→「SQ間にてUターン(ピ...
→「Sにてピンポン玉リリース」→「SQ間にてUターン(紙コッ...
→「Sにて右回り旋回」→「コップ?の探索・入手」→「元の位置...
→「Sにてピンポン玉リリース」→「SQ間にてUターン(紙コッ...
→同様にコップ?も入手・ピンポン玉、紙コップをリリース→ ...
という流れで課題をクリアしていこうと思う。
※後の「評価」でも記述しているが、今回はコップを重ねる動作...
今回、注意したこととすると前回の課題と同じように電池消...
以下が、今回の発表会にて使用したプログラムである。
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方向へライントレース(ピンポ...
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方向へライントレース(ピンポ...
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方向へライントレース(ピン...
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]
このゼミを通して私は、自分が今まで完璧な存在だと考えて...
私たちが今回扱ってきたロボットは、とても簡単なつくりで...
私が今回のゼミを通し、学んだことはとても大きかった。き...
最後にこの「ロボティクス入門ゼミ」で、私を助けてくださ...
本当にありがとうございました。
ページ名: