此示例项目展示了如何使用 Tank Bot 上的陀螺仪传感器可进行准确转弯。根据您按下的 EV3 积木按钮,机器人会以三角形、正方形、五边形或六边形驱动。
在本站可查找扩展套装模型的所有拼搭说明。
图 33 坦克机器人
#!/usr/bin/env pybricks-micropython
"""
Example LEGO® MINDSTORMS® EV3 Tank Bot Program
----------------------------------------------
This program requires LEGO® EV3 MicroPython v2.0.
Download: https://education.lego.com/en-us/support/mindstorms-ev3/python-for-ev3
Building instructions can be found at:
https://education.lego.com/en-us/support/mindstorms-ev3/building-instructions#building-expansion
"""
from pybricks.hubs import EV3Brick
from pybricks.ev3devices import Motor, GyroSensor
from pybricks.parameters import Port, Direction, Button
from pybricks.tools import wait
from pybricks.robotics import DriveBase
from pybricks.media.ev3dev import ImageFile
# Initialize the EV3 brick.
ev3 = EV3Brick()
# Configure 2 motors on Ports B and C. Set the motor directions to
# counterclockwise, so that positive speed values make the robot move
# forward. These will be the left and right motors of the Tank Bot.
left_motor = Motor(Port.B, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.C, Direction.COUNTERCLOCKWISE)
# The wheel diameter of the Tank Bot is about 54 mm.
WHEEL_DIAMETER = 54
# The axle track is the distance between the centers of each of the
# wheels. This is about 200 mm for the Tank Bot.
AXLE_TRACK = 200
# The Driving Base is comprised of 2 motors. There is a wheel on each
# motor. The wheel diameter and axle track values are used to make the
# motors move at the correct speed when you give a drive command.
robot = DriveBase(left_motor, right_motor, WHEEL_DIAMETER, AXLE_TRACK)
# Set up the Gyro Sensor. It is used to measure the angle of the robot.
# Keep the Gyro Sensor and EV3 steady when connecting the cable and
# during start-up of the EV3.
gyro_sensor = GyroSensor(Port.S4)
# Initialize the steering and overshoot variables.
steering = 60
overshoot = 5
def right_angle():
# This function drives the robot forward, turn a right angle, drive
# forward again, and then turn 180 degrees to drive back along the
# same path and return to its initial position.
# Reset the Gyro Sensor angle.
gyro_sensor.reset_angle(0)
# Drive forward for 750 millimeters
robot.straight(750)
# Turn clockwise until the angle is 90 degrees.
robot.drive(0, steering)
ev3.speaker.beep()
while gyro_sensor.angle() < 90 - overshoot:
wait(1)
robot.drive(0, 0)
wait(1000)
# Drive forward for 750 millimeters
robot.straight(750)
# Turn clockwise until the angle is 270 degrees.
robot.drive(0, steering)
ev3.speaker.beep()
while gyro_sensor.angle() < 270 - overshoot:
wait(1)
robot.drive(0, 0)
wait(1000)
# Drive forward for 750 millimeters
robot.straight(750)
# Turn counterclockwise until the angle is 180 degrees.
robot.drive(0, -steering)
ev3.speaker.beep()
while gyro_sensor.angle() > 180 + overshoot:
wait(1)
robot.drive(0, 0)
wait(1000)
# Drive forward for 750 millimeters
robot.straight(750)
# Turn clockwise until the angle is 360 degrees.
robot.drive(0, steering)
ev3.speaker.beep()
while gyro_sensor.angle() < 360 - overshoot:
wait(1)
robot.drive(0, 0)
wait(1000)
def polygon(sides, length):
# This function drives the robot along a polygon path. It uses the
# number of sides to calculate the angle to turn to, and the length
# to calculate the time to drive straight.
# Reset the Gyro Sensor angle.
gyro_sensor.reset_angle(0)
# Calculate the angle to turn to and the time to drive straight.
angle = 360 / sides
# Drive along the polygon path.
for side in range(1, sides + 1):
target_angle = side * angle - overshoot
# Drive forward.
robot.straight(length)
# Turn clockwise until the angle equals the target angle.
robot.drive(0, steering)
ev3.speaker.beep()
while gyro_sensor.angle() < target_angle - overshoot:
wait(1)
robot.drive(0, 0)
wait(1000)
# This is the main part of the program. It is a loop that repeats
# endlessly.
#
# First, it waits until any Brick Button is pressed.
# Second, it displays the chosen pattern on the screen.
# Finally, it drives in the chosen pattern.
#
# Then the process starts over, so another pattern can be chosen.
while True:
# Display a question mark to indicate that the robot should await
# instructions.
ev3.screen.load_image(ImageFile.QUESTION_MARK)
# Wait until any Brick Button is pressed.
while not any(ev3.buttons.pressed()):
wait(10)
ev3.screen.clear()
# Respond to the Brick Button press. Display the chosen pattern on
# the screen and drive in this pattern.
if Button.UP in ev3.buttons.pressed():
# Drive in a right angle.
ev3.screen.draw_text(30, 50, "Right Angle")
wait(1000)
right_angle()
if Button.LEFT in ev3.buttons.pressed():
# Drive in a triangle shape.
ev3.screen.draw_text(30, 50, "Triangle")
wait(2000)
polygon(3, 850)
if Button.CENTER in ev3.buttons.pressed():
# Drive in a square shape.
ev3.screen.draw_text(30, 50, "Square")
wait(2000)
polygon(4, 700)
if Button.RIGHT in ev3.buttons.pressed():
# Drive in a pentagon shape.
ev3.screen.draw_text(30, 50, "Pentagon")
wait(2000)
polygon(5, 575)
if Button.DOWN in ev3.buttons.pressed():
# Drive in a hexagon shape.
ev3.screen.draw_text(30, 50, "Hexagon")
wait(2000)
polygon(6, 490)
wait(100)