robotics -- ロボティクスとドライブベース

Pybricks API 用のロボティクスモジュール

motormotor56mm114mmdrive baseleftrightwithand
class DriveBase(left_motor, right_motor, wheel_diameter, axle_track)

2つの動力車輪と、オプションで補助輪やキャスターを持つロボット車両。

ロボットの寸法を指定することで、指定した距離をミリメートル単位で駆動したり、指定した角度だけ旋回したりすることが簡単にできるクラスです。

距離、半径、駆動速度が の場合は 前進 を意味し、 の場合は 後進 を意味します。

角度や旋回速度が の場合は、右に曲がることを意味します。 の場合は左回りを意味します。つまり、上から見て、プラスは時計回り、マイナスは反時計回りを意味します。

直径と軸の軌跡の値を測定して調整するコツは measuring の章を参照してください。

パラメータ:
  • left_motor (Motor) -- 左車輪を駆動するモーター。

  • right_motor (Motor) -- 右の車輪を駆動するモーター。

  • wheel_diameter (Number, mm) -- 車輪の直径。

  • axle_track (Number, mm) -- 両輪が地面に接しているところの間の距離。

指定の距離または角度で走行させる方法

次のコマンドを使用すると、指定した距離だけ走行したり、指定した角度だけ旋回したりすることができます。

これは内部の回転センサーで測定しています。移動中に車輪が滑ることがあるので、移動距離や角度はあくまで目安です。

250mmholddrive basedrivestraightforthen
awaitstraight(distance, then=Stop.HOLD, wait=True)

一定距離直進した後、停止します。

パラメータ:
  • distance (Number, mm) -- 移動する距離

  • then (Stop) -- 停止した後の挙動。

  • wait (bool) -- 動作が完了するのを待ってから、プログラムの続きを実行するのかの指定。

90°holddrive basedriveturnbythen
awaitturn(angle, then=Stop.HOLD, wait=True)

指定の角度だけその場で回転し、停止する。

パラメータ:
  • angle (Number, deg) -- 回転する角度。

  • then (Stop) -- 停止した後の挙動。

  • wait (bool) -- 動作が完了するのを待ってから、プログラムの続きを実行するのかの指定。

バージョン 3.6 で変更: curve() Python メソッドは arc() メソッドに置き換えられます。どちらもカーブを描くことができますが、走行方向と旋回方向の定義が異なります。既存の curve() を使ったコードは引き続き同じように動作しますが、新しいコードでは arc() の利用を推奨します。ブロックコードを使っている場合は、パレットから新しいブロックを選択してコードを更新できます。古いブロックも動作しますが、アップグレードを促す警告アイコンが表示されます。更新された curve オプションは、以下に示す新しい方向の定義を使います。また、新しい veer オプションを使うと、特定の距離だけ円を描くように走行でき、わずかに方向を変えながら進むのに便利です。

100mm90°holddrive basedrivecurvewith radiusbythen
500mm250mmholddrive basedriveveerwith radiusbythen
awaitarc(radius, angle=None, distance=None, then=Stop.HOLD, wait=True)

指定した半径で円弧(部分的な円)を描くように走行します。移動距離は角度(度)または距離(mm)で指定できます。

正の半径を指定すると、ロボットは右方向の円弧を描いて走行します。負の半径を指定すると、ロボットは左方向の円弧を描いて走行します。

円周上をどれだけ移動するかを、角度(度)または距離(mm)で指定できます。正の値を指定すると円に沿って前進し、負の値を指定すると後退します。

パラメータ:
  • radius (Number, mm) -- 円の半径。

  • angle (Number, deg) -- 円に沿って移動する角度。

  • distance (Number, mm) -- ロボットの中心で測定された、円に沿って移動する距離。

  • then (Stop) -- 停止した後の挙動。

  • wait (bool) -- 動作が完了するのを待ってから、プログラムの続きを実行するのかの指定。

例外:

ValueError -- angle または distance のいずれかを指定する必要がありますが、両方を指定することはできません。半径はゼロにできません。その場で回転する場合は turn() を使ってください。

200mm/sdrive baseconfiguredrive speed
750mm/s²drive baseconfiguredrive acceleration
150°/sdrive baseconfigureturn speed
750°/s²drive baseconfigureturn acceleration
settings(straight_speed, straight_acceleration, turn_rate, turn_acceleration)
settings() Tuple[int, int, int, int]

ドライブベースの速度と加速度を設定します。

引数を与えない場合は、現在の値をタプルとして返します。

初期値は、車輪の直径と車軸の軌跡に基づいて自動的に設定されます。ロボットが最大速度の約40%で駆動するよう設定されています。

drive() メソッドでは、独自の速度値を引数で指定するので、これで設定した速度値は適用されません。

パラメータ:
  • straight_speed (Number, mm/s) -- ロボットの前進速度。

  • straight_acceleration (Number, mm/s²) -- ロボットの前進加速度および減速度。加速度と減速度を別々に設定するために、2つの値を持つタプルを指定します。

  • turn_rate (Number, deg/s) -- ロボットの旋回速度。

  • turn_acceleration (Number, deg/s²) -- ロボットの角度加速度・減速度。加速度と減速度を別々に設定するために、2つの値を持つタプルを指定します。

