目次

#contents

*課題3  ~野球~ [#j8a06b3d]
-ピッチャーロボットとバッターロボットが所定の位置まで移動してピンポン球を投げて打つ
-ピッチャーロボットはA地点をスタートしM地点まで移動する
-バッターロボットはC地点をスタートしB地点まで移動する
-スタート時はそれぞれA地点B地点の枠内に収まること(高さの制限はなし)
-M地点、B地点では接地している部分が枠内に入っていること
-ピッチャーロボットはスタート時にピンポン球を5個まで保持できる
-ピッチャーロボットが投げたピンポン球をバッターロボットは3秒以上保持してはならない
-移動の途中で目標に接触してはならない
#br
&color(#cc0000){※画像が90度回転されて表示されてしまいました。アンカーの設定に失敗しています。修正中です。};
%%&color(#cc0000){※画像が90度回転されて表示されてしまいました。アンカーの設定に失敗しています。修正中です。};%%
#br
**アプローチ [#j87c51f6]
今回は移動方法と打撃方法について考える必要がある

***移動方法 [#w3977a61]

+R付近まで移動する(黒線の数を計測し、規定の本数を計測した時R付近にいると認識させる) →ライントレースでB地点へ
#br
メリット:正確にB地点まで移動できる。課題2でのプログラムを利用できる。&br;
デメリット:カラーセンサが必要になる。プログラムが複雑になる。
#ref(2016b/Member/bicky/Mission0/ライントレース.png,50%)
#br
+半円を描くように直接B地点へ行く(角度制御 or 時間制御)
#br
メリット:プログラムの記述が楽、簡潔になる。センサーを使わない。&br;
デメリット:調整が困難であり、確実性がない。
#ref(2016b/Member/bicky/Mission0/直.png,50%)
#br

***打撃方法 [#x3eada8d]
+キャッチ&リリース打(?)法
#br
メリット:一度ボールをキャッチしてしまえば安定して狙った場所にボールをシュートできる。&br;
デメリット:ピッチャーが転がしたボールがバッターに届く前に逸れてしまうことが考えられる。
#br
+リアル打法
メリット:これが一番野球してると思います。&br;
デメリット:ロボット間の通信速度や打つタイミングがシビア。ゴールを狙うのはほぼ不可能。
#br
#br
今回はロボットの構造やネタに走った都合上、半円を描くように直接B地点へ行き、リアル打法で課題に臨んだ。
#br
今回の移動ルート&br;
#ref(2016b/Member/bicky/Mission0/進む.png,50%)
#br
*プログラム(python)の説明 [#k37c462b]
#br
今回はMQTTを行うためのライブラリを追加している&br;
(pahoというライブラリは最新のev3devのputhon3ではうまく動作しなかった模様)
 #!/usr/bin/env python
 
 import paho.mqtt.client as mqtt
 import ev3dev.ev3 as ev3
 import time
今回は主に1つのLargeMotorで移動する
 lm = ev3.LargeMotor('outB')
 mm = ev3.MediumMotor('outC')
 
MQTTに関する記述
 host = '192.168.2.102'   #通信相手のIPアドレス
 port = 1883              #通信に使う場所(デフォルトでは1883番を使うらしい)
 topic = 'pi/st'          #今回の通信の題名(どんな名前でも良い)

 def on_connect(client, userdata, flags, respons_code):
     print('status {0}'.format(respons_code))     #正常に繋がった時に0とコンソールに表示する
     client.subscribe(topic)                      #指定された題名の通信を受け取る  ←大事
 
 def on_message(client, userdata, msg):      #相手からの通信を受け取った時に行う動作(ここに通信時に行う動作を書く)
     t = 0.4
     time.sleep(t)
     swing()
 
今回は今までとは異なり、変形に挑戦した。
 def transformation():    #変形プログラム
     mm.reset()
     lm.reset()       #位置調整
     turn_R(60)
     lm.run_to_rel_pos(position_sp=100, duty_cycle_sp=100, speed_sp=100, stop_action='hold')
     time.sleep(2)
 
     lm.reset()      #変形
     lm.run_to_rel_pos(position_sp=80, duty_cycle_sp=100, speed_sp=200, stop_action='hold')
     time.sleep(3)
 
     mm.reset()      #打撃姿勢をとるプログラム
     mm.run_to_rel_pos(position_sp=110,duty_cycle_sp=100,speed_sp=100, stop_action='hold')
     time.sleep(2)
     lm.reset()
     mm.reset()
 
今回は後輪を駆動輪とし、前輪は移動方向を変えるために使用した。(バイクと同じ構造である。)&br;
また、前輪の操作と打撃の操作は全てMediumMotorのみで行った。
 def turn_L(degree):  #左に曲がるためのプログラム
     mm.reset()   #tuen_left_MAX:degree=85
     mm.run_to_rel_pos(position_sp=degree, duty_cycle_sp=70, speed_sp=80, stop_action='hold')
     time.sleep(3)
 
 def turn_R(degree):   #右に曲がるためのプログラム
     mm.reset()
     mm.run_to_rel_pos(position_sp=-degree, duty_cycle_sp=70, speed_sp=75, stop_action='hold')
     time.sleep(3)
  
 def swing():   #打撃用プログラム
     mm.reset()    #バットを振る
     mm.run_to_rel_pos(position_sp=-110,duty_cycle_sp=100,speed_sp=800, stop_action='hold')
     time.sleep(1)
     mm.reset()    #構え直し
     mm.run_to_rel_pos(position_sp=110,duty_cycle_sp=100,speed_sp=500, stop_action='hold')
     time.sleep(1.5)
 
今回はあまり細かく移動できるロボットではなかったため、最も単純な移動ルートにした。
  def move():   #移動のプログラム(C → B)
     lm.reset()
     mm.reset()
     lm.run_forever(duty_cycle_sp=80,speed_sp=100)
     time.sleep(2.5)
     turn_L(50)
     lm.run_forever(duty_cycle_sp=80,speed_sp=100)
     time.sleep(9)
     lm.stop()

実行した動作
 move   #移動(C → B)
 
 transformation() #変形
 
 ###通信を行うための準備#############################
 client = mqtt.Client(protocol=mqtt.MQTTv311)   #通信をするため、client(subscriber)を生成する
 
 client.on_connect = on_connect       #通信ができた時に行う動作を指定
 client.on_message = on_message    #通信を受け取った時に行う動作を指定
 
 ################################################
 
 
 client.connect(host, port=port, keepalive=60)   #通信を行う(60秒間応答があるまで待機し、応答がなかった場合通信を終了する)
 
 
 client.loop_forever()  #通信を続ける

#br

**MQTT(通信プロトコル)の説明 [#h1321c55]
主な説明はこちら&br;
#br
-MQTTとは通信の様式を表すものである。
-MQTTはpublisherとsubscriberの間にbrokerが存在しており、情報の受け渡しは全てこのbrokerが担当している。普段使っているメールアプリみたいなイメージをすると良い。
#ref(2016b/Member/bicky/Mission0/mqtt.png,50%)

[[変形についてはこちら>#hen]]&br;
[[移動方向の変更についてはこちら>#ido]]

#br

*ロボット本体の解説 [#w490f554]
今回バッターロボットの設計は主にbickyが行った(実質の初作品)&br;いかに少ない部品でカッコよく、他の班にはないインパクトを与えられるかということに拘った。打球については、野球らしさを出すため、ボールを転がすとボールがそれてしまうことを恐れたため空中に投げられたボールをそのまま打つことにした。今回は点数のための確実性をあえて捨て、思うがままにロボットを作成した。(ネタに走った。)
#br
全体図&br;
&ref(2016b/Member/bicky/Mission0/all.png,50%);
&ref(2016b/Member/bicky/Mission0/top1.png,50%);
&ref(2016b/Member/bicky/Mission0/front.png,50%);
#br

**使用した部品 [#q03e239e]
#ref(2016b/Member/bicky/Mission0/large.png,around,50%)
EV3 Lモーター ×1 (税込4,644円/個)
-特徴:重いものをゆっくり 動かすのが得意
-駆動輪、変形のために使用
-今回の重要な部品
#br
#clear
#br
#ref(2016b/Member/bicky/Mission0/mid.png,around,50%)
EV3 Mモーター ×1(税込3,780円)
-特徴:軽いものを素早く 動かすのが得意
-前輪の操作、打撃を行うために使用
#clear
#br
#ref(2016b/Member/bicky/Mission0/support1.png,around,50%)
支え(球状キャスター)
-ロボットの支えとして最適な支え
#clear
#br
**ブレーキ・変形機構(最重要) [#l0562dda]
&ref(2016b/Member/bicky/Mission0/brake2.png,50%);
&ref(2016b/Member/bicky/Mission0/brake.png,50%);
#br
&ref(2016b/Member/bicky/Mission0/brake3.png,50%);
//&ref(2016b/Member/bicky/Mission0/brake5.png,50%);
&ref(2016b/Member/bicky/Mission0/brake6.png,40%);
-変形時に駆動輪を固定することでロボットが変形する
-今回の大きな特徴
#clear
**前輪の機構(ステアリング機構) [#k5d13991]
#ref(2016b/Member/bicky/Mission0/stearing.png,around,50%)
-この機構のおかげでLモーター1つでロボットを動かすことができた
-今回のこだわり
#clear
#br

*ロボットの仕組みの解説 [#x7a361d9]
**ロボットの駆動について[#p09b062c]
&aname(ido);
前後の移動は後輪のLモーターが行い、移動向きの変更は前輪のMモーターが行った。
***移動向きの変更(ステアリング機構) [#ad13b6c9]
//#ref(2016b/Member/bicky/Mission0/.gif,around,50%)
#ref(2016b/Member/bicky/Mission0/stear.gif,around,50%)
Mモーターが動くことによって前輪の向きが変わり、二輪車と同様に移動方向が変わる
#clear
**変形について[#nba0d8a2]
&aname(hen); 
***Lモーターからの動力を変形に利用する [#s22be2b4]
#br
1
&ref(2016b/Member/bicky/Mission0/meta.png,50%);
2&ref(2016b/Member/bicky/Mission0/meta1.png,50%);
3&ref(2016b/Member/bicky/Mission0/meta2.png,50%);&br;
#br
4&ref(2016b/Member/bicky/Mission0/meta3.png,50%);
別視点&ref(2016b/Member/bicky/Mission0/meta4.png,50%);
#br
6#ref(2016b/Member/bicky/Mission0/.gif,around,50%)
6
#ref(2016b/Member/bicky/Mission0/tran.gif,around,50%);
#br
Mモーターを動かすことにより、Lモーターから後輪へ動力を伝えるギアに小さなギアを噛ませ、後輪が動かなくする。&br;
後輪が動かない状態でLモーターを動かすことでLモーター自身が持ち上がり、変形する。
#clear

**打撃について [#v636ba0f]
#ref(2016b/Member/bicky/Mission0/batter.png,50%)
変形後にバットを構え、MQTTにより合図が送られた時にバットを振る&br;
この時、角度制御をしているためバットの振り過ぎによりロボットが痛むといったことは起こらない。

*まとめ [#e722d710]
**こだわりポイント [#e5a4a291]
-変形
-二輪車という見た目
-モーターLとMを1つづつしか使わないという縛り
-ステアリング機構
-各モーターの機能美を追求&br;
&ref(2016b/Member/bicky/Mission0/midi_dual1.png,50%);
&ref(2016b/Member/bicky/Mission0/large2.png,50%);

**反省点 [#h7032f31]
-ステアリング機構で不具合が多発したため、その機構の改良が必要だった
-移動の精度があまりよくなかった
-超音波センサでピッチャーとの距離を測り、バッティング位置の修正を行う必要があった
-徹夜は1日まで

**感想 [#s3f40d9b]
今回は初めてロボット本体の設計をほぼ一人で行いました。今までLegoを触ってこなかったためかうまく組み上げられなかったため、ロボットが組みあがったのは本番の前日でした。まあ、動作中の不具合により解体しましたが。そのため、徹夜でロボットを再設計し、プログラムを書き換えました(笑)。通信のプログラムに関してはbeingさんに丸投げし、使い方を教えてもらいました。また本番直前で通信がうまくいかなくOSを移植するという事態となり、beingさん、penさんに助けてもらいました。beingさん、penさんに感謝。&br;
時間がなかったことや、ゼミをうけている当初から変形ロボットやステアリング機構を持つロボットを作ってみたかったこともあり、最後まで拘ってロボットの製作をしたため徹夜&練習なしのぶっつけ本番となってしまいました。本番中に練習時間が取れたこともあり、移動や変形がある程度うまく行ったのですが、やはりこういったものはスケジュール管理が大切で特に徹夜は1日までと感じます。余談ですが今回徹夜をしてる際、pep◯i strong なるものを飲んでいたのですが、眠気が全く来ずに徹夜できました。コーラに感謝を。


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS