Arucomover: Unterschied zwischen den Versionen

Aus Hackerspace Ffm
Wechseln zu: Navigation, Suche
Zeile 1: Zeile 1:
 
== Ziel ==
 
== Ziel ==
  
Ein kleiner Robot auf Basis eines Raspberry Pi soll selbstständig Aruco codes finden und anfahren können
+
Ein kleiner Roboter auf Basis eines Raspberry Pi soll selbstständig Arucocodes finden und anfahren können.
  
 
== Konzept ==
 
== Konzept ==
  
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Position und Entfernung zu erkennen.
+
Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Positionen und Entfernung zu erkennen.
 
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.
 
Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.
  
Ein Node-Red Flow Nimmt die Position auf und gibt Steurbefehle über an einen ItsyBitsy M3, der damit ein MotorShield steuert.
+
Ein Node-Red Flow nimmt die Position auf und gibt Steuerbefehle an einen ItsyBitsy M3, der damit ein MotorShield steuert.
  
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten Liefert um z.B. die Positionsbestimmung zu verbessern.
+
Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten liefert um z.B. die Positionsbestimmung zu verbessern.
  
 
Hier eine Übersicht  
 
Hier eine Übersicht  
Zeile 16: Zeile 16:
 
[[Datei:Arucomover_konzept.jpg ]]
 
[[Datei:Arucomover_konzept.jpg ]]
  
Hier ein Schaltplan dazu
+
Hier ein Schaltplan dazu.
  
 
[[Datei:Arucomover diagram.jpg |x200px]]
 
[[Datei:Arucomover diagram.jpg |x200px]]
  
Es soll aber trotzdem möglich sein, daß ein Benutzer eingreift,dafür die UI aus Node-Red heraus
+
Mit dem Dashboard UI aus Node Red heraus ist es möglich, dass der Benutzer steuern kann.
  
 
[[Datei:Arucomoverui.png |x300px]]
 
[[Datei:Arucomoverui.png |x300px]]
  
  
== setup ==
+
== Setup ==
Aller Code und auch ein Setup können im https://github.com/hackffm/arucomover gefunden werden.
+
Der Code und auch ein Setup können aus https://github.com/hackffm/arucomover geladen werden.
Es wird davon ausgegangen, daß das ganze auf einem Debian basiertem Linux läuft.
+
Das Ganze läuft auf einem Debian basiertem Linux. Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste  
Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste  
+
vorbereiten sollten.  
vorbereiten sollten. Das in der arucodetection verwendete Shared Memory ist
+
<br>
erst ab Python 3.8 verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher
+
Das Skript arucodetection.py verwendet Shared Memory !
gibt es im Setup Folder ein entsprechendes Skript für den Pi. Vor der Ausführung
+
<br>
der Setups muss das Swapfile vergrößert werden
+
Erst ab Python 3.8 ist Shared Memory verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher
 +
gibt es im Setup Folder das Hilfskript setup_python3_9.sh für den Pi 3.<br>
 +
 
 +
Vor der Ausführung der Setups muss das Swapfile auf eine Raspberry vergrößert werden.
  
 
<code>
 
<code>
Zeile 40: Zeile 43:
 
</code>
 
</code>
  
Ein gutes Netzteil vorrausgesetzt, läuft daß dann einige Zeit. Die übrigen Setup  
+
Ein gutes Netzteil vorrausgesetzt, läuft das dann einige Zeit. Die übrigen Setup  
 
Skripte können, mit der richtigen Python Version dann ausgeführt werden.
 
Skripte können, mit der richtigen Python Version dann ausgeführt werden.
Der Schritt 2_setup_folders.sh installiert auch alle python requierements.
+
Der Schritt 2_setup_folders.sh installiert auch alle Python Requierements.
Das kann auf eine PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !
+
Das kann auf einem PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !
  
 
== Arucodetetcion ==
 
== Arucodetetcion ==
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft.
+
ist ein Pythoncode, der von dieser Seite [[OpenCV_mit_Python]] inspiriert ist und in zwei Prozessen läuft:
Web und Arucodetecion.Damit der WebProzess die Arcuo Position über einen Websocket liefern kann, sind
+
Web und Arucodetecion. Damit der Webprozess die Arcuoposition über einen Websocket liefern kann, sind
beide über eine Managed Queue verbunden. Der Video Stream wird in ein Shared Memory
+
beide über eine Managed Queue verbunden. Der Videostream wird in ein Shared Memory
 
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !
 
geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich !
Es wird davon ausgegangen, daß ein Camera Device 0 vorhanden ist. Sollte eine  
+
Default für den Kameraanschluss ist "Camera Device 0". Sollte eine  
 
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes  
 
Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes  
 
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den  
 
Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den  
 
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden.  
 
vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden.  
Dort liegt auch eine config.json mit der sich die Camera, Auflösung, Debug  usw. einstellen läßt.
+
Dort liegt auch eine config.json mit der sich die Kamera, Auflösung, Debug  usw. einstellen läßt.
Das los landet in ~/arucdetection/log.
+
Das Log landet in ~/arucdetection/log.
Es wird immer von einem DICT_6X6_50 Aruco Code ausgegangen und kann zur Zeit nur in der camera.py umgestellt werden.
+
Default ist DICT_6X6_50 für den Arucocode! Dies kann zur Zeit nur in der camera.py umgestellt werden.
  
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur verfügung,  
+
Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur Verfügung,  
die Websocket und Video Stream abfragt.
+
die Websocket und Videostream abfragt.
  
 
Die Webseite ist auf 127.0.0.1:9080 zu finden  
 
Die Webseite ist auf 127.0.0.1:9080 zu finden  
Zeile 66: Zeile 69:
  
 
== itsyBitsyM4==
 
== itsyBitsyM4==
die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.
+
Die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden.
 
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.
 
Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.
  
code.py ist der Ausgeführte Code. I2C Test in diesen eingebaut. Alle Verfügbaren Kommands können
+
code.py ist der ausgeführte Code. Der I2C Test ist in diesen eingebaut. Alle verfügbaren Kommandos können
mit ? abgefragt werden. Will man nur I2C testen, kann man code.py umbenennen. Dann wird automatisch main.py
+
mit ? abgefragt werden. Will man nur I2C testen, kann man auch code.py umbenennen. Dann wird automatisch main.py
aufgerufen, daß in einer Endlosschleife die angeschlossenen I2C Devices abfragt.
+
aufgerufen, dass in einer Endlosschleife die angeschlossenen I2C Devices abfragt.
  
 
== Node-Red ==
 
== Node-Red ==
  
Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein
+
Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein.
Wenn 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, daß
+
Wenn das Skript 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, dass
das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin müssen installiert wurden.
+
das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin installiert wurden.
  
node_red_start.sh startet
+
node_red_start.sh führt Folgendes aus:
  
 
<code>
 
<code>
Zeile 85: Zeile 88:
 
</code>
 
</code>
  
Das Settings File starte NodeRed auf Port 9010<br>
+
Das Settings File startet NodeRed auf Port 9010<br>
Der Editor kann dann auf http:;//127.0.0.1:9010 und<br>
+
Editor => http:;//127.0.0.1:9010 und<br>
Die UI auf kann dann auf http:;//127.0.0.1:9010/ui gefunden werden.<br>
+
UI     => http:;//127.0.0.1:9010/ui<br>
 
<br>
 
<br>
 
Der Flow ist in zwei Tabs aufgeteilt.<br>
 
Der Flow ist in zwei Tabs aufgeteilt.<br>

Version vom 4. Juli 2021, 19:05 Uhr

Ziel

Ein kleiner Roboter auf Basis eines Raspberry Pi soll selbstständig Arucocodes finden und anfahren können.

Konzept

Ein Python Script benutzt die OpenCV Library um Arucos im Bild mit Positionen und Entfernung zu erkennen. Der Videostream und die Position mit Entfernung werden von dem Script zur Verfügung gestellt.

Ein Node-Red Flow nimmt die Position auf und gibt Steuerbefehle an einen ItsyBitsy M3, der damit ein MotorShield steuert.

Angeschlossen aber nicht benutzt ist ein BNO055, der Sensordaten liefert um z.B. die Positionsbestimmung zu verbessern.

Hier eine Übersicht

Arucomover konzept.jpg

Hier ein Schaltplan dazu.

Arucomover diagram.jpg

Mit dem Dashboard UI aus Node Red heraus ist es möglich, dass der Benutzer steuern kann.

Arucomoverui.png


Setup

