3D-Matrix zu 3D-Körper

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
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

hallo zusammen,

ich bin neu in Python. Aus Arbeitsgründen muss ich einige Daten visualisieren. Ich entschied mich für Python als Hilfsmittel.

Derzeit habe ich die 3D-Matrix bereits als Bild dargestellt. Ich möchte fragen, wie der Prozess fortgesetzt werden kann, damit diese Punktmatrix in ein Körpermodell umgewandelt wird.

Die Darstellung der 3D-Matrix ist sehr grundsätzlich, da meine Daten unregelmäßig sind, so dass ich sie separat eingeben muss, z.B:

Code: Alles auswählen

count = 0
for x in range(1,10):
	for y in range(1,10):
		for z in range(1,10):
			count += 1
			if count >= 200 and count <= 400:
				ax.scatter(x,y,z,c ="b")
			elif count >= 500 and count <= 800:
				ax.scatter(x,y,z,c ="r")
			else:
				ax.scatter(x,y,z,c ="g")
plt.show()
Dies ist nur ein Teil-Beispiel, meine realen Daten sind viel komplizierter als das. Aber ich muss nur wissen, wie ich nachfolgende Anweisungen hinzufügen kann, um sie in einen 3D-Körper zu übersetzen, und das ist genug.

Danke im Voraus!

Van
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@TaigoVan,

Es ist nicht ganz klar, was du eigentlich mit 3D-Körper meinst. Ein Polygon-Mesh mit ausgefüllten Flächen?
Geht das in die Richtung die du meinst?
https://matplotlib.org/2.0.2/mpl_toolki ... orial.html

Übrigens:
Matplotlib ist ein Erweiterungspaket von Python. Wenn du sagst, du programmierst in Python, weiß man noch lange nicht, dass du Matplotlib verwendest.

Das habe ich nur geraten weil die letzte Zeile diesen Funktionsaufruf enthält: plt.show()

Es ist gut, dass du dein Problem auf wenige Zeilen reduziert hast. Du solltest aber immer auch zeigen, welche Pakete du zusätzlich importiert hast. Dann fällt es leichter dich zu verstehen.
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

rogerb hat geschrieben: Samstag 10. Juli 2021, 16:53 @TaigoVan,

Es ist nicht ganz klar, was du eigentlich mit 3D-Körper meinst. Ein Polygon-Mesh mit ausgefüllten Flächen?
Geht das in die Richtung die du meinst?
https://matplotlib.org/2.0.2/mpl_toolki ... orial.html

Übrigens:
Matplotlib ist ein Erweiterungspaket von Python. Wenn du sagst, du programmierst in Python, weiß man noch lange nicht, dass du Matplotlib verwendest.

Das habe ich nur geraten weil die letzte Zeile diesen Funktionsaufruf enthält: plt.show()

Es ist gut, dass du dein Problem auf wenige Zeilen reduziert hast. Du solltest aber immer auch zeigen, welche Pakete du zusätzlich importiert hast. Dann fällt es leichter dich zu verstehen.
Hallo rogerb,

vielen Dank für Ihre Antwort.

Ganz ehrlich weiß ich auch nicht, was für ein 3D-Modell mein Betreuer braucht. Es scheint, dass er nur Ergebnisse will, der Typ und die Methode muss von mir selbst gefunden werden.

Ich denke, dass dieser 3D-Körper wie ein rechteckiger Körper aussieht, der aus verschiedenfarbigen Teilen besteht. Wie Sie sagten, "Ein Polygon-Mesh mit ausgefüllten Flächen".

Ich habe das Module Matplotlib importiert, und es tut mir leid, dass ich es nicht vollständig ausgeschrieben habe. Hier ist das vollständige Programm (diese Matrix ist nur ein Beispiel!).

Code: Alles auswählen

from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

plt.figure()
ax = plt.axes(projection="3d")
ax.set_xlim(0,10)
ax.set_ylim(0,10)
ax.set_zlim(0,10)

count = 0

