Расстояние на роботе
Я создал 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?