Функции

Функции позволяют разбивать код на логические блоки, делать его читаемым и избегать дублирования. В робототехнике это особенно полезно для повторяющихся действий (поворот, сканирование, движение по линии).

Создание функции

Функция объявляется с помощью ключевого слова def.

def my_function():
    print("Это моя функция!")

# Вызов функции
my_function()

Функции с параметрами

Параметры позволяют передавать данные внутрь функции, делая её универсальной.

def drive_distance(distance_mm, speed):
    print("Едем", distance_mm, "мм со скоростью", speed)
    # drive_base.straight(distance_mm) # Пример реального кода

# Вызов с разными параметрами
drive_distance(500, 200)
drive_distance(100, 50)

Возврат значений (return)

Функция может не только выполнять действия, но и возвращать результат (например, показания датчика или вычисления).

def get_distance_cm():
    dist_mm = ultrasonic.distance()
    return dist_mm / 10

# Использование результата
current_dist = get_distance_cm()
if current_dist < 10:
    drive_base.stop()

Реальный пример: Движение до препятствия

Вместо того чтобы писать цикл while каждый раз, когда нужно подъехать к стене, вынесем это в функцию.

def drive_until_wall(speed, stop_distance):
    # Начинаем движение
    drive_base.drive(speed, 0)

    # Ждем, пока датчик не увидит стену ближе, чем stop_distance
    while ultrasonic.distance() > stop_distance:
        wait(10)

    # Останавливаемся
    drive_base.stop()

# Теперь код программы становится очень чистым:
drive_until_wall(200, 100) # Ехать со скоростью 200, пока до стены не останется 100 мм
drive_until_wall(500, 300) # Ехать быстрее, остановиться раньше

Пример: Движение по квадрату

def drive_square(side_length):
    for i in range(4):
        drive_base.straight(side_length)
        drive_base.turn(90)

# Проехать маленький квадрат
drive_square(100)

# Проехать большой квадрат
drive_square(500)

Советы

  • Именуйте понятно: Имя функции должно быть глаголом (что делает?), например scan_area, follow_line.
  • Одна задача: Функция должна делать что-то одно. Если функция называется drive_and_scan_and_beep, лучше разбить её на три.