今回は、「EV3でハノイの塔を その6」で”パズルを解く具体的な処理”の2)として挙げた、X軸、Y軸、Z軸の原点の設定について説明します。それらの設定は自動的に行うようにしたいのですが、Mindstormsの部品で実現するとなると制約があり難しいところがあります。そこで、X軸、Z軸は自動的に実行し、Y軸はマニュアルで設定するという方式をとることにしました。 以下にその方法について記します。
原点を次のように定義する。
x軸の原点:円盤がささっている柱が移動する方向をX軸とする。最初に円盤がささっている柱の中心に着目し、それがグリッパーの中心と一致した位置をX軸の原点とする。
y軸の原点:グリッパーの片方の爪の先端に着目しそれが動く方向を考える。厳密にはそれは円弧になるが、グリッパーが開閉する範囲では直線で近似することにして、それをY軸とする。その先端が他方の先端とぴったり合わさった位置をY軸の原点とする。
z軸の原点:グリッパー全体が移動する方向をZ軸とする。グリッパーの先端が台に近接した位置をZ軸の原点とする。
x軸とz軸はEV3のタッチセンサーを使って、決めることができる。 y軸についてはタッチセンサーを使うことが困難なので、IRリモコンを使ってグリッパーを閉じ、ぴったり閉じたときの位置を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