Mission2

下図の黒線を提示されたルール通りに沿って動くロボットの作成。
2017a-mission2.png
詳しい内容は2018a/Mission2を参照。

ロボット

Mission2 Mission2 Mission2

mA = MediumMotor('outA')   

  缶をキャッチするアームを動作させるためのモーター。   作動させると四角い枠上のアームが降り,缶を囲むようにして保持する.

mR = LargeMotor('outB')

  進行方向右側のタイヤを動かすモーター。

mL = LargeMotor('outC')

  進行方向左側のタイヤを動かすモーター。

cs = ColorSensor('in1')

  地面の色を判別するセンサ。これを使用し黒い線を判別させる。

プログラム

#!/usr/bin/env python3
from ev3dev.ev3 import *
from time import sleep#ロボットを動かすための基本的なプログラム
mA = MediumMotor('outA')
mR = LargeMotor('outB')
mL = LargeMotor('outC')
cs = ColorSensor('in1')#前述のモーターやセンサー
cs.mode = 'COL-REFLECT'
Itime = 1.8#センサーの設定.明るさ(白と黒)を判別し
1.8秒間黒を認識し続けると後述する様々な関数が作動する.
def move_foward():
   mR.run_forever(speed_sp=100, stop_action='brake')
   mL.run_forever(speed_sp=100, stop_action='brake')
前に進み続ける関数
def move_right1():
   mR.run_forever(speed_sp=60, stop_action='brake')
   mL.run_forever(speed_sp=90, stop_action='brake')
僅かに右に向かいながら前進する
def move_right2():
   mR.run_forever(speed_sp=35, stop_action='brake')
   mL.run_forever(speed_sp=90, stop_action='brake')
少し右に向かいながら前進
def move_right3():
   mR.run_forever(speed_sp=-45, stop_action='brake')
   mL.run_forever(speed_sp=80, stop_action='brake')
大きく右前方に向かう
def turn_right():
   mR.run_forever(speed_sp=-80, stop_action='brake')
   mL.run_forever(speed_sp=80, stop_action='brake')
ロボット本体を右に90度ターンする
def move_left1():
   mR.run_forever(speed_sp=90, stop_action='brake')
   mL.run_forever(speed_sp=60, stop_action='brake') 
def move_left2():
   mR.run_forever(speed_sp=90, stop_action='brake')
   mL.run_forever(speed_sp=35, stop_action='brake')
move_rightの左版
def turn_left():
   mR.run_forever(speed_sp=80, stop_action='brake')
   mL.run_forever(speed_sp=-80, stop_action='brake')
左にターン
def stop():
   mR.run_timed(time_sp=0, speed_sp=0, stop_action='coast')
   mL.run_timed(time_sp=0, speed_sp=0, stop_action='coast')
全てのタイヤの動作を停止させる
def armturn(t):
   mA.run_to_rel_pos(position_sp=t, speed_sp=70, stop_action='brake')
   sleep(1)#アームを上下させる
def toresu_right():#黒線の右端をなぞって走る
   t0 = time.time()
   while time.time() - t0 < Itime:
      if 80 < cs.value(0):
             move_left3()
             t0 = time.time()
      if 60 < cs.value(0) < 80:
             move_left2()
             t0 = time.time()
      if 45 < cs.value(0) < 60:
             move_left1()
             t0 = time.time()
      if 40 < cs.value(0) < 45:
             move_foward()
             t0 = time.time()
      if 40 < cs.value(0) < 45:
             move_right1()
      if 35 < cs.value(0) < 40:
             move_right2()
      if cs.value(0) < 35:
             move_right3()#明るさ(cs.valueの値の大きさ)によって前述の関数たちを切り替えて作動させている
def toresu_left():#上と同様左側をなぞる
   t0 = time.time()
   while time.time() - t0 < Itime:
      if 80 < cs.value(0):
             move_right3()
             t0 = time.time()
      if 60 < cs.value(0) < 80:
             move_right2()
             t0 = time.time()
      if 45 < cs.value(0) < 60:
             move_right1()
             t0 = time.time()
      if 40 < cs.value(0) < 45:
             move_foward()
             t0 = time.time()
      if 40 < cs.value(0) < 45:
             move_left1()
      if 35 < cs.value(0) < 40:
             move_left2()
      if cs.value(0) < 35:
             move_left3()
def return_toresu_left(R,L):#R,Lはそれぞれ左右のタイヤのスピード
   mR.run_to_rel_pos(position_sp=R, speed_sp=100, stop_action='brake')
   mL.run_to_rel_pos(position_sp=L, speed_sp=100, stop_action='brake')
   sleep(3.5)
   while cs.value(0) > 45:
      move_right1()#黒線から大きく外れたとき線に戻るための関数
def return_toresu_right(R,L):
   mR.run_to_rel_pos(position_sp=R, speed_sp=100, stop_action='brake')
   mL.run_to_rel_pos(position_sp=L, speed_sp=100, stop_action='brake')
   sleep(4)
   while cs.value(0) > 45:
      move_left1()#上に同じ
def return_circle_right():
   mR.run_to_rel_pos(position_sp=180, speed_sp=80, stop_action='brake')
   sleep(4)
   while cs.value(0) > 45:
      mR.run_forever(speed_sp=100, stop_action='brake')
上の関数と同様の目的だがこちらは円弧に外側から復帰するためのもの
def return_circle_left():
   mL.run_to_rel_pos(position_sp=180, speed_sp=80, stop_action='brake')
   sleep(4)
   while cs.value(0) > 45:
      mL.run_forever(speed_sp=100, stop_action='brake')#上に同じ

以降は関数を組み合わせてロボットに出した命令である.

return_toresu_right(180,180)
toresu_right()
toresu_left()
stop()
sleep(1)
armturn(30)
sleep(1)
toresu_left()
return_circle_left()
stop()

感想・考察

今回は課題を達成できなかった. 一つ目の曲がり角を曲がり,缶を保持する段階から先へは進めなかった.

これは作業の時間を十分に確保できなかったためである. 次回はチームメイトと協力して効率よく制作に取り組みたい.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-08-10 (金) 15:36:34 (127d)