第 9 章 複合動作実験 42
9.5 考察
複合実験の結果から、、超音波センサの特性により仲間を認識することが困難で あることがわかった。ロボットがランダムに配置された環境で仲間を発見し、協 調に向けたコミュニケーションを有効に行うためには以下の改良が望まれる。
1.
超音波センサが物体を認識する際に物体の種類までは認識できない事から、ロボットには障害物と仲間を区別できるようなセンサを搭載する必要がある と考えられる。または既存の超音波と光センサを用いて条件をつけて(超音 波と光センサを認識したときなど)判断するプログラムを製作することで現 状のままでこの問題を解決することが得きるが、こちらは複合動作実験の2、
3の問題点から困難と思われる。
2.
超音波センサの指向特性から、限られた範囲でしか障害物を検知することが 出来ないことがわかった。これは全方位からの仲間の接近、障害物に対応判 断できるようなセンサを用いる、またはセンサ数を増やす事でこの問題を解 決できると考える。この際現状の回路及び基板を変更する必要がある。3.
今回の実験で全てのロボットが同じ周波数を使用した超音波センサを用いた 事で、互いを障害物であると認識してしまった。さらに超音波の受信機は後 方からの超音波発信も受信してしまうことがわかった。そのため後方にいる ロボットの発する超音波を認識してしまうという問題がわかった、このこと から物体認識時に超音波センサを使用するならば、周波数の異なるものを使 用する必要がある。さらに、物体認識の精度を上げるためには距離測定、角 度を正確に行えるセンサを搭載する必要がある。4.
通信に関して現状ではオンオフの情報しか通信出来ないが、光センサを用 いて複数の情報を送受信するプログラムを製作できれば、ロボット間で多数 の情報がやりとりできると考える。このことが可能になれば止まれや動けの 指示以外に回転や旋回、後退などの命令もロボット間でやりとりできると考 える。5.
落差検出のフォトリフレクタについて、回避行動や他機との接触の際に後方 に追いやられたとき、現状ではセンサがないために回避することが出来ない。このため後方にもうひとつセンサを搭載する事が出来れば全範囲においてロ ボットが落差から落下する事を防ぐことができる。
そして現在のロボットを用いて協調動作についての研究を行うには、限定した 環境の中で特定の動作に特化した行動を行わせる必要があると考えられる。これ
第 10 章 まとめ
•
タイヤを改良した•
設計図をもとに試作機を製作し、動作確認を行った•
ロボットを10
台製作した。•
ロボット単体での自立行動を行うプログラムを製作し実験を行った。•
ロボット二台が通信し、追従行動を行うプログラムを製作し実験を行った。•
追従行動を長時間維持できるようにプログラムを改良した。•
自立プログラムを追従プログラムを組合せ、ランダムな環境の中で仲間を見 付け追従するプログラムを製作した。参考文献
[1]
袖山宙也 菅原雅弘『同形多数体の小型ロボットの行動研究』国士館大学工学 部機械情報工学科学士論文2008.
[2]
堀江幸生『世界で一番簡単なC
言語のイー本』秀和システムズ2003.
付 録 A 仕様
表
A.1 16F877
の仕様PIC
マイコン16F877 PLCC
パッケージ プログラムメモリ8k
ワードデータメモリ
368
バイトFlash
データメモリ256
バイトピン数
44
ピンI/O
ピン数33
ピン最大動作周波数
20MHz
-
タイマ0
-
タイマ1
-
タイマ2
- A/D
コンバータ 内蔵モジュールUSART
-
パラレル通信- CCP
- SSP
- WDT
表
A.2
フォトトランジスタTPS601A
光電流0.1min[mA]
0.1[mW/cm
2]
暗電流0.2max[µA]
30[V]
ピーク波長
800[nm]
表
A.3
赤外線LED TLN108(F)
半値角8
°直流順電流
100 [mA]
ピーク波長
940 [nm]
順電圧
1.3[V]
直流順電流
100[mA]
動作温度
-40〜125
℃表
A.4 STLJAPAN
精密ギヤモータ 栄42D標準型型番
HS-GM2-DSD
外形寸法
12 × 10 × 24[mm]
軸径軸長
φ3 × 10[mm]
使用電圧
DC 0.7〜7.2[V]
推奨電圧
DC 1.5〜6.0[V]
消費電流
70〜210[mA]
最大トルク
3300[gcm]/DC 5[V]
定格トルク
500[gcm]/DC 5[V]
回転数
45〜150[rpm]
表
A.5
超音波センサーT/R40-10
中心周波数40[kHz]
音圧レベル
107 [dB]
感度
-70 [dB]
-6dB
指向性100 [deg]
静電容量
1.100 [pF]
表
A.6
レンズ付き反射型 フォトリフレクタ レンズ焦点距離4[mm]
LED
順電圧1.2[V]
フォトトランジスタ光電流
140[µA]
(RL = 47[kΩ]、Vcc = 5[V]時)
フォトトランジスタ暗電流
3[µA]
付 録 B 追加製作
1: /* --- * 2: * Filename: moving.c
---3: *
4: * Copyright (C) 2009 by Faculty of Engineering, Kokushikan University 5: * : Ken Kishimto <[email protected]>
6: * Time-stamp: <09/02/03 17:22:28 youhei>
7: *
8: * --- */
9: // #include <16f877.h>
10: # include "linuxpic.h"
11:
12: #define LIGHT_SENSE_FRONT_LEFT PIN_B7 // OOM 13: #define LIGHT_SENSE_FRONT_RIGHT PIN_B4 // OEOM 14: #define LIGHT_SENSE_REAR PIN_C7 // OM 15: #define REFC_CNTR PIN_A1 // tN^
16: #define REFC_LEFT PIN_A0 // tN^
17: #define REFC_RIGT PIN_A2 // tN^ E 18: #define RD_SONIC PIN_C0 // g 19: /* output */
20: #define LIGHT_OUT_FRONT PIN_B6 // OO LED 21: #define LIGHT_OUT_REAR PIN_C5 // O LED 22: #define MT_RIGT_1 PIN_D1 // E[^[ IN1 23: #define MT_RIGT_2 PIN_D0 // E[^[ IN2 24: #define MT_LEFT_2 PIN_D3 // [^[ IN2 25: #define MT_LEFT_1 PIN_D2 // [^[ IN1 26: #define MONITOR_LED PIN_B5 // j^[LED 27: #define RD_SONIC_STOP PIN_C1 // g~
28:
29: /* reaction */
30: #define NO_ACTION 0 // 0 31: #define GO_STRAIGHT 1 // 1 i 32: #define GO_STRAIGHT_FAST 2 // 2 i
33: #define GO_BACK 3 // 3
34: #define BRAKE 4 // 4 u[L
35: #define TURN_RIGHT 5 // 5 E^[
36: #define ATURN_RIGHT 6 // 6 E^[
37: #define BACK_RIGHT 7 // 7 EobN^[
38: #define TURN_LEFT 8 // 8 ^[
39: #define ATURN_LEFT 9 // 9 ^[
40: #define BACK_LEFT 10 // 10 obN^[
41: #define MOTOR_STOP 15 // 15 ~
42: #define END 99 // 15 ~
43:
44: #define ON 1 45: #define OFF 0
53: countq[NACTION]; // sp 54: int action, // s
55: actque[NACTION+1];// ss 56:
57: int1 lgt_fl, lgt_fr, lgt_r, sonic; // ZT 58: int1 ref_l, ref_r, ref_c; // ZT
59: int1 lgtout_f, lgtout_r, out_sonic;
60:
61: void setup();
62: void left_motor_back();
63: void left_motor_forward();
64: void left_motor_stop();
65: void left_motor_brake();
66: void right_motor_back();
67: void right_motor_forward();
68: void right_motor_stop();
69: void right_motor_brake();
70: void forward();
71: void back();
72: void aright();
73: void aleft();
74: void right();
75: void left();
76: void stop();
77: void stop_with_led();
78: void LED_on();
79: void LED_off();
80: int8 sonic_sense();
81: int8 sensing();
82: void rear_lamp(int1 s);
83: void front_lamp(int1 s);
84: int8 sense_rear_lgt();
85: void flush_front_lamp(int mod);
86: void flush_rear_lamp(int mod);
87:
88: /*
89: #fuses HS, NOWDT, PUT, NOPROTECT, BROWNOUT, NOLVP, NOCPD, NOWRT 90:
91: #use fast_io(A) 92: #use fast_io(B) 93: #use fast_io(C) 94: #use fast_io(D) 95: #use fast_io(E)
96: #use delay(CLOCK = 20000000) 97: #bit TOIF =0x0bb.2
98: */
99: /* --- * 100: * Filename: moving.c
---101: *
102: * Copyright (C) 2009 by Faculty of Engineering, Kokushikan University 103: * : Ken Kishimto <[email protected]>
104: * Time-stamp: <09/01/29 16:33:46 youhei>
105: *
106: * --- */
107: void setup() //B1IN0OUTBgPIN1B 108: {
109: setup_adc_ports(NO_ANALOGS);
110: set_tris_a(0xff); // 0b11111111EA0B16i@
111: set_tris_b(0x9f); // 0b10011111EB0B16i@
112: set_tris_c(0xdf); // 0b11011111EC0B16i@
117: /* { n[ho */ //void gB 118: /* obN */
119: void left_motor_back()
120: { output_high(MT_LEFT_1); output_low(MT_LEFT_2); } 121: /* Oi */
122: void left_motor_forward()
123: { output_low(MT_LEFT_1); output_high(MT_LEFT_2); } 124: /* Xgbv */
125: void left_motor_stop() 126: {
127: output_low(MT_RIGT_1); output_low(MT_RIGT_2);
128: }
129: /* u[L */
130: void left_motor_brake()
131: { output_high(MT_RIGT_1); output_high(MT_RIGT_2); } 132: /* EobN */
133: void right_motor_back()
134: { output_low(MT_RIGT_1); output_high(MT_RIGT_2); } 135: /* EOi */
136: void right_motor_forward()
137: { output_high(MT_RIGT_1); output_low(MT_RIGT_2); } 138: /* EXgbv */
139: void right_motor_stop()
140: { output_low(MT_LEFT_1); output_low(MT_LEFT_2); } 141: /* Eu[L */
142: void right_motor_brake()
143: { output_high(MT_LEFT_1); output_high(MT_LEFT_2); } 144:
145: /* Oi */
146: void forward() 147: {
148: left_motor_forward();
149: right_motor_forward();
150: } 151: /* */
152: void back() 153: {
154: left_motor_back();
155: right_motor_back();
156: } 157: /* v */
158: void aright() 159: {
160: left_motor_forward();
161: right_motor_back();
162: } 163: /* v */
164: void aleft() 165: {
166: right_motor_forward();
167: left_motor_back();
168: }
169: /* x_v */
170: void right() 171: {
172: left_motor_forward();
181: /* ~ */
182: void stop() 183: {
184: right_motor_stop();
185: left_motor_stop();
186: } 187: //
188: void LED_on() 189: {
190: output_high(MONITOR_LED);
191: }
192: void LED_off() 193: {
194: output_low(MONITOR_LED);
195: } 196:
197: int8 sonic_sense() 198: {
199: output_high(RD_SONIC_STOP);
200: delay_us(500);
201: sonic = input(RD_SONIC);
202: output_low(RD_SONIC_STOP);
203: return sonic;
204: }
205: /* x~ */
206: void stop_with_led() 207: {
208: stop();
209: LED_off();
210: delay_ms(5000);
211: LED_on();
212: delay_ms(5000);
213: } 214:
215: /* ZTXL */
216: int8 sensing() 217: {
218: int8 a = 0;
219:
220: lgt_fl = input(LIGHT_SENSE_FRONT_LEFT);
221: a += lgt_fl;
222: lgt_fr = input(LIGHT_SENSE_FRONT_RIGHT);
223: a += lgt_fr;
224: lgt_r = input(LIGHT_SENSE_REAR);
225: a += lgt_r;
226: sonic = sonic_sense();
227: a += sonic;
228: ref_c = 1 - input(REFC_CNTR);
229: a += ref_c;
230: ref_l = 1 - input(REFC_LEFT);
231: a += ref_l;
232: ref_r = 1 - input(REFC_RIGT);
233: a += ref_r;
234: return a;
235: } 236:
237: void rear_lamp(int1 s) 238: {
239: if (s)
240: output_high(LIGHT_OUT_REAR);
245: void front_lamp(int1 s) 246: {
247: if (s)
248: output_high(LIGHT_OUT_FRONT);
249: else
250: output_low(LIGHT_OUT_FRONT);
251: }
252: int8 sense_rear_lgt() 253: {
254: lgt_r = input(LIGHT_SENSE_REAR);
255: return lgt_r;
256: } 257:
258: void flush_front_lamp(int mod) 259: {
260: int i;
261:
262: switch (mod) {
263: case 0: // "---"
264: for (i = 0; i < 4; i++) {
265: front_lamp(1);
266: delay_ms(30);
267: }
268: break;
269: case 1: // ". . . ."
270: for (i = 0; i < 4; i++) {
271: front_lamp(1);
272: delay_ms(5);
273: front_lamp(0);
274: delay_ms(25);
275: }
276: break;
277: case 2: // "- - - -"
278: for (i = 0; i < 4; i++) {
279: front_lamp(1);
280: delay_ms(25);
281: front_lamp(0);
282: delay_ms(5);
283: }
284: break;
285: default:
286: break;
287: }
288: front_lamp(0);
289: } 290:
291: void flush_rear_lamp(int mod) 292: {
293: int i;
294:
295: switch (mod) {
296: case 0: // "---"
297: for (i = 0; i < 4; i++) {
298: rear_lamp(1);
299: delay_ms(30);
300: }
309: break;
310: case 2: // "- - - -"
311: for (i = 0; i < 4; i++) {
312: rear_lamp(1);
313: delay_ms(25);
314: rear_lamp(0);
315: delay_ms(5);
316: }
317: break;
318: default:
319: break;
320: }
321: rear_lamp(0);
322: }
323: /* --- */
324: void
325: do_action(int act) 326: {
327: switch (act) {
328: case GO_STRAIGHT : forward(); break;
329: case GO_STRAIGHT_FAST: forward(); break;
330: case GO_BACK : back(); break;
331: case BRAKE : left_motor_brake();
332: right_motor_brake(); break;
333: case TURN_RIGHT : right(); break;
334: case ATURN_RIGHT : aright(); break;
335: case BACK_RIGHT : right_motor_back(); break;
336: case TURN_LEFT : left(); break;
337: case ATURN_LEFT : aleft(); break;
338: case BACK_LEFT : left_motor_back(); break;
339: case MOTOR_STOP : stop(); break;
340: case NO_ACTION :
341: case END : stop_with_led();
342: default : break;
343: }
344: } 345: /*
346: * VANVL
347: * NACTION Yp 348: */
349: void rememb_action(int act, int32 conu) 350: {
351: int i;
352:
353: for (i = NACTION - 1; i > 0; i--) { 354: actque[i] = actque[i - 1];
355: countq[i] = countq[i - 1];
356: }
357: actque[0] = act;
358: countq[0] = conu;
359: actque[NACTION] = END;
360: } 361: /*
362: * OMF 363: */
364: void commun_front() 365: {
366: if (lgt_fl == 1 || lgt_fr == 1) {
367: LED_on();
368: flush_front_lamp(1);
373: action = TURN_LEFT;
374: } else {
375: action = TURN_RIGHT;
376: }
377: } else { 378: LED_off();
379: }
380: } 381: /*
382: * MFM 383: */
384: void commun_back() 385: {
386: flush_rear_lamp(1);
387: if (sense_rear_lgt()) { 388: action = GO_STRAIGHT;
389: counter = 5000;
390: }
391: } 392: /*
393: * 394: */
395: int main() 396: {
397: int i, em;
398:
399: setup();
400: for (i = 0; i < NACTION; i++) { 401: actque[i] = END;
402: countq[i] = 0;
403: }
404: action = GO_STRAIGHT;
405: counter = 32767;
406: while (1) {
407: do_action(action);
408: if (sensing()) {
409: em = 0; // }
410: LED_on();
411: /* Q dv*/
412: if (sonic) {
413: action = MOTOR_STOP;
414: counter = 1000;
415: actque[0] = GO_BACK;
416: countq[0] = 500;
417: actque[1] = TURN_LEFT;
418: countq[1] = 1200;
419: actque[2] = END;
420: em = 1; // }
421: }
422: if (ref_c) {
423: action = GO_BACK;
424: counter = 2400; // 1200ms
425: actque[0] = TURN_RIGHT;
426: countq[0] = 1200;
427: actque[1] = GO_STRAIGHT;
428: countq[1] = 32767; //
437: countq[1] = 32767; //
438: em = 1; // }
439: } else if (ref_r) {
440: action = BACK_LEFT;
441: counter = 1200; // 1200ms
442: actque[0] = GO_BACK;
443: countq[0] = 1200; // 1200ms
444: actque[1] = END;
445: em = 1; // }
446: } else if (ref_l) {
447: action = BACK_RIGHT;
448: counter = 1200; // 1200ms
449: actque[0] = GO_BACK;
450: countq[0] = 1200; // 1200ms
451: actque[1] = END;
452: em = 1; // }
453: }
454: if (em == 0) { // }
455: /* M : mMBtbI */
456: commun_back();
457: commun_front();
458: }
459: } else {
460: LED_off();
461: if (counter > 0) { // sIp
462: counter--;
463: } else {
464: counter = countq[0]; // so
465: action = actque[0];
466: if (action != END) { // svoB
467: for (i = 0; i < NACTION - 1; i++) {
468: actque[i] = actque[i+1];
469: countq[i] = countq[i+1];
470: }
471: actque[NACTION] = END;
472: }
473: }
474: }
475: if (action == END) { // SsIFftHgs
476: // OiH
477: action = GO_STRAIGHT;
478: counter = 100;
479: // sdv
480: actque[0] = ATURN_LEFT;
481: countq[0] = 200;
482: actque[1] = END;
483: }
484: }
485: return 0;
486: }
487: /* --- */
付 録 C おわりに
3
年次のゼミを含めて2
年間お世話になりました。最後にあと書きを残します。この
1
年間思ったこと、感じたこと、学んだことを書きたいと思います。•
研究室について岸本研究室の第一印象は、厳しくてアットホーム。先輩達が先生に対してタメ口 で話していることが驚きで印象的でした。この環境なら だらしない自分でもケツ を叩かれながら成長していけるかなと思い第一希望で選びました。それ以外にも、
将来バイクの制御をやりたいという夢を叶えるためには電気やプログラムの知識 が必要で、ロボットを通じてこれらの知識を身に着けられるというのもこの研究 室を選んだ決め手になりました。
• Linax
この研究室に入って最初の壁はパソコンの
OS
がwindows
ではないことでした。文 章を書くにも、表計算するにも使ったことのないソフトを使います。このLinax
を なかなか使いこなせず、この一年間は大変な目に合いました。文章を書いたり、パ ワーポインタを作ったり、設計図を書いたりと、パソコンを使って作業すること が多かったのですが、ソフトの使いかたが全くわからない上に操作が複雑。画像 を入れるにしてもwindows
のようにはいきません。様々なコマンドを駆使して何 段階もの変換をし、やっと張り付ける事が出来ます。このめんどくさいOS
には最 後まで苦労しました。•
電気、電子一年間の自分の卒論のテーマはロボットでした。これは完全に電気、電子分野。あ まりに無知なため、オームの法則から復習し直さなければなりませんでした。し かし、この研究室のロボットはオームの法則さえ知っていればなんとかなる訳も なく、基板の焼きかた、PIC、ロジック
IC、コンデンサ、ダイオードに加え様々な
ロボットで最後まで苦労したのがプログラムでした。全く無知なところから始め て、半年でロボットをまともに動かそうなんて本当に無謀でした。ここのロボッ トのプログラムは
C
言語。これはプロが使う言語で、もともと複雑に作られてい るようで、入門書にはどれも「一通り書けるようになるまで1年はかかる」と書 いてあります。おまけにこれはコンピュータのプログラムを書いたときの話であっ て、ロボットのプログラムにはまた別の知識が必要です。3冊ほど入門書を読みま しましたが、ロボットを自分の思い通りに動かすにはまだまだ知識が足りず、あ と1年はプログラムを勉強しないとまともにロボットは動いてくれなさそうです。•
ロボットロボットにはソフトとハードがあります。このどちらかが欠けたら動きませんし、
どちらも完璧に完成していないと狙った動きをしてくれません。おまけに電子電 気は無知。プログラムは激ムズ。ハードが出来たと思ったらソフトが出来ない。ソ フトを改良したらハードが壊れる。このシーソーゲームの繰り返しがロボット製 作には待っていました。
•
卒論今まで書いてきたように卒論は0からスタートのオンパレード。パソコン、電気、
プログラム、ロボット製作。自力で学ぶという習慣が身についていない自分は戸 惑い悩むことの連続でした。
•
先生先生のやり方は「2階に上げてハシゴを外し、下から火をつけて槍で突きまくる」
です。パソコンの知識がなかろうが、ロボットの知識がなかろうが、プログラム 未経験だろうが関係なし。「早く書け!」「早く動かせ!」「早くやれ!」の一言。
そして出来ていないと「もう
1
年やれ!」「卒業させないぞ!」「自主退学する準備 しろ!」と言う。もともと自力で自主的に勉強する習慣が身についてなく、怠ける ことばかり覚えてきた自分は、出来ないことや無知なことを強要されても、心の なかで「できるわけない」「わからない」「知らない」が口ぐせになり、言い訳に なっていました。こんなこともあって 研究室に入りたてのころは反発心でいっぱ いだったし、出来ないから楽しくないし、研究室に来ることも苦痛なときもあり ました。しかし、就職を控えて社会に出ることを自覚し意識し始める冬半ばになると先 生の言っていることが理解できるようになってきました。社会に出た先輩の話を 聞いたり、いろんな話を聞いていると、社会は理不尽な事があって当り前。出来 ないことや知らないことを「明日までにやってこい」というのは日常茶飯事。こ