for x in range(1,10):
	for y in range(1,10):
		for z in range(1,10):
			count += 1
			if count >= 200 and count <= 400:
				ax.scatter(x,y,z,c ="b")
			elif count >= 500 and count <= 800:
				ax.scatter(x,y,z,c ="r")
			else:
				ax.scatter(x,y,z,c ="g")
plt.show()
Van
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@TaigoVan,

deine Beispieldaten bestehen aus einem Würfel von 10x10x10 Punkten im Raum. Ich kann mir nicht vorstellen, wie man daraus sinnvoll einen 3D-Körper erstellen kann, wenn nicht einen simplen Würfel.

Du solltest dir zunächst überlegen welche Art von 3D Plot du verwenden möchtest. Hier sind einige Beispiele:
https://matplotlib.org/2.0.2/gallery.html#mplot3d

Für welche Art du dich entscheidest, sollte von der Art der Daten abhängen. Was sollen die Daten den darstellen?
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

rogerb hat geschrieben: Samstag 10. Juli 2021, 18:24 @TaigoVan,

deine Beispieldaten bestehen aus einem Würfel von 10x10x10 Punkten im Raum. Ich kann mir nicht vorstellen, wie man daraus sinnvoll einen 3D-Körper erstellen kann, wenn nicht einen simplen Würfel.

Du solltest dir zunächst überlegen welche Art von 3D Plot du verwenden möchtest. Hier sind einige Beispiele:
https://matplotlib.org/2.0.2/gallery.html#mplot3d

Für welche Art du dich entscheidest, sollte von der Art der Daten abhängen. Was sollen die Daten den darstellen?
Also eigentlich möchte ich ein Rechteck aus 21x21x11 Punkten bauen. Dieses Beispiel verkleinert nur die Größe und die Verteilung.

Ich habe die von Ihnen angegebenen Beispiele überflogen. Aber es hat nicht das richtige Modell, nach dem ich suche. baut Python nur die folgende grafische Darstellung? Oder gilt das nur für das Modul matplotlib?

Bedeutung der Daten: Diese Matrixpunkte stellen die TCP-Koordinaten eines Roboters dar. Ich möchte den erreichbaren/nicht erreichbaren Bereich durch das Bild anzeigen. Die Nummer und die Koordinaten, die jedem Punkt entsprechen, wurden festgelegt, und ihr Zustand ist nach der Simulation schon bekannt.

Vielleicht ist meine Idee nicht realisierbar oder ungeeignet. Können Sie eine geeignete Art der Bilddarstellung für diese Bedeutung nennen? Danke!

Van
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@TaigoVan

Matplotlib ist dazu gedacht Daten grafisch darzustellen. Natürlich kannst du damit auch die TCP Koordinaten deines Roboters darstellen.
Du hast ja auch schon eine Menge von Punkten im Raum angezeigt bekommen.
Ich möchte den erreichbaren/nicht erreichbaren Bereich durch das Bild anzeigen
Wie genau? bei dir werden die Punkte ja in verschiedenen Farben dargestellt. Du kannst also die erreichbaren Punkte grün färben und die nicht erreichbaren rot.
Falls du das nicht mit den Farben möchtest must du genau sagen was du haben möchtest.
Wie willst du den erreichbaren Bereich anzeigen lassen? Sollen Ebenen anzeigen wo der Bereich aufhört? ... ?

