Hokuyo URG-04LX mit Python auslesen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
RootGrapefruit
User
Beiträge: 8
Registriert: Donnerstag 1. Dezember 2016, 00:27

Moin,
ich möchte mit Python einen Hokuyo URG-04LX Laser ansteuern. Hierzu habe ich mir diese Library runtergeladen und installiert:
https://github.com/SuderPawel/hokuyo-python-lib
Soweit ich das verstanden habe kann ich den Laser aber damit nur über den Serial Port ansprechen, meiner ist aber per USB angeschlossen.

Hat jmd von euch schon Erfahrungen mit dem Laser und Python gemacht oder eine bessere Idee wie ich das angehen soll?

Liebe Grüße,
RootGrapefruit
BlackJack

@RootGrapefruit: Also laut dem verlinkten PDF mit der Protokollbeschreibung, Abschnitt 4 „Interface and Setting“, macht das für Programme keinen Unterschied ob ”serielles Kabel”, also RS232, oder USB verwendet wird. Man braucht den entsprechenden Treiber um das als serielle Schnittstelle ansprechen zu können.
RootGrapefruit
User
Beiträge: 8
Registriert: Donnerstag 1. Dezember 2016, 00:27

Den Treiber habe ich installiert, Python sagt beim Compilieren aber:
raise SerialException("could not open port {!r}: {!r}".format(self.portstr, ctypes.WinError()))
serial.serialutil.SerialException: could not open port '/dev/ttyACM0': FileNotFoundError(2, 'Das System kann den angegebenen Pfad nicht finden.', None, 3)

Wenn ich '/dev/ttyACM0' zu '/dev/ttyUSB0' ändere das gleiche :(
BlackJack

@RootGrapefruit: Beim Compilieren‽

Etwas komisch ist auch `ctypes.WinError()` und dann Linux-Pfade‽

*Gibt* es denn `/dev/ttyACM0` oder `/dev/ttyUSB0`? Wie hast Du den Treiber installiert? Hat Linux den ACM-Treiber nicht schon dabei? Muss man das Kernelmodul eventuell aktivieren/laden?
RootGrapefruit
User
Beiträge: 8
Registriert: Donnerstag 1. Dezember 2016, 00:27

Ich benutze Windows 7, den Treiber habe ich auch über Windows installiert (also Rechtsklick auf der Gerät und dann Treiber aktualisieren).

Mein Quellcode ist bis jetzt:

Code: Alles auswählen

import hokuyo
import serial

uart_port = '/dev/ttyACM0'
uart_speed = 19200
laser_serial = serial.Serial(port=uart_port, baudrate=uart_speed, timeout=0.5)

port = serial_port.SerialPort(laser_serial)

laser = hokuyo.Hokuyo(port)
Habe ich da vielleicht schon was falsch gemacht?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@RootGrapefruit: unter Windows heißen die Ports auch COM1, COM2, etc.
RootGrapefruit
User
Beiträge: 8
Registriert: Donnerstag 1. Dezember 2016, 00:27

Daran lag es :)
Wieder was dazugelernt, vielen Dank an euch beide!
RootGrapefruit
User
Beiträge: 8
Registriert: Donnerstag 1. Dezember 2016, 00:27

Das Installieren hat geklappt, ansprechen kann ich den Laser aber immer noch nicht, weil er anscheinend nicht antwortet :(
Das hokuyo Objekt kann ich erstellen und initialisieren, aber sobald ich den Laser anspreche kommt folgende Exception:

Code: Alles auswählen

RESULT: ""Traceback (most recent call last):
  File "..\AppData\Local\Programs\Python\Python35-32\lib\site-packages\hokuyo_python_lib-1.3-py3.5.egg\hokuyo\driver\hokuyo.py", line 97, in __sho
rt_command
    result += self.__execute_command(command)
  File "..\AppData\Local\Programs\Python\Python35-32\lib\site-packages\hokuyo_python_lib-1.3-py3.5.egg\hokuyo\driver\hokuyo.py", line 87, in __exe
cute_command
    assert result == command
AssertionError
READ 2 EXTRA BYTES: ""
None
Der Fehler ist in dieser Funktion:

Code: Alles auswählen

    def __execute_command(self, command):
        self.__port_lock.acquire()
        try:
            self.__port.write(command)
            result = self.__port.read(len(command))
            assert result == command
        finally:
            self.__port_lock.release()
        return result
Dort bekommt er jedes mal ein leeres 'result' zurück, weswegen er beim assert natürlich abbricht. Weiß da jemand weiter? :K
BlackJack

@RootGrapefruit: Der Autor von dem Code hat eine sehr eigenwillige Interpretation von sinnvoller Ausnahmebehandlung und/oder der Bedeutung von ``assert``. Er benutzt ``assert``\s behandelt die dann aber durch ``except BaseException`` wo der Traceback ausgegeben wird und dann läuft das Programm weiter als wäre nichts passiert. :?

Spricht das Gerät denn auch das Protokoll das diese Bibliothek erwartet? Ich glaube in der Anleitung stand was davon das man zwischen Version 1 und 2 umschalten kann oder so.
RootGrapefruit
User
Beiträge: 8
Registriert: Donnerstag 1. Dezember 2016, 00:27

@BlackJack: Ich hatte es mittlerweile schon selbst rausgefunden, aber du hattest mit dem Protokoll Recht :D
Das (offizielle) Data Viewing Tool des Lasers hat mir angezeigt, dass er auf SCIP 2.0 eingestellt war, in Wirklichkeit war es aber noch 1.1.
Nachdem ich das umgestellt habe ging es :D
Antworten