Python - Duda guardar log

   
Vista:

Duda guardar log

Publicado por Alejandro (5 intervenciones) el 13/11/2013 12:53:16
Buenas, primero pedir disculpas si pregunto alguna obviedad, ya que llevo poco aprendiendo Python.
Estoy haciendo un programa sencillo para una RaspberryPi. Se trata de un coche que tire para adelante, atras y a los lados. Me ha funcionado asi que hasta ahi bien.

El problema es cuando quiero guardar los datos de los encoders del motor. No me queda claro como puedo crear un fichero y que almacene la posicion de los encoders cada X tiempo. Y si fuera posible, me gustaria que cada vez que uso el coche, genere un archivo distinto para guardar esas posiciones.

Ejemplo. Enciendo el programa y crea el Archivo 1.
Archivo 1, guardar las posiciones del encoder.
Reinicio el programa, y se crea archivo 2 que guarde los encoder.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de xve

Duda guardar log

Publicado por xve (1229 intervenciones) el 13/11/2013 22:10:34
Hola Alejandro, no se muy bien como lo has desarrollado, pero el de encendido y cerrado del programa, si lo has realizado con una clase es muy sencillo con: __init__() y __del__(), y el de las posiciones, dependerá de como lo hayas programado... si genera un evento, o pasa por un bucle, etc...

Nos puedes mostrar el código?

Para generar logs, lo mejor que es utilices la librería logging...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda guardar log

Publicado por Alejandro (5 intervenciones) el 18/11/2013 09:39:45
Este es el codigo de ejemplo que tenemos para el programa que queremos, pero lo que me gustaria añadirle una orden que guarde un registro de los movimientos de los encoders. Lo que me gustaria es que se guardase cada vez en un archivo distinto. En plan Log1, Log2, Log3, etc...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
# Jaikrishna
# Initial Date: June 25, 2013
# Last Updated: June 25, 2013
# http://www.dexterindustries.com/
# This code is for testing the BrickPi with Lego Motors & Lego Ultrasonic Sensor
 
# Make the connections with Left Motor at Port A, Right Motor at Port D and Sensor at Port 4
# Setup battery power source for the RPi & BrickPi and boot.
# To control the program, connection must be made though SSH though PuTTY or similar software
# Open up PuTTY and enter UserName:pi Password:raspberry (Default values)
# Navigate to the directory containing this code and enter 'python Car.py'
# The user needs to enter one of the following keys:
# 8 - Forward
# 4 - Left
# 6 - Right
# 2 - Reverse
# 5 - Stop
# Also, The motors automatically stop when any nearby object is detected using the Ultrasonic Sensor
 
 
from BrickPi import * #import BrickPi.py file to use BrickPi operations
import threading
 
BrickPiSetup() # setup the serial port for communication
 
BrickPi.MotorEnable[PORT_A] = 1 #Enable the Motor A
BrickPi.MotorEnable[PORT_D] = 1 #Enable the Motor D
 
BrickPi.SensorType[PORT_4] = TYPE_SENSOR_ULTRASONIC_CONT        #Setting the type of sensor at PORT4
 
BrickPiSetupSensors() #Send the properties of sensors to BrickPi
 
running = True
 
class myThread (threading.Thread):                #This thread is used for keeping the motor running while the main thread waits for user input
    def __init__(self, threadID, name, counter):
        threading.Thread.__init__(self)
        self.threadID = threadID
        self.name = name
        self.counter = counter
    def run(self):
        while running:
            if BrickPi.Sensor[PORT_4] < 20 :                #Lesser value means more close
                print "Car Stopped due to very close object"
                BrickPi.MotorSpeed[PORT_A] = 0                # Set Speed=0 which means stop
                BrickPi.MotorSpeed[PORT_D] = 0
            BrickPiUpdateValues() # Ask BrickPi to update values for sensors/motors
            time.sleep(.2) # sleep for 200 ms
 
thread1 = myThread(1, "Thread-1", 1)                #Setup and start the thread
thread1.setDaemon(True)
thread1.start()
 
while True:
    try:
        c = raw_input("Enter direction: ")
        if c == '8' :
            print "Running Forward"
            BrickPi.MotorSpeed[PORT_A] = -200 #Set the speed of MotorA (-255 to 255)
            BrickPi.MotorSpeed[PORT_D] = -200 #Set the speed of MotorD (-255 to 255)
        elif c == '2' :
            print "Running Reverse"
            BrickPi.MotorSpeed[PORT_A] = 200 #Set the speed of MotorA (-255 to 255)
            BrickPi.MotorSpeed[PORT_D] = 200 #Set the speed of MotorD (-255 to 255)
        elif c == '6' :
            print "Turning Right"
            BrickPi.MotorSpeed[PORT_A] = -200 #Set the speed of MotorA (-255 to 255)
            BrickPi.MotorSpeed[PORT_D] = 0 #Set the speed of MotorD (-255 to 255)
        elif c == '4' :
            print "Turning Left"
            BrickPi.MotorSpeed[PORT_A] = 0 #Set the speed of MotorA (-255 to 255)
            BrickPi.MotorSpeed[PORT_D] = -200 #Set the speed of MotorD (-255 to 255)
        elif c == '5' :
            print "Stopped"
            BrickPi.MotorSpeed[PORT_A] = 0        #Stop the motor
            BrickPi.MotorSpeed[PORT_D] = 0
    except KeyboardInterrupt:                        #Triggered by pressing Ctrl+C
        running = False                                #Stop theread1
        print "Bye"
        break                                        #Exit
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Duda guardar log

