PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 3D-sensing für ROS



AstroRobot
29.01.2018, 10:21
Hallo RoboterNETZ,

ich habe mich mal im Internet nach konkreten ROS Paketen zur Anwendung von 3D Sensoren umgeschaut (wie z.B. für MS Kinect, Intel RealSense, …). Diese Sensoren liefern äußerst nützliche Tiefeninformationen, welche u.a. als PointCloud dargestellt werden können. Allerdings ist mir aufgefallen, dass die meisten Anwendungen nur einen Bruchteil der vorhandenen Informationen nutzen. Oftmals nutzen die Pakete lediglich eine einzelne Zeile des Tiefenbilds z.B. zur Navigation, um einen 2D Laserscanner zu imitieren. Das steht meiner Meinung nach aber komplett im Widerspruch zum Sinn eines 3D-Sensors.

Gibt es eine gute Möglichkeit, die gesamten 3D Daten zum Ausweichen von Hindernissen zu nutzen? Vielleicht nutzt jemand von euch ja bereits ein ROS Package und hat gute Erfahrungen gemacht?

Viele Grüße,
Astro

Ceos
29.01.2018, 12:03
die Technologien dafür sind vielseitig und ausgereift, aber kaum jemand der sich damit befasst diese 3D-Punktwolken zu verwerten hat mehr als einen Demonstrator dafür programmiert leider

ich habe mit ToF Kameras von TI gearbeitet aber wir haben nur damit rumgespielt und die Punktwolken mit den Augen angesehen und die Leistung bewertet

