Je suis sur un Raspberry 3B sous Buster et je suis entrain de réaliser un projet. Grâce à un Lidar (je possède le TFmini de Benewake) et deux servomoteurs (SG90) je dois scanner l'environnement . Lorsque j'initialise le programme en python (version 3.7) le lidar fonctionne bien et me renvois des données de distance et de force du signal comme montre ce code:
Code: Select all
# -*- coding: utf-8 -*
import serial
import time
ser = serial.Serial("/dev/ttyUSB0", 115200)
def getTFminiData():
while True:
time.sleep(0.1)
count = ser.in_waiting
if count > 8:
recv = ser.read(9)
ser.reset_input_buffer()
# type(recv), 'str' in python2(recv[0] = 'Y'), 'bytes' in python3(recv[0] = 89)
# type(recv[0]), 'str' in python2, 'int' in python3
if recv[0] == 0x59 and recv[1] == 0x59: #python3
distance = recv[2] + recv[3] * 256
strength = recv[4] + recv[5] * 256
print('(', distance, ',', strength, ')')
ser.reset_input_buffer()
#if recv[0] == 'Y' and recv[1] == 'Y': #python2
# lowD = int(recv[2].encode('hex'), 16)
# highD = int(recv[3].encode('hex'), 16)
# lowS = int(recv[4].encode('hex'), 16)
# highS = int(recv[5].encode('hex'), 16)
# distance = lowD + highD * 256
# strength = lowS + highS * 256
# print(distance, strength)
# you can also distinguish python2 and python3:
#import sys
#sys.version[0] == '2' #True, python2
#sys.version[0] == '3' #True, python3
if __name__ == '__main__':
try:
if ser.is_open == False:
ser.open()
getTFminiData()
except KeyboardInterrupt: # Ctrl+C
if ser != None:
ser.close()Ensuite dans un autre fenêtre je lance le programme pour écouter le lidar, récupérer les données et les transformer en coordonnées x; y; z pour que je puisse ensuite obtenir un nuage de points sous matplotlib, voici le code:
Code: Select all
import serial
import math
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=1)
xlist = []
ylist = []
zlist = []
phi = 0
while phi <= math.pi:
data = ser.readline()
print(data)
if len(data) is 11:
theta = ""
phi = ""
dist = ""
for i in range(3):
theta += data[i]
for i in range(3, 6):
phi += data[i]
for i in range(6, 10):
dist += data[i]
theta = int(theta) * math.pi / 180
phi = int(phi) * math.pi / 180
dist = int(dist)
x = dist * math.sin(phi) * math.cos(theta)
y = dist * math.sin(phi) * math.sin(theta)
z = dist * math.cos(phi)
xlist.append(x)
ylist.append(y)
zlist.append(z)
(' \n'
'print (xlist)\n'
'print \n'
'print ylist\n'
'print\n'
'print zlist\n'
'print\n')
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
plt.xlim((-300, 300))
plt.ylim((-300, 300))
ax.scatter(xlist, ylist, zlist)
plt.show()Et c'est là que ça bloque, après avoir lancé le programmé de récupération de données, le programme tfmini s'arrête et j'obtiens un message d'erreur suivant:
Traceback (most recent call last):
File "tfmini_23.py", line 43, in <module>
getTFminiData()
File "tfmini_23.py", line 12, in getTFminiData
recv = ser.read(9)
File "/usr/local/lib/python3.7/dist-packages/serial/serialposix.py", line 509, in read
raise SerialException('read failed: {}'.format(e))
serial.serialutil.SerialException: read failed: device reports readiness to read but returned no data (device disconnected or multiple access on port?)
J'ai fait pleins de recherche sur le net, ça fait deux jours que j'essaye de résoudre ce problème. Actuellement le TFmini est branché via usb à travers un TTL, le FT262RL mais j'ai déjà testé en passant directement par le uart sur les pins 8&10 et j'avais exactement le même problème. Je n'arrive à écouter aucun port. J'ai effectué également des changements comme précisé sur cette page https://roboticsbackend.com/raspberry-p ... rmissions/ donc niveau permissions et la désactivation du bt je suis bon.
Après ça vient peut-être de la compatibilité entre python 2 et 3? J'ai essayé pleins de solutions avant de venir poster ici. J'ai également suivi de simples tutos pour écrire un programme en python pour écrire d'un côté sur un port et de lire avec un autre programme de l'autre et j'obtenais le même message d'erreur.
Une autre piste, peut-être le temps de fermeture et d'ouverture du port?
Je précise que je ne suis pas un expert et je découvre le raspberry et python donc peut-être que la réponse va vous paraître évidente, mais pas à moi ^^
Sans résoudre ce problème d'écoute, je ne pourrais pas avancer dans mon projet. Avez-vous des idées?
Avez-vous une idée du problème?