Расстояние на роботе

Я создал robot который будет работать на основе python, Для его автономной программы мне нужно, чтобы он бежал на определенное расстояние (скажем, 10 футов). В настоящее время я использую время, чтобы пройти расстояние, но есть ли способ реализовать расстояние в коде, чтобы сделать его более точным. Спасибо.

Это был код для старого соревнования по робототехнике, которое я провел, и я хочу научиться, улучшая его. Я использовал эти библиотеки:

import sys
import wpilib
import logging
from time import time

Это код:

def autonomous_straight(self):
    '''Called when autonomous mode is enabled'''

    t0 = time()

    slow_forward = 0.25

    t_forward_time = 6.5
    t_spin_time = 11
    t_shoot_time = 11.5


    while self.isAutonomous() and self.isEnabled():
        t = time() - t0

        if t < t_forward_time:

            self.motor_left.set(slow_forward)
            self.motor_right.set(-slow_forward)
            self.motor_gobbler.set(1.0)

        elif t < t_spin_time:
            self.motor_left.set(2 * slow_forward)
            self.motor_right.set(2 * slow_forward)
            self.motor_shooter.set(-1.0)

        elif t < t_shoot_time:
            self.motor_mooover.set(.5)

        else:
            self.full_stop()
            self.motor_gear.set(-1.0)

        wpilib.Timer.delay(0.01)

    self.full_stop()

1 ответ

Похоже, вы пытаетесь проехать расстояние, основанное на времени. Хотя это может работать на коротких расстояниях с известными скоростями, обычно лучше управлять на основе обратной связи с датчиком. То, на что вы хотите взглянуть, это encodersточнее, поворотные энкодеры. Кодеры - это просто счетчики, которые отслеживают "тики". Каждый тик представляет процент вращения вала привода.

формула

где d это пройденное расстояние, cir это окружность колеса res это "разрешение" кодера (количество тактов на оборот), и num текущее количество тиков (считывание с энкодера)

# Example Implementation
import wpilib
import math

# Some dummy speed controllers
leftSpeed = wpilib.Spark(0)
rightSpeed = wpilib.Spark(1)

# Create a new encoder linked to DIO pins 0 & 1
encoder = wpilib.Encoder(0, 1)

# Transform ticks into distance traveled
# Assuming 6" wheels, 512 resolution
def travelDist (ticks):
  return ((math.pi * 6) / 512) * ticks

# Define auto, takes travel distance in inches
def drive_for(dist = 10):
  while travelDist(encoder.get()) < dist:
    rightSpeed.set(1)
    leftSpeed.set(-1)  # negative because one controller must be inverted

Эта простая реализация позволит вам позвонить drive_for(dist) путешествовать на желаемое расстояние с достаточной степенью точности. Однако, у него довольно много проблем. Здесь мы пытаемся установить линейную скорость, обратите внимание, что контроль ускорения отсутствует. Это приведет к возникновению ошибки на больших расстояниях, решение этой проблемы - ПИД-контроль. У wpilib есть конструкции, упрощающие математику. Просто возьмите разницу между вашим заданным значением и текущим расстоянием перемещения и вставьте его в свой ПИД-регулятор в качестве ошибки. ПИД-регулятор выдаст новое значение для установки контроллеров двигателя. ПИД-регулятор (с некоторыми настройками) может учитывать ускорение, инерцию и перерегулирование.

документы по PID: http://robotpy.readthedocs.io/projects/wpilib/en/latest/_modules/wpilib/pidcontroller.html?

Другие вопросы по тегам