Der Code und auch ein Setup können aus https://github.com/hackffm/arucomover geladen werden. Das Ganze läuft auf einem Debian basiertem Linux. Also Ubuntu oder Raspian. Im Setup Folder gibt es Skripte, die das Allermeiste vorbereiten sollten.
Das Skript arucodetection.py verwendet Shared Memory !
Erst ab Python 3.8 ist Shared Memory verfügbar. Auf einem RaspberryPi3 ist 3.7 default. Daher gibt es im Setup Folder das Hilfskript setup_python3_9.sh für den Pi 3.

Vor der Ausführung der Setups muss das Swapfile auf eine Raspberry vergrößert werden.

sudo nano /etc/dphys-swapfile -> CONF_SWAPSIZE=1024

sudo /etc/init.d/dphys-swapfile restart

Ein gutes Netzteil vorrausgesetzt, läuft das dann einige Zeit. Die übrigen Setup Skripte können, mit der richtigen Python Version dann ausgeführt werden. Der Schritt 2_setup_folders.sh installiert auch alle Python Requierements. Das kann auf einem PI 3 mehrere Stunden dauern, da diverse Kompilierungen im Hintergrund laufen !

Arucodetetcion

ist ein Pythoncode, der von dieser Seite OpenCV_mit_Python inspiriert ist und in zwei Prozessen läuft: Web und Arucodetecion. Damit der Webprozess die Arcuoposition über einen Websocket liefern kann, sind beide über eine Managed Queue verbunden. Der Videostream wird in ein Shared Memory geschrieben und vom Webprozess geholt. Dies ist erst ab Python 3.8 möglich ! Default für den Kameraanschluss ist "Camera Device 0". Sollte eine Kalibrierung für eine bessere Erkennung notwendig sein, kann ein entsprechendes Config File camera.json mit create_camera_config.py erstellt werden. Dies muss dann in den vom Setup erstellten /USERHOME/arucodetection Folder kopiert werden. Dort liegt auch eine config.json mit der sich die Kamera, Auflösung, Debug usw. einstellen läßt. Das Log landet in ~/arucdetection/log. Default ist DICT_6X6_50 für den Arucocode! Dies kann zur Zeit nur in der camera.py umgestellt werden.

Um zu testen ob alles funktioniert, stellt arucodetection.py eine entsprechende Webseite zur Verfügung, die Websocket und Videostream abfragt.

Die Webseite ist auf 127.0.0.1:9080 zu finden

Arucodetection.jpg

itsyBitsyM4

Die verwendeten libraries müssen im lib Folder vorhanden sein und eventuell nachinstalliert werden. Z.B. adafruit_bno055. Diese müssen zur CircuitPython Version des M4 passen.

code.py ist der ausgeführte Code. Der I2C Test ist in diesen eingebaut. Alle verfügbaren Kommandos können mit ? abgefragt werden. Will man nur I2C testen, kann man auch code.py umbenennen. Dann wird automatisch main.py aufgerufen, dass in einer Endlosschleife die angeschlossenen I2C Devices abfragt.

Node-Red

Entweder durch die Setup Skripte oder so sollte ein Node.js 14x vorhanden sein. Wenn das Skript 2_setup_folders.sh nicht ausgeführt wurde muss selbst dafür gesorgt werden, dass das Package.json File in ~/nodered/ abgelegt wurde und alle Package Depencies darin installiert wurden.

node_red_start.sh führt Folgendes aus:

node red --settings ~/git/arucomover/code/nodered/arucomover.js --flowFile ~/git/arucomover/code/nodered/flows_arucomover.json

Das Settings File startet NodeRed auf Port 9010
Editor => http:;//127.0.0.1:9010 und
UI => http:;//127.0.0.1:9010/ui

Der Flow ist in zwei Tabs aufgeteilt.
Ein Tab für die Daten von ItsyBitsy M4 und arucomover.py
Ein Tab für die Steuerbefehle an den ItsyBitsy M4
Beide Tabs habe UI Elemente und sind miteinander verbunden um ein einheitliches Handling zu ermöglichen.

Start

Es müssen zwei Prozesse gestartet werden also entweder nacheinander mit & in den Hintergrund oder z.B. mit screen oder tmux.

1.Start der arucodetection
source ~/arucodetection/venv/bin/activate

...../arucomover/code/arucodetection/arucodetection.py

2.Start der Node-Red Flows
...../arucodetection/cosde/bash/node_red_start.sh

Hardware Evolution

BOM

Raspberry Pi 3
BNO055
MotorAeshield V2