Extraer dos variables de una cadena

Estoy trabajando para un proyecto en el que estamos utilizando una camara openmv que recoge las coordenadas de la cara, estas ya las he comunicado al arduino y me aparecen por monitor serie, sin embargo no consigo pasar de la cadena de las coordenadas a dos variables float. el comando to float lo hemos probado pero nos da problema.
Adjunto el codigo:

#include <Wire.h>
#include <SoftwareSerial.h>

const int  cam=9; 

void setup() {
  // put your setup code here, to run once:
  
  Serial.begin(19200);
  Serial.println("Bienvenido");


  pinMode(cam, OUTPUT);

  digitalWrite(cam, LOW);
  delay(500);
}

void PERSONAS (){
  if(Serial.available()){
    String data = Serial.readStringUntil('\n');
    Serial.println(data);
    
    if (data== "poss"){
      Serial.println("list.poss[0]");
      delay (10);
      }
     }
     delay(10);
  }
void loop() {
  // put your main code here, to run repeatedly:
    digitalWrite(cam, HIGH);
    PERSONAS();
}

Hola

No está muy claro lo que quiere lograr imprimiendo la string "list.poss[0]".
Donde están las variables float con las que escribes tienes problemas?

Por favor, publicar el código completo

Hola, la parte del código que falta está en python, el programa de la cámara, es el siguiente:

import sensor, time, image, pyb, math, os, tf, pyb
from pyb import UART
from pyb import Pin

# Reset sensor
sensor.reset()

# setup sensor's
sensor.reset()
sensor.set_framesize(sensor.HQVGA)
sensor.set_pixformat(sensor.GRAYSCALE)
sensor.set_gainceiling(2)
sensor.set_contrast(3)
sensor.skip_frames()

# initialization usb/uart
#usb = pub.USB_VCP()
uart = UART(3, 19200)

MAX_OFFSET = 30
RESET_TRACKING_TIMEOUT = 60
SKIP_FRAMES = 2

elapsed_to_reset = RESET_TRACKING_TIMEOUT
s_frames = SKIP_FRAMES

# HQVGA half size
hw = 640 * 0.5
hh = 480 * 0.5

isReseted = True
epos = [0.0, 0.0]
lpos = [0.0, 0.0]
poss = [[0.0, 0.0]]

# send coordinates
def send(pos):
    f = b"%f:%f\n"% (pos[0], pos[1])
    #usb.send(f)

def addPosition(x, y):
    sx = 0
    sy = 0
    l = len(poss)
    for p in poss:
      sx += p[0]
      sy += p[1]

    img.draw_cross(int(sx), int(sy), 0xffffff, 4)

    nx = (sx/l-hw)/hw
    ny = (sy/l-hh)/hh

    send([nx, ny])

# initialize haar
face_cascade = image.HaarCascade("frontalface", stages=20)

while (True):
    elapsed_to_reset -= 1
    s_frames -= 1

    if elapsed_to_reset < 0:
        isReseted = True
        elapsed_to_reset = RESET_TRACKING_TIMEOUT

    # capture image
    img = sensor.snapshot()

    # face detection
    objects = img.find_features(face_cascade, threshold=0.81, scale_factor=1.35)

    # determination and sending to uart position coordinates
    for r in objects:
        x = r[0] + r[2] * 0.5
        y = r[1] + r[3] * 0.5

        dx = math.fabs(lpos[0] - x)
        dy = math.fabs(lpos[1] - y)

        if isReseted == False and (dx > MAX_OFFSET or dy > MAX_OFFSET):
            continue

        poss.pop(0)
        poss.append([x, y])

        if s_frames > 0:
            s_frames = SKIP_FRAMES
        addPosition(x, y)

        lpos[0] = x
        lpos[1] = y
        isReseted = False
        break
    uart.write("%s\n" %poss)
    print(poss)

De ahí sacamos la cadena con las coordenadas en arduino, pero las necesito por separado, por eso intenté el comando to float.

Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>


En el post#1 no usaste etiquetas.
En el post#3 tampoco lo has hecho.
Aunque sea 1 sola linea debes usar etiquetas!

Por más que leo cada post tampoco entiendo cuál es la dificultad.

Veamos, a ver si lo he entendido bien.

Tienes dos cosas: el algoritmo de la cámara y el de arduino. El algoritmo de la cámara envía a través del comando uart.write("%s\n" %poss) las coordenadas. Ese valor es capturado desde Arduino a través del comando String data = Serial.readStringUntil('\n'); y quieres partirlo en dos valores float, ¿hasta aquí es correcto el planteamiento?

Si es así, ¿podrías compartir qué valor tiene esa variable String data?

Saludos.

La variable data debería contener algo como

"[[x.xxx, y.yyy]]"

(la cantidad de decimales del ejemplo es arbitraria).

Primero debe deshacerse de los corchetes, luego con indexOf() y substring() trozar la cadena para obtener x e y, luego toFloat() de ser necesario.

Desde python también podría enviar lpos[0] y lpos[1] en lugar de poss para no lidiar con los corchetes.
Es cuestión de gustos. :wink:

Así es, obtenemos una variable de esta forma"[[x.xxx, y.yyy]]"

Gracias, lo intentaremos. De qué forma podemos quirar los paréntesis?

Usando substring().

Te recomiendo que leas alguno de los tantos tutoriales sobre Strings que hay en la red para que te pongas al corriente de su uso.

Saludos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.