Skocz do zawartości

problem z komunikacja (opoźnienia?) skryptu w python z esp32 po usb


Pomocna odpowiedź

Napisano

siemanko , mam pewien problem z komunikacja skryptu w python z esp32 po porcie usb , konkretnie steruje czyms co szymnie mozna by nazwac ramieniam robotra 3 dof (to moj pierwszy z tego typu projektow a pythona dopiero sie ucze) skrypt python odbiera pozycje gałek pada (od ps5) troche je mieli na wartosci od -1 do 1 (kod w pozniejszym etapie ma posluzyc do implementacji lerobota jako mozg ramienia a on podobno woli float od zwyklych int) , biblioteka pyserial wysyla zlepek wartosci string ktore esp32 juz sobie oddziela i interpretuje jako zakres katow dla serv (sg90). rozpisalem sie o dzialaniu a niewspomnalem o problemie, problem jest tego rodzaju ze robot zachowuje sie dosc nieprzewidywanlnie , lata na wszytskie strony , sterowanie jest dość skokowe a os poziona obrotu (pod nazwa obrot w kodzie) rusza sie wlasciwie losowo na boki, warto zaznaczyc ze gdy niedotykam pada robot nic nieboby wiec problemem niejest szum na analogach, ma ktos jakis pomysl co moze powodowac ten problem ?

from inputs import get_gamepad
import numpy as np 
import cv2
import serial
import time

esp32 = serial.Serial(port='/dev/ttyACM1', baudrate=115200, timeout=0.1)
LX,LY,RX,RY= 0,0,0,0
oldLX,oldLY,oldRX,oldRY = 0,0,0,0
while True:

    events = get_gamepad()
    if events:
        for event in events:
             if event.ev_type == 'Absolute':
                 if event.code== 'ABS_X':
                    LX = event.state

                 elif event.code == 'ABS_Y':
                    LY=event.state
                 elif event.code== 'ABS_RX':
                    RX=event.state
                 elif event.code == 'ABS_RY':
                    RY=event.state

        danelx= np.interp(LX, [0,255],[-1,1])
        danely= np.interp(LY, [0,255],[-1,1])
        danerx=np.interp(RX, [0,255],[-1,1])
        danery=np.interp(RY, [0,255],[-1,1])
        if abs(danelx) < 0.2:
            danelx =0
        if abs(danely) < 0.2:
            danely =0
        if abs(danery) < 0.2:
            danery =0
        if abs(danerx) < 0.2:
            danerx =0
        if danelx != oldLX or danely != oldLY or danery != oldRY or danerx != oldRX:

            danesorowe = [f'{danelx:.2f}',f'{danely:.2f}',f'{danerx:.2f}',f'{danery:.2f}']
            dane = ','.join(danesorowe) +'\n'
            esp32.write(dane.encode('utf-8'))
            oldLX,oldLY,oldRX,oldRY = danelx,danely,danerx,danery
        if esp32.in_waiting > 0:
            odzew=esp32.readline()
            print(str(odzew))
        time.sleep(0.01)
#include <ESP32Servo.h>

Servo Sobrot;
Servo Sprzegub1;
Servo Sprzegub2;
Servo Schwytak;
void setup() {
  // put your setup code here, to run once:
Serial.begin(115200);
//Serial.setTimeout(20);

ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
Sobrot.attach(22,500,2400);
Sprzegub1.attach(21,500,2400);
Sprzegub2.attach(23,500,2400);
Schwytak.attach(19,500,2400);

}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial.available() > 0){
String strLX =Serial.readStringUntil(',');
String strLY =Serial.readStringUntil(',');
String strRX =Serial.readStringUntil(',');
String strRY =Serial.readStringUntil('\n');

float LX = strLX.toFloat();
float LY = strLY.toFloat();
float RX = strRX.toFloat();
float RY = strRY.toFloat();
float obrot = (LX +1)*90;
float przegub1 = (LY +1)*90;
float przegub2 = (RX +1)*90;
float chwytak = (RY +1)*90;
if (obrot != 0 || przegub1 !=0|| przegub2 != 0 || chwytak != 0 ){
Serial.println(obrot);
Serial.println(przegub1);
Serial.println(przegub2);
Serial.println(chwytak);

Sobrot.write(obrot);
Sprzegub1.write(przegub1);
Sprzegub2.write(przegub2);
Schwytak.write(chwytak);
}
  

  }


}

 

(edytowany)

Czy pad faktycznie zwraca wartości [0, 255]? Sprawdzałeś integralność pakietów na esp32? Tam ciut na sztywno założyłeś, że zawsze dostaniesz poprawny ciąg znaków oznaczający 4 liczby float z przecinkami i końcem linii, ale może coś się zapycha i odczytuje dziwne wartości. Chyba osobiście wolałbym przesyłać binarną strukturę danych z nagłówkiem (długością, crc?), żeby jakoś zweryfikować, czy pakiet jest poprawny. Z ciekawości sprawdzę jak twój kod działa, mam esp32 i gamepada.

A tak swoją drogą, czy gamepad do ps5 nie ma przypadkiem ble? Wtedy możesz komunikować się bezpośrednio z esp32.

Edytowano przez orb777
  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...