robotics -- ロボティクスとドライブベース¶
Pybricks API 用のロボティクスモジュール
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|---|
- class DriveBase(left_motor, right_motor, wheel_diameter, axle_track)¶
2つの動力車輪と、オプションで補助輪やキャスターを持つロボット車両。
ロボットの寸法を指定することで、指定した距離をミリメートル単位で駆動したり、指定した角度だけ旋回したりすることが簡単にできるクラスです。
距離、半径、駆動速度が 正 の場合は 前進 を意味し、 負 の場合は 後進 を意味します。
角度や旋回速度が 正 の場合は、右に曲がることを意味します。 負 の場合は左回りを意味します。つまり、上から見て、プラスは時計回り、マイナスは反時計回りを意味します。
直径と軸の軌跡の値を測定して調整するコツは measuring の章を参照してください。
- パラメータ:
指定の距離または角度で走行させる方法
次のコマンドを使用すると、指定した距離だけ走行したり、指定した角度だけ旋回したりすることができます。
これは内部の回転センサーで測定しています。移動中に車輪が滑ることがあるので、移動距離や角度はあくまで目安です。
バージョン 3.6 で変更:
curve()Python メソッドはarc()メソッドに置き換えられます。どちらもカーブを描くことができますが、走行方向と旋回方向の定義が異なります。既存のcurve()を使ったコードは引き続き同じように動作しますが、新しいコードではarc()の利用を推奨します。ブロックコードを使っている場合は、パレットから新しいブロックを選択してコードを更新できます。古いブロックも動作しますが、アップグレードを促す警告アイコンが表示されます。更新された curve オプションは、以下に示す新しい方向の定義を使います。また、新しい veer オプションを使うと、特定の距離だけ円を描くように走行でき、わずかに方向を変えながら進むのに便利です。- awaitarc(radius, angle=None, distance=None, then=Stop.HOLD, wait=True)¶
指定した半径で円弧(部分的な円)を描くように走行します。移動距離は角度(度)または距離(mm)で指定できます。
正の半径を指定すると、ロボットは右方向の円弧を描いて走行します。負の半径を指定すると、ロボットは左方向の円弧を描いて走行します。
円周上をどれだけ移動するかを、角度(度)または距離(mm)で指定できます。正の値を指定すると円に沿って前進し、負の値を指定すると後退します。
- パラメータ:
- 例外:
ValueError --
angleまたはdistanceのいずれかを指定する必要がありますが、両方を指定することはできません。半径はゼロにできません。その場で回転する場合はturn()を使ってください。
- settings(straight_speed, straight_acceleration, turn_rate, turn_acceleration)¶
- settings() Tuple[int, int, int, int]
ドライブベースの速度と加速度を設定します。
引数を与えない場合は、現在の値をタプルとして返します。
初期値は、車輪の直径と車軸の軌跡に基づいて自動的に設定されます。ロボットが最大速度の約40%で駆動するよう設定されています。
drive()メソッドでは、独自の速度値を引数で指定するので、これで設定した速度値は適用されません。
永久駆動
drive()を使って、任意の速度とステアリングで走行を開始します。stop()を使うか、もう一度drive()を使って進路を変更するまで走り続けます。たとえば、センサーが反応するまで運転し、その後停止または方向転換するようにできます。- drive(speed, turn_rate)¶
指定された速度と回転数で走行を開始します。どちらの値も、ロボットの車輪の間の中心点で計測されます。
- stop()¶
モーターの動作を止め、惰性でロボットが停止するにまかせます。
- brake()¶
モーターに逆トルクをかけることで、ロボットを停止させます。
計測
- distance() int: mm¶
推定走行距離を取得します。
- 戻り値:
前回リセットしてからの走行距離。
- angle() int: deg¶
駆動基部の推定回転角度を取得します。
- 戻り値:
前回のリセットからの累積角度。
バージョン 3.6 で変更: ドライブベースが停止するようになりました。ゼロでない値を使えるようになりました。
- reset(distance=0, angle=0)¶
推定走行距離と向きの角度をリセットします。
これにより、進行中の動作を停止するために
stop()も呼び出されます。また、ロボットがuse_gyro()をTrueに設定して制御されている場合、このメソッドを呼び出すとジャイロも指定した角度に設定されます。
- stalled() bool¶
ドライブベースが現在失速しているかどうかをチェックします。
最大限の動作量を与えても、目標速度や位置に到達できない場合に失速しているとみなされます。
- 戻り値:
ドライブベースが失速していれば
True、失速していなければFalse。
❌ ❌ ✅ ✅ ✅ ✅ ジャイロセンサーの利用
- use_gyro(use_gyro)¶
旋回と前進駆動にジャイロセンサーを使う場合は
Trueを指定します。モーター内蔵の回転センサーに依存する場合はFalseを指定しますこのメソッドは、進行中の動作を停止するために自動的に
stop()を呼び出します。- パラメータ:
use_gyro (bool) -- 有効にするには
True、無効にするにはFalse。
ハブがロボットに平らに取り付けられていない場合、
PrimeHub(),InventorHub(),EssentialHub(),TechnicHub()を初期化する際に、必ず "top_sideとfront_sideのパラメータを指定してください。こうすることで、ロボットが旋回するときにどの回転を測定すればよいかがわかります。各ハブのジャイロは多少異なるため、大きく旋回する場合や同じ方向に何度も小さく旋回する場合には数度ずれることがあります。たとえば、ロボットがフルに360°旋回させるには、
turn(357)やturn(362)などとする必要があるかもしれません。デフォルトで、このクラスは移動が完了した後、ロボットの位置を維持しようとします。つまり、ロボットを持ち上げると、その方位角を維持するために車輪が回転することになります。これを避けるには、最後の
straight,turn,arcコマンドでthen=Stop.COASTを指定します。ロボットの寸法の計測と検証
最初の見積りとして、定規を使って
wheel_diameter(車輪の直径)と``axle_track`` (車輪間の距離)を計測できます。車輪が効果的に地面に接している箇所を確認するのは難しいので、車輪の中点間の距離としてaxle_trackを推定できます。定規がない場合は、レゴのビームを使って計測できます。穴の中心から中心までの距離は8mmです。タイヤによっては、側面に直径が印刷されているものもあります。たとえば、62.4 × 20 と印刷されていれば、直径が 62.4mm で、幅が 20mm であることを意味します。
実際のところ、ほとんどの車輪はロボットの重量でわずかに圧縮されます。そこで、
my_robot.straight(1000)を使ってロボットを 1000mm 走行させ、実際にどの程度走行したかを計測してみましょう。以下のように補正してください:ロボットの走行距離が 足りない 場合は、
wheel_diameterの値を少し 小さく してください。ロボットの走行距離が 長すぎる 場合は、
wheel_diameterの値を少し 大きく してください。
モーターシャフトと車軸はロボットの負荷でわずかに曲がり、車輪の接地点がロボットの中央寄りになります。確認するには、
my_robot.turn(360)を使ってロボットを360度回転させ、同じ場所に戻ってくるかどうかをチェックしてください:ロボットの旋回が 十分でない 場合は、
axl_trackの値を少し 大きく してください。ロボットが曲がり すぎる 場合は、
axl_trackの値を少し 小さく します。
これらの調整を行う際は、上記のように必ず
wheel_diameterを先に調整します。調整が終わったら、旋回と直進の両方を必ずテストしてください。DriveBase のモーターを個別に使う
DriveBaseオブジェクトを作成した後でも、その2つのモーターを個別に使えます。片方のモーターを起動すると、もう片方のモーターは自動的に停止します。同様に、モータが既に動いている状態でドライブベースを動かすと、元の操作がキャンセルされ、ディードライブベースが引き継ぎます。高度な設定
settings()メソッドは、直進や旋回時のデフォルトの速度や加速度など、よく使われる設定を調整するために使います。より高度な制御設定を調整するには、次の属性を使います。- distance_control¶
走行距離と駆動速度は、PIDコントローラによって制御されます。この属性を使って、その設定を変更できます。利用可能なメソッドの概要については、 motor control 属性を参照してください。
distance_control属性は同じ機能を持ちますが、設定は1つのモーターで回転する度数ではなく、ドライブベースで駆動する全てのミリメートルに対して適用されます。
- heading_control¶
ロボットの旋回角度と旋回速度は、PIDコントローラによって制御されます。この属性を使ってその設定を変更できます。利用可能な方法の概要については、 motor control 属性を参照してください。
heading_control属性は同じ機能を持ちますが、設定は1つのモーターが回す度数ではなく、ドライブベース全体の(上から見た)回転の度数に対して適用されます。
| ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
|---|
バージョン 3.4 で追加.
- class Car(steer_motor, drive_motors, torque_limit=100)¶
一つの旋回モーターと、一つ以上の駆動モーターを備えた車両です。
このクラスを使うと、旋回モーターは自動的に中心位置を見つけます。これによって、どの角度が100%の旋回に対応するかも決定されます。
- パラメータ:
- steer(percentage)¶
指定した量だけ前輪を旋回します。初期化時に決定された角度により、100% では右に、-100% では左に旋回し、0% では直進します。
- パラメータ:
steering (Number, %) -- 前輪の旋回量。
- drive_power(power)¶
指定のパワーレベルで車を駆動します。
powerに指定した値は、バッテリー電圧に対する割合としてモーター電圧を設定するのに使います。これが 10% 以下の場合、車が突然ブレーキをかける代わりに、スムーズに転がるように車輪を惰性走行させます。この命令は、ボタン押下やジョイスティックの動きに即座に反応が必要なリモートコントロールアプリケーションで役立ちます。
- パラメータ:
speed (Number, %) -- 車両の速度。
サンプルコード¶
ドライブベースでの直進とその場での旋回¶
このプログラムでは、基本の走行と旋回を使った例を示しています。
from pybricks.pupdevices import Motor
from pybricks.parameters import Port, Direction
from pybricks.robotics import DriveBase
# 両方のモーターを初期化します。この例では、ロボットを前進させる
# ためには、左側のモータを反時計回りに回転させる必要があります。
left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.B)
# ドライブベースを初期化します。この例では、車輪の直径は 56mm です。
# 2つの車輪と地面の接触点間の距離は 112mm です。
drive_base = DriveBase(left_motor, right_motor, wheel_diameter=56, axle_track=112)
# 必要に応じて、精度向上のために次の行のコメントを外します。
# drive_base.use_gyro(True)
# 500mm (0.5m)前進させる。
drive_base.straight(500)
# 時計回りに旋回させる(180度)
drive_base.turn(180)
# 元に戻るために再度前進する。
drive_base.straight(500)
# 反時計回りに旋回させる。
drive_base.turn(-180)
前輪で旋回する車両でのリモートコントロール¶
このプログラムは、前輪で旋回する車両を リモートコントロール で運転する方法を示しています。
このプログラムでは、 LEGO Technic 42099 Off-Roader のポートに合わせていますが、前輪で旋回の他の車でも使えます。車両に1つの駆動モーターしかない場合、以下で使っている複数のモーターのタプルの代わりに単一のモーターを指定できます。
from pybricks.parameters import Direction, Port, Button
from pybricks.pupdevices import Motor, Remote
from pybricks.robotics import Car
from pybricks.tools import wait
# モーターをセットアップ。
front = Motor(Port.A, Direction.COUNTERCLOCKWISE)
rear = Motor(Port.B, Direction.COUNTERCLOCKWISE)
steer = Motor(Port.C, Direction.CLOCKWISE)
# リモート接続。
remote = Remote()
# 車両をセットアップ。
car = Car(steer, [front, rear])
# ここでメインプログラムをスタート。
while True:
# リモート指示を読み取り。
pressed = remote.buttons.pressed()
# 左パッドで旋回。旋回量は初期化時に決定された角度のパーセンテージ。
steering = 0
if Button.LEFT_PLUS in pressed:
steering += 100
elif Button.LEFT_MINUS in pressed:
steering -= 100
car.steer(steering)
# 右パッドで駆動。
power = 0
if Button.RIGHT_PLUS in pressed:
power += 100
elif Button.RIGHT_MINUS in pressed:
power -= 100
car.drive_power(power)
# 少し待機。
wait(10)