我创建了一个基于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()
答案 0 :(得分:0)
看起来你正试图根据时间开车。虽然这可以在已知速度下在短距离上工作,但是基于传感器反馈来驱动通常要好得多。您想要查看的是encoders
,更具体地说是旋转编码器。编码器只是跟踪&#39;滴答的计数器。每个&#39;勾选&#39;表示驱动轴的旋转百分比。
其中d
是行进距离,cir
是车轮周长res
是编码器的分辨率&#39; (每次旋转的刻度数),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)
以相当准确的程度行驶所需的距离。但它确实存在很多问题。在这里,我们尝试设置线性速度,注意没有加速控制。这将导致错误在较长距离上建立,解决方案是PID控制。 wpilib有简化数学的结构。只需取出设定值和当前行程距离之间的差值,并将其作为错误插入PID控制器。 PID控制器将吐出一个新值来设置电机控制器。 PID控制器(带有一些调整)可以解释加速度,惯性和过冲。
关于PID的文档: http://robotpy.readthedocs.io/projects/wpilib/en/latest/_modules/wpilib/pidcontroller.html?