Vielleicht so?
Das ist ein sehr einfaches Beispiel wobei ein Würfelförmiger Arbeitsraum für den Roboter dargestellt wird.
Es Werden 10 Bahnpunkte des TCPs dargestellt.
(Abgewandelte Version von diesem Post: viewtopic.php?f=1&t=32766#p249229)

Code: Alles auswählen

from mpl_toolkits.mplot3d import *
import matplotlib.pyplot as plt
import numpy as np
from matplotlib import cm

fig = plt.figure()
ax = fig.gca(projection="3d")


x_surf = np.arange(-1, 2, 1)
y_surf = np.arange(-1, 2, 1)
x_surf, y_surf = np.meshgrid(x_surf, y_surf)
z_surf = np.zeros(x_surf.shape)+1
ax.plot_surface(x_surf, y_surf, z_surf, color="gray", alpha=0.5)
z_surf = np.zeros(x_surf.shape)-1
ax.plot_surface(x_surf, y_surf, z_surf, color="gray", alpha=0.5)

x_surf = np.arange(-1, 2, 1)
z_surf = np.arange(-1, 2, 1)
x_surf, z_surf = np.meshgrid(x_surf, z_surf)
y_surf = np.zeros(y_surf.shape)+1
ax.plot_surface(x_surf, y_surf, z_surf, color="gray", alpha=0.5)
y_surf = np.zeros(y_surf.shape)-1
ax.plot_surface(x_surf, y_surf, z_surf, color="gray", alpha=0.5)

y_surf = np.arange(-1, 2, 1)
z_surf = np.arange(-1, 2, 1)
y_surf, z_surf = np.meshgrid(y_surf, z_surf)
x_surf = np.zeros(x_surf.shape)+1
ax.plot_surface(x_surf, y_surf, z_surf, color="gray", alpha=0.5)
x_surf = np.zeros(x_surf.shape)-1
ax.plot_surface(x_surf, y_surf, z_surf, color="gray", alpha=0.5)

pointsx = np.linspace(0, 1.5, 10)
pointsy = np.linspace(0, 1.5, 10)
pointsz = np.linspace(0, 1.5, 10)

ax.scatter(pointsx, pointsy, pointsz, color="black")

ax.set_xlabel("x label")
ax.set_ylabel("y label")
ax.set_zlabel("z label")

plt.show()

Alternativ könnte dir Blender helfen.
https://www.blender.org/
Blender ist ein OpenSource Software zum Modellieren von 3D Modellen.
Blender hat nicht nur eine grafische Benutzeroberfläche, sondern auch eine Python - API Modelle programmatisch zu erstellen.

Mit was für einem Roboter arbeitest du denn?
Vielleicht ist ein Softwaretool für die Programmierung für Industrieroboter auch hilfreich.
Zum Beispiel RoboDK hat eine grafische Benutzeroberfläche und zusätzlich ein Python API:

https://robodk.com/simulation
https://robodk.com/doc/en/PythonAPI/index.html
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

@rogerb

Vielen Dank für das Beispiel

Ich stelle natürlich die verschiedenen Zustände des TCP durch die Regionen dar, die aus verschiedenfarbigen Punkten bestehen. Eine Grenzbeschreibung ist ebenfalls notwendig.
Ich habe das Programm ausgeführt und festgestellt, dass der Würfel von 6 Flächen umschlossen ist und anscheinend nur die Farbverteilung auf der Außenseite zeigt, während sein Inneres nicht gefüllt ist. Ich möchte gleichzeitig seine innere Farbverteilung zeigen. Gibt es Möglichkeit?

Ich habe die Blender-Software noch nicht benutzt, also muss ich mir das mal ansehen.

Für RoboDK habe ich schon probiert. Mit der Python-API kann er entsprechende Zielpunkte im simulierten Raum erzeugen und mit der Kollisionserkennung auch die entsprechenden Zustände herausfinden. Dies ist in der Tat ein Bild. Ich habe aber keine weiteren Bildverarbeitungsfunktionen gefunden, die die Punkte jedes Zustands zu eigenen Modellen zusammensetzen. Es scheint nur die Bewegungstrajektorie anzuzeigen.

Van
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich möchte gleichzeitig seine innere Farbverteilung zeigen. Gibt es Möglichkeit?
Ich kann mir ehrlich gesagt, nicht vorstellen wie das gehen sollte. Wie soll man in einen Körper hinein schauen können?
Ich habe die äußeren Flächen transparent dargestellt, damit man noch die Bahnpunkte im Inneren sehen kann.
Man könnte jetzt noch weiter Ebenen im Inneren platzieren um andere Bereiche zu kennzeichnen.

Ich verstehe aber leider immer noch nicht was du dir genau vorstellst. Kannst du mal ein Beispiel zeigen?
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

rogerb hat geschrieben: Sonntag 11. Juli 2021, 14:30
Ich möchte gleichzeitig seine innere Farbverteilung zeigen. Gibt es Möglichkeit?
Ich kann mir ehrlich gesagt, nicht vorstellen wie das gehen sollte. Wie soll man in einen Körper hinein schauen können?
Ich habe die äußeren Flächen transparent dargestellt, damit man noch die Bahnpunkte im Inneren sehen kann.
Man könnte jetzt noch weiter Ebenen im Inneren platzieren um andere Bereiche zu kennzeichnen.

Ich verstehe aber leider immer noch nicht was du dir genau vorstellst. Kannst du mal ein Beispiel zeigen?
Bild

Es ist wahrscheinlich so wie auf dem Bild, aber es braucht nicht so viele Farben, nur eine einfache Unterscheidung mit Grün und Rot.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

Ich habe jetzt noch einen inneren grünen Würfel eingebaut.

Code: Alles auswählen

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection="3d")


