コンテンツにスキップ
日本語

移動

ロボットには 2 つの車輪があり、それぞれに専用のモーターが付いています。スターターロボットでは left wheel motor と right wheel motor です。各車輪の速度を設定してロボットを動かします。

左の車輪 右の車輪 ロボットの動き
前進 前進 前進する
後退 後退 後退する
後退 前進 その場で左に回転する
前進 後退 その場で右に回転する
速い 遅い 右にカーブする

前進、後退、その場で左回転、その場で右回転、右カーブをするロボット。矢印は各車輪の速度を表す

速度の単位は ラジアン毎秒 で、最大 6.28(1 秒に車輪 1 回転)です。負の速度にすると車輪は逆回転します。

  1. 名前を指定して各モーターを取得します。
  2. 位置を無限大に設定して、制限なく回るようにします。
  3. 速度を設定します。

モーターは最後に設定した速度を保つので、プログラムがほかの処理をしている間もロボットは動き続けます。このプログラムは、前進、後退、左回転をそれぞれ 1 秒ずつ行います。

from controller import Robot
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
maxSpeed = 6.28 # The maximum speed of the wheels, in radians per second
leftWheel = robot.getDevice("left wheel motor")
rightWheel = robot.getDevice("right wheel motor")
leftWheel.setPosition(float("inf"))
rightWheel.setPosition(float("inf"))
def drive(left, right, seconds):
# Set the speed of each wheel, and keep it for some time
leftWheel.setVelocity(left)
rightWheel.setVelocity(right)
start = robot.getTime()
while robot.step(timeStep) != -1:
if robot.getTime() - start >= seconds:
break
drive(maxSpeed, maxSpeed, 1.0) # Forward
drive(-maxSpeed, -maxSpeed, 1.0) # Backward
drive(-2.0, 2.0, 1.0) # Spin to the left
drive(0, 0, 0.1) # Stop
print("Done")

車輪がどれだけ回ったかを測る

Section titled “車輪がどれだけ回ったかを測る”

各モーターには位置センサー(エンコーダーとも呼びます)があり、車輪が回った量をラジアンで数えます。決まった距離を走らせるのに便利です。逆回転すると値は減っていきます。

from controller import Robot
robot = Robot()
timeStep = int(robot.getBasicTimeStep())
leftWheel = robot.getDevice("left wheel motor")
rightWheel = robot.getDevice("right wheel motor")
leftWheel.setPosition(float("inf"))
rightWheel.setPosition(float("inf"))
# Each wheel has a position sensor, which counts how far it has turned
leftEncoder = leftWheel.getPositionSensor()
rightEncoder = rightWheel.getPositionSensor()
leftEncoder.enable(timeStep)
rightEncoder.enable(timeStep)
robot.step(timeStep) # Step once, so that the sensors have a value
start = leftEncoder.getValue()
leftWheel.setVelocity(5.0)
rightWheel.setVelocity(5.0)
while robot.step(timeStep) != -1:
turned = leftEncoder.getValue() - start
if turned > 10.0: # Stop after 10 radians
break
leftWheel.setVelocity(0)
rightWheel.setVelocity(0)
print("Left wheel:", round(leftEncoder.getValue() - start, 2), "rad")

時間で動きを制御するのは簡単ですが、結果は速度によって変わります。エンコーダーは動きそのものを測るので、より確実です。正確に旋回したいなら、ジャイロがさらに適しています。

次は、センサーの読み取り方を学びましょう。