2017-04-03 20 views
0

pythonに基づいて実行されるrobotを作成しました。その自律的なプログラムのために、私はそれをある距離(例えば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

これは実際の物理的なロボットかシミュレーションか? –

+0

ようこそスタックオーバーフロー!どのライブラリを使用しているのか、ハードウェアとのインターフェースに使用しているライブラリを共有できますか?また、制御プログラムで使用可能なセンサーのリストを作成することも検討してください。多くの助けを提供するために、ここには十分な詳細がありません。 –

答えて

0

あなたが時間に基づいて距離を運転しようとしているように見えます私は、これらのライブラリを使用していました。これは、既知の速度で短距離で動作する可能性がありますが、センサのフィードバックに基づいて駆動する方が一般にはるかに優れています。あなたが見たいと思っているのは、encoders、より具体的にはロータリーエンコーダです。エンコーダは単に「ダニ」を追跡するカウンタです。各「ダニ」は、ドライブシャフトの回転率を表します。 cirホイール周resであり、走行d距離である

formula

エンコーダ「解像度」(回転当たりのダニの数)であり、そして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