for (start, end), color, alpha in zip([(-1, 1), (-0.8, 0.8)], ["red", "green"], [0.4, 0.8]):

    x = np.linspace(start, end, 5)
    y = np.linspace(start, end, 5)
    z = np.linspace(start, end, 5)

    xx, yy = np.meshgrid(x, y)
    zz = np.ones(xx.shape) * start
    ax.plot_surface(xx, yy, zz, color=color, alpha=alpha)
    zz = np.ones(xx.shape) * end
    ax.plot_surface(xx, yy, zz, color=color, alpha=alpha)

    xx, zz = np.meshgrid(x, z)
    yy = np.ones(xx.shape) * start
    ax.plot_surface(xx, yy, zz, color=color, alpha=alpha)
    yy = np.ones(xx.shape) * end
    ax.plot_surface(xx, yy, zz, color=color, alpha=alpha)

    yy, zz = np.meshgrid(y, z)
    xx = np.ones(yy.shape) * start
    ax.plot_surface(xx, yy, zz, color=color, alpha=alpha)
    xx = np.ones(yy.shape) * end
    ax.plot_surface(xx, yy, zz, color=color, alpha=alpha)


pointsx = np.linspace(0, 1.5, 10)
pointsy = np.linspace(0, 1.5, 10)
pointsz = np.linspace(0, 1.5, 10)

ax.scatter(pointsx, pointsy, pointsz, color="black")

ax.set_xlabel("x label")
ax.set_ylabel("y label")
ax.set_zlabel("z label")

plt.show()
Also wenn das nicht deinen Erwartungen entspricht komme ich da leider auch nicht mehr weiter.
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

@rogerb

Das sieht gut aus, ich werde versuchen, es auf meine Daten anzuwenden und sehen, was meine Betreuer denken.

Nochmals vielen Dank!

Van
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

@rogerb

Hallo, mein Betreuer hat mir geantwortet und er braucht ungefähr den gleichen Effekt wie das Bild unten.

Bild
wie eine 3D-Wolke

Können Sie einen solchen Effekt durch Python zeigen? Ich habe mir die Beispielmodelle in dem verwendeten Paket angesehen und es scheint nichts Ähnliches zu geben.

Van
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@TaigoVan

das geht bestimmt, dafür muss man aber wissen, wie diese Körper mathematisch definiert sind.

Beispiele, was man mit Matplotlib machen kann:
https://matplotlib.org/stable/gallery/m ... olid-color

https://matplotlib.org/stable/gallery/m ... rgb-colors

https://matplotlib.org/stable/gallery/m ... numpy-logo

Ich würde dir empfehlen die Beispiele mal auszuprobieren und zu manipulieren.
Mehr kann ich leider auch nicht. Ich müsste mich auch längere Zeit damit beschäftigen um das hinzubekommen.
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@TaigoVan,

das habe ich noch gefunden:
https://pi3d.github.io/html/ReadMe.html

Könnte auch funktionieren. Hab ich aber noch nie verwendet.
TaigoVan
User
Beiträge: 9
Registriert: Samstag 10. Juli 2021, 15:15

@rogerb

Vielen Dank für den Link! Ich werde mir das genau ansehen.

MfG

Van
Antworten