außerdem habe ich noch einen LeapMotion Sensor der das gleiche kann aber billiger ist, mit dem würde ich gerne reale Objekte als Virtuelle Einblendung in einer VR Umgebung haben, aber das wird mich wohl einige Stunden Arbeit kosten, weil ich dafür zumindest noch keinen Beispielcode gefunden habe :) nocht nicht mal wie cih an die 3D Punktwolke vom LeapMotion rankomme :(

AstroRobot
30.01.2018, 03:00
Es gab den ROS 3D Contest (http://wiki.ros.org/openni/Contests/ROS%203D). In dessen Rahmen sind viele tolle Projekte entstanden. Allerdings reichen die meisten nicht über den Status einer Alpha- oder bestenfalls Betaentwicklung hinaus. Jedoch zeigen die Ergebnisse, dass das Nutzen von 3D Sensoren z.B. in einer PointCloud funktionieren kann.

Ist es denn sehr aufwendig solch eine Applikation zu entwickeln? Ich habe bislang nicht allzu viel mit PCL (http://www.pointclouds.org/) und co. gearbeitet. Aber solche Tools sehen sehr mächtig aus und sind sicherlich nützlich.

Wäre es z.B. möglich mit einem angemessenen Aufwand eine stabile Lösung zur Applikation von Flächen auf die Geometrien der PointCloud Punkte zu applezieren? Beispielsweise stelle ich mir vor, dass ein horizontales Hindernis auf Höhe X meinem Roboter im Weg ist. Darüber und darunter ist der Weg frei. Jetzt erkennt mein System das Hindernis und entscheidet, ob es passierbar ist, oder nicht. Ist solch ein Szenario realistisch umzusetzen? Welche Tools könnte ich hierfür nutzen? Die PCL (http://www.pointclouds.org/) habe ich mir ja bereits angeschaut.

Ich denke solch eine Lösung wäre sowohl für viele Hobby-Roboter-Enthusiasten, als auch für Produktentwickler interessant. Irgendwelche Ideen, Konzepte, Anmerkungen, Vorschläge?

Gruß, Astro

Ceos
30.01.2018, 07:32
Wäre es z.B. möglich mit einem angemessenen Aufwand eine stabile Lösung zur Applikation von Flächen auf die Geometrien der PointCloud Punkte zu applezieren?

wir haben eine Demo Applikation gehabt, welche normale Geometrische Formen erkannt und berechnet hat, man hat einen Würfel in die Kamera gehalten und die Software hat versucht alle Kantenlängen zu erfassen und das Volumen berechnet, war sehr eindrucksvoll.

Ich habe schon bei den Machern von LeapMotion angefragt ob die API nebst Bilderdaten auch die Tiefeninformation als eine Art Bitmap anbieten aber noch keine Antwort.

Defiant
30.01.2018, 18:57
Gibt es eine gute Möglichkeit, die gesamten 3D Daten zum Ausweichen von Hindernissen zu nutzen?

..was IMHO zumindest für UGVs auch Sinn macht, da diese auch nur in 2D navigieren können. 3D wird in erster Linie (soweit ich gesehen habe) für Arbeiten mit Manipulatoren verwendet, siehe Moveit (http://moveit.ros.org/). Und für die Lokalisierung im Raum kann RTAB-Map (http://introlab.github.io/rtabmap/) helfen.



Beispielsweise stelle ich mir vor, dass ein horizontales Hindernis auf Höhe X meinem Roboter im Weg ist. Darüber und darunter ist der Weg frei. Jetzt erkennt mein System das Hindernis und entscheidet, ob es passierbar ist, oder nicht.

Klingt also eher nach UAV. Mein Vorschlag: Existierende Roboter (http://robots.ros.org/category/aerial/) ansehen und gucken was die zur Navigation verwenden

Update: Hier navigiert jemand mit Moveit: https://www.youtube.com/watch?v=VlBQLbmc03g

Ceos
31.01.2018, 07:34
Die Idee eine 3D Abbildung zu verwenden hat multiple Vorteile

man kann zum Beispiel bewerten ob ein Objekt flach genug ist es zu passieren (Türschwelle) oder zu hoch (Rohr eines Klapp-Wäscheständers, SEHR populäres Beispiel und hab ich auch selber schon live erlebt wie sich der Saugrobo von nem Kumpel mehrmals daran festgefahren hat)

oder ob ein Hinderniss ausreichend hoch ist um darunter passieren zu können (Der Robo von meinem Kumpel hat tatsächlich einen LIDAR und hat sich auch schonmal unter dem Sofa festgefressen weil er leicht schräg nach Vorne unten guckt und das Sofa quasi nicht sichtbar für ihn war)

Allerdings brauch man auch den entsprechenden Beef im Prozessor um das auszuwerten :)

Leider scheinen meine Bemühungen mit dem LeapMotion wohl nicht von Erfolg gekrönt zu sein, der misst einfach Stereoskopisch und die Bereitgestellten APIs liefern nur die Daten von getrackten Händen aus aber keine Punktwolken -.-

ich kann mir zwar die Stereobilder holen aber dann müsste ich die Tiefenauswertung komplett selber schreiben und echtes ToF ist das dann leider auch nicht, aber Hände tracken kann das Ding echt klasse!

PS:

Ist es denn sehr aufwendig solch eine Applikation zu entwickeln?

ich habe den Kern deiner Frage garnicht erfasst ... sorry ... die Punktwolke zu erhalten ist die eine Sache und je nach verwendetem Erfassungs-Werkzeug nicht unbedingt schwer oder gar unheimlich simpel! (Es sei denn man muss den Sensor selber ansteuern um die Punktwolke zu realisieren)

Das andere ist die Auswertung der Punktwolke und ungefähr gleich schwer vorzustellen wie auf einem 2D-Bild eine Objekt mittel Algorithmen zu erkennen.

Wenn ich die Tiefeninformation im Bild als Grauskala speichere kann man sogar gezielt Bilderkennung verwenden.

Ich finde das beste daran ist, dass man jedem Pixel einem gedachten Lichtstrahl zuordnen kann und anhand der Ausrichtung des Lichtstrahls und dem gemessenen Abstand vortrefflich die Höhe des im Pixel reflektierten Objektes feststellen kann.

Ich würde vermutlich so heran gehen, dass ich die Kamera vorne leicht Schräg nach unten sehen lasse und pro Pixelzeile (unter der Annahme dass alle Pixel im Raum parallel zum Boden verlaufen) einen Grenzwert festlege. Überschreitet einer der Pixel (bis zur Zeile die leicht nach oben abstrahlt) diesen Grenzwert ist ein Objekt im Weg, habe ich eine hinreichende Bestätigung bei Annäherung (also einen zusammenhängenden Pixelcluster in der 2D Tabelle/Bitmap) welcher hinreichend groß ist, weiche ich aktiv aus. Für die Erkennung von flachen Hindernissen und flachen passiwerbaren Hindernissen müsste ich mir noch was einfallen lassen, aber das sollte auch mit ein paar geschickten Grwenzwerten (Gutbereich für Bodenschwellen z.B.) zu lösen sein.

PPS: Wenn jemand ein paar gute ToF Kameras < 150€ kennt, würde ich mich über entsprechende Links freuen :D Ich will nämlcih noch was gaaanz anderes damit machen

Defiant
31.01.2018, 07:54
man kann zum Beispiel bewerten ob ein Objekt flach genug ist es zu passieren (Türschwelle) oder zu hoch (Rohr eines Klapp-Wäscheständers, SEHR populäres Beispiel und hab ich auch selber schon live erlebt wie sich der Saugrobo von nem Kumpel mehrmals daran festgefahren hat)
Alles eine Frage der Abbildung in den 2D-Raum.

Objekt zu hoch: In die 2D costmap.
Objekt niedrig: Nicht in die 2D costmap.

Ceos
31.01.2018, 08:36
mit einem LIDAR hat man nur eine einzelne Pixelzeile und die Hinderniserkennung ist nur Zeitlich abhängig realisierbar, bei der 3D lösung kann man das Ojekt sofort udn als ganzes erfassen, denn beim ausweichen/drehen hat man die Randdaten ja nicht mehr und wo man gerade noch an einem Hinderniss vorbeigefahren ist, kann es pasieren dass ich mich jetzt drehe und das neue Hinderniss gerade in der Blinden Zone liegt

Auch ein live erlebtes Beispiel, fährt an einem Karton vorbei, der offen hängende Deckel des Karton ist gerade hoch genug um vom LIDAR beim vorbeifahren nicht bemerkt zu werden. Der Robo dreht dann als er beim Vorbeifahren ein Tischbein erkennt in Richtung des Karton und rammelt volles Mett gegen den Kartondeckel weil er ihn nicht sehen kann. Mit einer 3D Abtastung hätte er den Deckel als Hinderniss gesehen. Hindernisse die gerade hoch genug sind um sich einzuklemmen kanne r einfach nciht sehen weil der LIDAR eben nciht nach oben sondern schräg nach unten guckt! Und ein querliegendes 1.5cm Rohr kann er auch nur schwer abtasten, eine ToF Kamera jedoch kann recht deutlich und zu jeder Zeit das Rohr erkennen

AstroRobot
31.01.2018, 09:26
Ich sehe, das Schlüsselelement auch hierzu ist die layered Costmap. Jetzt muss ich nur noch die 3D Daten entsprechend verarbeiten und in die Costmap übertragen.

Wobei Ceos' Idee mit den Grenzwerten für jeden einzelnen Pixel sicherlich auch gut für einen ersten Test ist.

Ceos
31.01.2018, 09:30
ich bin eher der bare-metal typ, die ganze ROS sache ist zwar nett udn für größere projekte gut ich bin aber eher jemand der mehr spaß dran hat funktionsweisen zu verstehen udn nachzubauen oder zu verbessern (treiberebene wäre dann mein favorisierter bereich)

ich will versuchen die punktwolke in eine VR umgebung zu projezieren, damit ich ein wenig mixed reality machen kann

AstroRobot
31.01.2018, 10:34
@Ceos: Da stimme ich dir zu! Erst wenn man es selber wirklich "from the scratch" aufgebaut hat, kann man es wirklich.

ROS ist ein tolles Tool, wenn man ein komplexes System aufsetzen will, wo viele Komponenten möglichst schnell zusammen funktionieren sollen. Wenn man ein wirklich stabiles, ausgereiftes und qualitätsbewusstes Produkt entwerfen will, würde ich auch zu einer Eigenentwicklung tendieren. Alleine weil man somit viel effizienter Hardwareressourcen nutzen kann, selbst wenn ROS bereits auf lightweight Design ausgelegt ist.

Defiant
31.01.2018, 19:23
Auch ein live erlebtes Beispiel, fährt an einem Karton vorbei, der offen hängende Deckel des Karton ist gerade hoch genug um vom LIDAR beim vorbeifahren nicht bemerkt zu werden. Der Robo dreht dann als er beim Vorbeifahren ein Tischbein erkennt in Richtung des Karton und rammelt volles Mett gegen den Kartondeckel weil er ihn nicht sehen kann.
Das halte ich für ein Problem der Sensoren bzw Umsetzung der Projektion in den 2D-Raum, nicht als Problem einer 2D-Umgebung. Es spricht nichts dagegen den Karton mit seinem kompletten Umfang in die 2D-Ebene einzufügen.



Wenn man ein wirklich stabiles, ausgereiftes und qualitätsbewusstes Produkt entwerfen will, würde ich auch zu einer Eigenentwicklung tendieren.
Genau hier möchte ich widersprechen. Gerade ROS ist stabiler und ausgereifter als jede Eigenentwicklung die ich oder sogar ein kleines Team in kurzer Zeit entwickeln könnte, zumindest für Anwendungsfälle die über das Folgen einer Linie hinausgehen.
Sicherlich lernt man viel, wenn man ein Verfahren wie SLAM selbst implementiert, aber die Alternative ist ROS zu verwenden und die selbe Entwicklerzeit in eigene ROS-Pakete zu stecken oder bestehende zu verbessern, wovon dann andere profitieren könnten.

Btw ROS ist alles andere als "lightweight", aber auf die Verwendung minimaler Ressourcen ist es nicht ausgelegt. (ROS2 hat hier ein paar Vorteile gegenüber ROS1 durch die Verwendung von DDS).

Ceos
01.02.2018, 08:13
Genau hier möchte ich widersprechen. Gerade ROS ist stabiler und ausgereifter als jede Eigenentwicklung die ich oder sogar ein kleines Team in kurzer Zeit entwickeln könnte, zumindest für Anwendungsfälle die über das Folgen einer Linie hinausgehen.

das ist gewagt, denn wenn es hart auf hart kommt, ist es besser zu wissen was genau jeder fetzen code macht als darauf zu vertrauen dass die open source quelle fehlerfrei ist (anhand unzähliger beispiele nachgewiesener maßen ist sie es nicht)

es sei denn man befasst sich mit der verwendeten codequelle udn macht sich begreiflich wie sie arbeitet um sie dann effektiv debuggen zu können. das wiederum setzt grundwissen voraus, das man sich erst durch eine low level implementierung erarbeiten muss oder eben durch intensive code review!

die aussage einen qualitativen code von hand zu bauen ist nicht falsch aber teuer und langwierig (hohe initialkosten) aber man zehrt ewig von der erfahrung

außerdem ist es interessensfrage, mein interesse ist, wie es so schön heißt, "zu wissen was die welt im inneren zusammenhält" ... und mein erfolgreichstes lernschema ist "learning by doing"

leichtgewichtigkeit ist natürlich der hauptvorteil einer manuellen implementierung und im sinne des kunden (stückpreis) nactürlich auch resourcen schonender

und solange sich die ersparnisse in hardware pro stück in absehbarer zeit über die menge gegen die initialkosten aufrechnen ist es das dann auch wert


aber wir reden hier über ansichten die einer persönlichen note unterliegen, daher sage ich nciht dass du falsch liegst aber dass man es auch anders betrachten kann und sollte

Defiant
01.02.2018, 08:49
Natürlich ist nichts in ROS fehlerfrei (Welche SW ist das?) und natürlich gibt es immer noch unzählige Bugs. Es spricht natürlich nichts dagegen alles selbst zu schreiben aber die Aussage, dass selbstentwickelte SW stabiler und qualitativ besser ist als eine, die 10 Jahre von mehreren Menschen entwickelt und noch viel mehr verwendet wurde halte ich für vermessen. Persönlich finde ich es schade, dass der ROS-Community dadurch eine wertvolle Ressource fehlt. Gerade ROS bringt mit Tools wie rviz und Anbindung an z.B. Gazebo auch wertvolle Werkzeuge zum Debuggen mit.

Es geht auch nicht darum alles selbst zu schreiben oder nur fertige ROS Module zu verwenden. ROS ist in erster Linie eine Middleware zur Kommunikation der einzelnen Module (Nodes) untereinander. So oder so wird man viele Algorithmen selber implementieren, aber gerade hier lässt ROS einem aufgrund der Modularität die Freiheit genau das zu tun. Und als Basis hat man bei ROS Software auf die man sich verlassen kann.



außerdem ist es interessensfrage, mein interesse ist, wie es so schön heißt, "zu wissen was die welt im inneren zusammenhält" ... und mein erfolgreichstes lernschema ist "learning by doing"

Ist natürlich auch wichtig, dass es immer Leute gibt die das durchziehen, nur halt Qualität ist genau der eine Grund den ich nicht gelten lassen möchte. Abgesehen davon kenne ich deinen Anwendungsfall nicht, vielleicht profitiert dieser ja wirklich nicht von der Verwendung ROS. Bin jetzt von "Standard Robotik" ausgegangen.

Aber lass und mal lieber zum Thema 3D Navigation zurück (Auf ROS oder nicht ROS habe ich nicht wirklich Lust ;)

Mir ist da grad was im ersten Post aufgefallen, was ich übersehen habe:


Oftmals nutzen die Pakete lediglich eine einzelne Zeile des Tiefenbilds z.B. zur Navigation, um einen 2D Laserscanner zu imitieren.
Ich vermute du sprichst da depthimage_to_laserscan (http://wiki.ros.org/depthimage_to_laserscan) an, es gibt da den Parameter "scan_height", der die Anzahl Zeilen konfiguriert. Was leider fehlt ist die Option, z.B. nur die unteren 10 Zeilen zu verwenden. Aber für komplexere Anwendungsfälle gibt es ansonsten pointcloud_to_laserscan (http://wiki.ros.org/pointcloud_to_laserscan).

Ceos
01.02.2018, 09:17
Auf ROS oder nicht ROS habe ich nicht wirklich Lust

über geschmack lässt sich vorzüglich streiten, aber das wollen wir ja nicht :)

ich sehe im momnent ehrlich gesagt hauptsächlich das problem erstmal taugliche und bezahlbare 3D abtastung zu finden oder eine zuverlässige 2D abtastung zu konstruieren

zu deiner aussage vorher stellt sich mir die frage, wie du den karton denn erfassen möchtest wenn er nicht im scanbereich ist?! (falls es nicht klar rauskam, der offene deckel war zu hoch für den zeilenscanner aber tief genug um den robo zu blockieren und das querliegende rohr des wäscheständer war so niedrig dass er es erst nicht gesehn hat udn dann beim wenden drauf auffuhr und stecken blieb)

wenn cih nur einen einzeiligen zeilenscanner habe muss ich ihn so positionieren, dass er sowohl bodennahe objekte erfassen kann als auch objekte die sich sehr weit oben befinden, den scanner an der höchsten stelle des robo anzubringen und leicht schräg nach unten sehen zu lassen, erlaubt es dir einen relativ großen beerich abzuscannen, kann dann aber leicht unterlaufen werden, vor allem wenn sich der robo gerade dreht und seitlich ein niedriges hindernis ist oder das hindernis gerade tief genug hängt um nicht im strahl zu sein aber den robo zu behindern, eine volumentrische erfassung macht meiner meinung nach mehr sinn, benötigt aber eben eine bezahlbaren sensor und etwas mehr rechenpower ...


by the way ich bin bei meinen bisherigen suchen nur auf 3d ToF kameras im miniformat für 150$ aufwärts gestoßen, keine günstigeren technologien soweit leider :(

----------

also ich habe bisher nur 2 kameras gefunden wobei eine nur zeitweilig für einen ansehnlichen preis von 200€ mit 242x171 pixel zu finden war und eine von Seeed Studios mit 80x60 pixel für 175€, die 150€ lösung hat sich doch nur als überteuerter Rangefinder heausgestellt.

dann gibt es da noch realsense von microsoft die wesentlich günstiger ist aber mit projezierten mustern arbeitet und einen gewissen mindestabstand fordert :(

Defiant
01.02.2018, 20:23
Da hab ich mich wohl unklar ausgedrückt. Natürlich muss ein Hindernis durch einen Sensor erfasst werden, damit dem ausgewichen werden kann. Mein Punkt ist aber das ich zum Ausweichen die Wegplanung in 2D machen kann. Ich kann z.B. eine 3D Kamera nehmen und den Raum um mich rum in de 2D-Ebene abbilden. Um beim Karton zu bleiben: Man nimmt seine Umrisse inkl. Deckel und bildet den kompletten Umfang in die Ebene ab.

Bei dem PR2·sieht man übrigens einen Laserscanner der vertikal geschwenkt wird. (https://www.youtube.com/watch?v=cTCJSNjTdo0) Also auch eine Variante die den Deckel eines Karton sehen dürfte.

P.S.: Kleine Korrektur: Realsense ist von Intel und anscheinend kein normales structured light (https://communities.intel.com/message/479773#479773) wie die Primesense Kameras (Kinect v1) sind.

Ceos
02.02.2018, 07:59
Realsense ist von Intel und anscheinend kein normales structured light (https://communities.intel.com/message/479773#479773) wie die Primesense Kameras (Kinect v1) sind

ja das sieht viel mehr nach dem konzept aus dass auch das iphone x verwendet aber das hat wohl definitiv einen zu kleinen mindestabstand

habe gerade ncoh ein angebot für eine 3te kamera bekommen, die angeblich "VGA" kann also wenn der begriff stimmt 640x480 aber ich tippe mal auf weniger, habe mich jedenfealls für diese entschieden und bestelle sie mir, ist aber auch n ganzen schwung teurer

Andre_S
02.02.2018, 11:06
Hallo zusammen,

es ist sehr interessant zu lesen, dass ROS nicht wirklich effektiv einen Sensor wie Kinect unterstützt. Simulation und Visualisierung besitzen in ROS ja einen hohen Anteil, allerdings dass es scheinbar nicht vernünftig möglich ist die Werte des Kinect Sensors für eine 3D Hinderniserkennung einzusetzen lässt mich mein Projekt (Umstellung auf ROS) erneut überdenken.
Aber dies ist nicht das Thema.
Die Berechnung passiert ja auf Triangulation, also einfachen Dreiecksberechnungen. Positiv dabei ist das die Entfernung immer die gerade vom Bot zum Objekt darstellt. Um mein damaliges Vorgehen grob darzustellen:
Ich prüfe kontinuierlich in Bewegungsrichtung das Deph-Image auf gültige Entfernungswerte, die dem Umriss meines Bot entsprechen. Größe des Bot und Position der CAM ist ja bekannt und somit auch die notwendigen Bereiche. Tritt innerhalb des Bot-Bereiches ein gültiger Entfernungswert auf, wird in einem Array genau dieses Element erhöht. Das Array besteht also aus genau der Anzahl maximal möglicher Entfernungswerte. Nach Analyse des Tiefenbildes wird das Array ausgewertet. Der erste Arraywert, welcher eine Mindestanzahl von Punkten beinhaltet, (Mehrere gleiche Entfernungswerte sind notwendig um Fehlmessungen nicht als Hindernis zu interpretieren und auch auf eine Mindestobjektgröße zu prüfen) entspricht der Entfernung zum Hindernis.
Bei meiner Botgröße und der damaligen Position/Winkel des Kinect Sensors konnte ich aber nur bis auf 5cm Bodenhöhe abtasten um nicht diesen situationsbedingt als Hindernis zu erhalten.
Dieser Prozess geschieht kontinuierlich und aktualisiert zyklisch den Entfernungswert zu einem Hindernis mit welchem der Bot kollidieren würde.
Ich hatte dies hier auch mal grafisch im unteren Bild visualisiert, an welchem man erkennt, dass er mit dem Drehstuhl unten und oben in ca. 110cm Entfernung kollidieren würde.
http://home-robotics.de/Seite22.html
(http://home-robotics.de/Seite22.html)

Gruß André

Markus4004
02.02.2018, 21:41
ja das sieht viel mehr nach dem konzept aus dass auch das iphone x verwendet

Das Iphone X benutzt normales Structured Light, wie auch die Kinect 1 - kein Wunder, sind ja praktisch beide von Primesense.