Publicado por xve (1229 intervenciones) el 18/11/2013 14:20:23
Hola Alejandro, puedes crear tantos archivos de log como desees...

logger1=logging.getLogger("file1");
logger2=logging.getLogger("file2");
...
para añadir el texto a cada uno de los archivos, seria algo así:
logger1.info("message1")
logger2.info("message2")
...

te recomiendo que revises un poco la ayuda, para verlo un poco mas claro...
http://docs.python.org/2/library/logging.html

Espero que te sirva... coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda guardar log

Publicado por Alejandro (5 intervenciones) el 20/11/2013 10:40:25
Hola, gracias por contestar.

Creo que no nos hemos entendido bien.

Lo que yo quería hacer es lo siguiente: una vez finaliza mi programa, y el coche deja de funcionar, se cree un archivo de texto de 3 columnas con datos distintos. En la 1ª columna se guarden todos los encoders (la posición en grados del motor) del motor derecho cada vez que yo cambio el sentido del coche, es decir, que guarde el recorrido del robot. En la 2ª, lo mismo pero del motor izquierdo, y en la 3ª del sensor.

Lo que me interesa saber es como guardar esos datos en el archivo de texto, sin que se sobrescriban los datos, aunque esto si no es posible no es muy importante. Aunque no este en el código que te pusimos, los datos los se sacar, me falta saber como ir guardándolos de la manera que te explique si es posible.

Muchas gracias por la ayuda y perdona por ser tan novato.

P.D: Haría faltar cargar alguna librería?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Duda guardar log

Publicado por xve (1229 intervenciones) el 20/11/2013 10:55:11
Hola Alejandro, mil perdones, no te entendí...

Bien, para lo que quieres hacer, puedes utilizar la instrucción file()

Abre un manejador de archivos en modo Append (añadirá al final del mismo)
1
f=file("archivo.txt","a")
Luego puedes utilizar la instrucción f.write() o f.writelines(), dependiendo de como tengas la cadena de texto.

Espero que esto sea lo que estas buscando...

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda guardar log

Publicado por Alejandro (5 intervenciones) el 20/11/2013 13:04:31
Hola, gracias por contestar.

He probado lo que has dicho, y me crea el archivo, que yo he llamado "registro.txt". Lo que no se es dentro de la linea f.write() que tengo que escribir, yo lo estoy haciendo asi:

1
2
3
4
5
6
7
8
9
10
while True:
    try:
        c = raw_input("Enter direction: ")
        if c == '8' :
            result=BrickPiUpdateValues()
            print(BrickPi.Encoder[PORT_A])
            f.write(BrickPi.Encoder[PORT_A])
            print "Running Forward"
            BrickPi.MotorSpeed[PORT_A] = -200 #Set the speed of MotorA (-255 to 255)
            BrickPi.MotorSpeed[PORT_D] = -200 #Set the speed of MotorD (-255 to 255)

Aqui es donde nos da el siguiente error:

TypeError: expected a character buffer object.

Como ves, he puesto un print para ver si mostraba el encoder, y si que lo muestra, asi que el fallo es al crear la linea write.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve

Duda guardar log

Publicado por xve (1229 intervenciones) el 20/11/2013 15:01:21
Hola Alejandro, en el fwrite() tiene que pasar caracteres, que es lo único que se pueda guardar en un archivo... por lo visto, estas intentando guardar algo que no es un texto...

Que es: BrickPi.Encoder[PORT_A]?

Prueba esto:
1
f.write("%s" % BrickPi.Encoder[PORT_A])

Coméntanos, ok?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda guardar log

Publicado por Alejandro (5 intervenciones) el 21/11/2013 12:13:45
Muchas gracias, nos ha funcionado usando ese codigo.

BrickPi.Encoder[PORT_A] es una funcion para que nos diga la posicion de los motores.

La parte del programa queda asi:

1
2
3
4
5
6
7
8
9
10
11
12
while True:
    try:
        c = raw_input("Enter direction: ")
        if c == '8' :
            result=BrickPiUpdateValues()
            print(BrickPi.Encoder[PORT_A])
            f.write("%s  " % BrickPi.Encoder[PORT_A])
            f.write("%s  " % BrickPi.Encoder[PORT_D])
            f.write("%s\n" % BrickPi.SensorType[PORT_4])
            print "Running Forward"
            BrickPi.MotorSpeed[PORT_A] = -200 #Set the speed of MotorA (-255 to 255)
            BrickPi.MotorSpeed[PORT_D] = -200 #Set the speed of MotorD (-255 to 255)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de xve

Duda guardar log

Publicado por xve (1229 intervenciones) el 21/11/2013 12:57:26
Gracias por comentarlo Alejandro!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar