The Fool In The Valleyの雑記帳

-- 好奇心いっぱいのおじいちゃんが綴るよしなし事 --

EV3でハノイの塔を その7

今回は、「EV3でハノイの塔を その6」で”パズルを解く具体的な処理”の2)として挙げた、X軸、Y軸、Z軸の原点の設定について説明します。それらの設定は自動的に行うようにしたいのですが、Mindstormsの部品で実現するとなると制約があり難しいところがあります。そこで、X軸、Z軸は自動的に実行し、Y軸はマニュアルで設定するという方式をとることにしました。 以下にその方法について記します。


原点を次のように定義する。
x軸の原点:円盤がささっている柱が移動する方向をX軸とする。最初に円盤がささっている柱の中心に着目し、それがグリッパーの中心と一致した位置をX軸の原点とする。
y軸の原点:グリッパーの片方の爪の先端に着目しそれが動く方向を考える。厳密にはそれは円弧になるが、グリッパーが開閉する範囲では直線で近似することにして、それをY軸とする。その先端が他方の先端とぴったり合わさった位置をY軸の原点とする。
z軸の原点:グリッパー全体が移動する方向をZ軸とする。グリッパーの先端が台に近接した位置をZ軸の原点とする。

x軸とz軸はEV3のタッチセンサーを使って、決めることができる。

f:id:tfitv:20210314162105j:plain
x軸、z軸原点
y軸についてはタッチセンサーを使うことが困難なので、IRリモコンを使ってグリッパーを閉じ、ぴったり閉じたときの位置をy軸方向の原点とすることにする。
f:id:tfitv:20210314162509j:plain
y軸原点
タッチセンサーを使ったx軸、z軸の自動位置決めのためのPythonプログラムは以下のとおりである。

#!/usr/bin/env pybricks-micropython
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, TouchSensor
from pybricks.parameters import Port

motor_x = Motor(Port.A)
motor_z = Motor(Port.C)
x_limit = TouchSensor(Port.S4)
z_limit = TouchSensor(Port.S3)

motor_x.run(-150)
while not x_limit.pressed():
    pass
motor_x.brake()
motor_x.run_angle(150, 95, then=Stop.HOLD, wait=True) 
motor_x.reset_angle(0)

motor_z.run(-250)
while not z_limit.pressed():
    pass
motor_z.brake()
motor_z.reset_angle(0)

下のビデオはこれを実行したときの様子を2方向から撮影したものである。 youtu.be

EV3でハノイの塔を その6 ⇔ EV3でハノイの塔を その8