done() bool

進行中のコマンドや動作が行われているかどうかをチェックします。

戻り値:

コマンドが完了した場合は True 、完了していない場合は False

永久駆動

drive() を使って、任意の速度とステアリングで走行を開始します。

stop() を使うか、もう一度 drive() を使って進路を変更するまで走り続けます。たとえば、センサーが反応するまで運転し、その後停止または方向転換するようにできます。

100mm/s0°/sdrive basedriveforeveratand turn at
drive(speed, turn_rate)

指定された速度と回転数で走行を開始します。どちらの値も、ロボットの車輪の間の中心点で計測されます。

パラメータ:
  • speed (Number, mm/s) -- ロボットの速度。

  • turn_rate (Number, deg/s) -- ロボットの旋回速度。

drive basecoaststop
stop()

モーターの動作を止め、惰性でロボットが停止するにまかせます。

drive basebrakestop
brake()

モーターに逆トルクをかけることで、ロボットを停止させます。

drive baseholdstop

計測

drive basegetdistance
distance() int: mm

推定走行距離を取得します。

戻り値:

前回リセットしてからの走行距離。

drive basegetangle
angle() int: deg

駆動基部の推定回転角度を取得します。

戻り値:

前回のリセットからの累積角度。

drive basegetspeed
drive basegetturn rate
state() Tuple[int, int, int, int]

ロボットの状態を取得します。

戻り値:

ロボットの距離、駆動速度、角度、旋回速度のタプル。

バージョン 3.6 で変更: ドライブベースが停止するようになりました。ゼロでない値を使えるようになりました。

drive base0mm0°reset distanceangle
reset(distance=0, angle=0)

推定走行距離と向きの角度をリセットします。

これにより、進行中の動作を停止するために stop() も呼び出されます。また、ロボットが use_gyro()True に設定して制御されている場合、このメソッドを呼び出すとジャイロも指定した角度に設定されます。

パラメータ:
  • distance (Number, mm) -- ロボットの速度。

  • angle (Number, deg) -- ロボットの向きの角度

stalled() bool

ドライブベースが現在失速しているかどうかをチェックします。

最大限の動作量を与えても、目標速度や位置に到達できない場合に失速しているとみなされます。

戻り値:

ドライブベースが失速していれば True 、失速していなければ False

ジャイロセンサーの利用

drive baseusegyro
use_gyro(use_gyro)

旋回と前進駆動にジャイロセンサーを使う場合は True を指定します。モーター内蔵の回転センサーに依存する場合は False を指定します

このメソッドは、進行中の動作を停止するために自動的に stop() を呼び出します。

パラメータ:

use_gyro (bool) -- 有効にするには True 、無効にするには False

ハブがロボットに平らに取り付けられていない場合、 PrimeHub(), InventorHub(), EssentialHub(), TechnicHub() を初期化する際に、必ず "top_sidefront_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.2 で変更: done()stalled() メソッドは移動しました。

motormotorcarwith steeringand drive

バージョン 3.4 で追加.

class Car(steer_motor, drive_motors, torque_limit=100)

一つの旋回モーターと、一つ以上の駆動モーターを備えた車両です。

このクラスを使うと、旋回モーターは自動的に中心位置を見つけます。これによって、どの角度が100%の旋回に対応するかも決定されます。

パラメータ:
  • steer_motor (Motor) -- 前輪を旋回するモーター。

  • drive_motors (Motor) -- 車輪を駆動するモーター。複数のモーターを使う場合はタプルで指定してください。

  • torque_limit (Number, %) -- ステアリング機構のエンドポイント発見に使う最大トルク制限。ステアリングモーターの最大トルクに対する割合で指定します。

car0%steer by
steer(percentage)

指定した量だけ前輪を旋回します。初期化時に決定された角度により、100% では右に、-100% では左に旋回し、0% では直進します。

パラメータ:

steering (Number, %) -- 前輪の旋回量。

50%cardrive atpower
drive_power(power)

指定のパワーレベルで車を駆動します。

power に指定した値は、バッテリー電圧に対する割合としてモーター電圧を設定するのに使います。これが 10% 以下の場合、車が突然ブレーキをかける代わりに、スムーズに転がるように車輪を惰性走行させます。

この命令は、ボタン押下やジョイスティックの動きに即座に反応が必要なリモートコントロールアプリケーションで役立ちます。

パラメータ:

speed (Number, %) -- 車両の速度。

500°/scardrive atspeed
drive_speed(speed)

指定したモーター速度で車を駆動します。正の値は前進、負の値は後進します。

この命令は、緩やかな加速と減速でより精密な運転に役立ちます。これにより、障害物を横切る際の速度維持のために自動的に電力を増加させます。

パラメータ:

speed (Number, deg/s) -- 駆動モーターの角速度。

サンプルコード

ドライブベースでの直進とその場での旋回

このプログラムでは、基本の走行と旋回を使った例を示しています。

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)