find_box_3dT_find_box_3dFindBox3dFindBox3dfind_box_3d (Operator)

Name

find_box_3dT_find_box_3dFindBox3dFindBox3dfind_box_3d — Findet Boxen in 3D-Daten.

Signatur

find_box_3d( : : ObjectModel3DScene, SideLen1, SideLen2, SideLen3, MinScore, GenParam : GrippingPose, Score, ObjectModel3DBox, BoxInformation)

Herror T_find_box_3d(const Htuple ObjectModel3DScene, const Htuple SideLen1, const Htuple SideLen2, const Htuple SideLen3, const Htuple MinScore, const Htuple GenParam, Htuple* GrippingPose, Htuple* Score, Htuple* ObjectModel3DBox, Htuple* BoxInformation)

void FindBox3d(const HTuple& ObjectModel3DScene, const HTuple& SideLen1, const HTuple& SideLen2, const HTuple& SideLen3, const HTuple& MinScore, const HTuple& GenParam, HTuple* GrippingPose, HTuple* Score, HTuple* ObjectModel3DBox, HTuple* BoxInformation)

HPoseArray HObjectModel3D::FindBox3d(const HTuple& SideLen1, const HTuple& SideLen2, const HTuple& SideLen3, const HTuple& MinScore, const HDict& GenParam, HTuple* Score, HObjectModel3DArray* ObjectModel3DBox, HDict* BoxInformation) const

HPose HObjectModel3D::FindBox3d(const HTuple& SideLen1, const HTuple& SideLen2, const HTuple& SideLen3, double MinScore, const HDict& GenParam, HTuple* Score, HObjectModel3DArray* ObjectModel3DBox, HDict* BoxInformation) const

static HPoseArray HSurfaceModel::FindBox3d(const HObjectModel3D& ObjectModel3DScene, const HTuple& SideLen1, const HTuple& SideLen2, const HTuple& SideLen3, const HTuple& MinScore, const HDict& GenParam, HTuple* Score, HObjectModel3DArray* ObjectModel3DBox, HDict* BoxInformation)

static HPose HSurfaceModel::FindBox3d(const HObjectModel3D& ObjectModel3DScene, const HTuple& SideLen1, const HTuple& SideLen2, const HTuple& SideLen3, double MinScore, const HDict& GenParam, HTuple* Score, HObjectModel3DArray* ObjectModel3DBox, HDict* BoxInformation)

static void HOperatorSet.FindBox3d(HTuple objectModel3DScene, HTuple sideLen1, HTuple sideLen2, HTuple sideLen3, HTuple minScore, HTuple genParam, out HTuple grippingPose, out HTuple score, out HTuple objectModel3DBox, out HTuple boxInformation)

HPose[] HObjectModel3D.FindBox3d(HTuple sideLen1, HTuple sideLen2, HTuple sideLen3, HTuple minScore, HDict genParam, out HTuple score, out HObjectModel3D[] objectModel3DBox, out HDict boxInformation)

HPose HObjectModel3D.FindBox3d(HTuple sideLen1, HTuple sideLen2, HTuple sideLen3, double minScore, HDict genParam, out HTuple score, out HObjectModel3D[] objectModel3DBox, out HDict boxInformation)

static HPose[] HSurfaceModel.FindBox3d(HObjectModel3D objectModel3DScene, HTuple sideLen1, HTuple sideLen2, HTuple sideLen3, HTuple minScore, HDict genParam, out HTuple score, out HObjectModel3D[] objectModel3DBox, out HDict boxInformation)

static HPose HSurfaceModel.FindBox3d(HObjectModel3D objectModel3DScene, HTuple sideLen1, HTuple sideLen2, HTuple sideLen3, double minScore, HDict genParam, out HTuple score, out HObjectModel3D[] objectModel3DBox, out HDict boxInformation)

def find_box_3d(object_model_3dscene: HHandle, side_len_1: Sequence[float], side_len_2: Sequence[float], side_len_3: Sequence[float], min_score: Union[float, int], gen_param: HHandle) -> Tuple[Sequence[Union[float, int]], Sequence[float], Sequence[HHandle], HHandle]

Beschreibung

find_box_3dfind_box_3dFindBox3dFindBox3dFindBox3dfind_box_3d findet Boxen im 3D-Objektmodell ObjectModel3DSceneObjectModel3DSceneObjectModel3DSceneObjectModel3DSceneobjectModel3DSceneobject_model_3dscene und gibt für jede Box die Pose eines Greifpunktes GrippingPoseGrippingPoseGrippingPoseGrippingPosegrippingPosegripping_pose, ein 3D-Objektmodell ObjectModel3DBoxObjectModel3DBoxObjectModel3DBoxObjectModel3DBoxobjectModel3DBoxobject_model_3dbox, eine Bewertung ScoreScoreScoreScorescorescore und ein Dictionary BoxInformationBoxInformationBoxInformationBoxInformationboxInformationbox_information mit weiteren Informationen zu den gefundenen Boxen zurück.

Die Kantenlängen der zu suchenden Boxen werden in SideLen1SideLen1SideLen1SideLen1sideLen1side_len_1, SideLen2SideLen2SideLen2SideLen2sideLen2side_len_2 und SideLen3SideLen3SideLen3SideLen3sideLen3side_len_3 übergeben. Jede dieser Längen besteht aus einem Tupel mit zwei Werten, die den möglichen Wertebereich der Kantenlänge angeben. Wenn zu erwarten ist, dass nur eine Seite der Box zu sehen ist, oder die übrige Seitenlänge nicht beschränkt werden soll, kann SideLen3SideLen3SideLen3SideLen3sideLen3side_len_3 auch auf -1 gesetzt werden.

Der Parameter MinScoreMinScoreMinScoreMinScoreminScoremin_score setzt die Mindestbewertung für die zurückgegebenen Boxen fest. Boxen, die eine Bewertung unterhalb dieses Wertes haben, werden nicht zurückgegeben.

ObjectModel3DSceneObjectModel3DSceneObjectModel3DSceneObjectModel3DSceneobjectModel3DSceneobject_model_3dscene muss ein XYZ-Mapping aufweisen, was beispielsweise der Fall ist, wenn das Modell mit xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3dXyzToObjectModel3dxyz_to_object_model_3d erzeugt wurde.

Üblicher Arbeitsablauf

Ein üblicher Arbeitsablauf zum Finden von 3D-Boxen in 3D-Daten sieht wie folgt aus:

  1. Die 3D-Daten werden entweder als XYZ-Bilder, oder direkt als 3D-Objektmodell mit XYZ-Mapping erzeugt.

  2. Es sollte so viel wie möglich vom Hintergrund und von anderen Störobjekten entfernt werden, die nicht Teil einer Box sind. Dies macht das Auffinden von Boxen robuster und schneller. Dafür kann z.B. thresholdthresholdThresholdThresholdThresholdthreshold und reduce_domainreduce_domainReduceDomainReduceDomainReduceDomainreduce_domain auf die XYZ-Bilder angewendet werden, um im Anschluss das Modell mit xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3dXyzToObjectModel3dxyz_to_object_model_3d zu erzeugen. Andere Möglichkeiten zur Verbesserung der Laufzeit finden sich weiter unten im dem Abschnitt über Problembehandlung.

  3. Wenn die 3D-Daten als XYZ-Bilder vorliegen, müssen sie mittels xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3dXyzToObjectModel3dxyz_to_object_model_3d in ein 3D-Objektmodell konvertiert werden.

  4. Die ungefähren Seitenlängen der zu findenden Boxen müssen ermittelt werden. Zu beachten ist, dass spätere Änderungen dieser Seitenlängen möglicherweise auch die Anpassung anderer Parameter notwendig macht, etwa MinScoreMinScoreMinScoreMinScoreminScoremin_score.

  5. find_box_3dfind_box_3dFindBox3dFindBox3dFindBox3dfind_box_3d wird aufgerufen. Als Parameter wird das 3D-Objektmodell der Szene sowie die ungefähren Seitenlängen übergeben.

  6. Mittels der Prozedur visualize_object_model_3d können, wenn notwendig, die Ergebnisse visualisiert werden.

Interpretation der Ergebnisse

Die gefundenen Boxen werden auf verschiedene Weisen zurückgegeben.

Zunächst wird für jede Box die Pose eines Greifpunktes in GrippingPoseGrippingPoseGrippingPoseGrippingPosegrippingPosegripping_pose zurückgegeben. Die verwendete Boxseite und die z-Achse der Greifpose werden anhand des XYZ-Mapping bestimmt. Ist nur eine Seite der Box sichtbar, dann liegt das Zentrum der Greifpose in der Mitte dieser Seite und ihre z-Achse zeigt vom Aufnahmepunkt des XYZ-Mapping weg. Wenn mehrere Seiten der Box sichtbar sind, liegt die Pose des Greifpunkts in der Mitte der Seite, die am ehesten parallel zum Aufnahmepunkt des XYZ-Mapping liegt. Die z-Achse der Pose zeigt wieder vom Aufnahmepunkt des XYZ-Mapping weg. Für die x-Achse der Pose wird die Boxachse gewählt, die grob am besten mit der Spaltenrichtung des XYZ-Mapping übereinstimmt. Die y-Achse wird aus der x- und z-Achse berechnet.

Die Boxen werden außerdem in ObjectModel3DBoxObjectModel3DBoxObjectModel3DBoxObjectModel3DBoxobjectModel3DBoxobject_model_3dbox als vermaschtes 3D-Objektmodell zurückgegeben. Dies ermöglicht eine einfache Visualisierung der Ergebnisse.

Für jede gefundene Box wird in ScoreScoreScoreScorescorescore eine Bewertung zwischen 0 und 1 zurückgegeben. Diese gibt an, wie gut die Box und ihre Kanten sichtbar sind, und wie gut die gefundene Box zu den spezifizierten Kantenlängen passt.

Schlussendlich wird mit BoxInformationBoxInformationBoxInformationBoxInformationboxInformationbox_information ein Dictionary zurückgegeben, welches weitere Informationen über die Ergebnisse enthält. Diese können mit get_dict_paramget_dict_paramGetDictParamGetDictParamGetDictParamget_dict_param und get_dict_tupleget_dict_tupleGetDictTupleGetDictTupleGetDictTupleget_dict_tuple abgerufen werden, oder mit dem Handle Inspect-Fenster in HDevelop untersucht werden.

Das Dictionary BoxInformationBoxInformationBoxInformationBoxInformationboxInformationbox_information enthält folgende Schlüssel:

results:

Dieser Schlüssel verweist auf ein Dictionary, das die gefundenen Boxen enthält. Diese sind absteigend nach Bewertung sortiert und sind durch aufsteigende Integer-Werte (Startwert 0) als Schlüssel referenziert.

Für jede gefundene Box wird ein Dictionary mit folgenden Schlüsseln zurückgegeben:

box_pose:

Beschreibt die Pose der Box relativ zum Koordinatensystem der Szene. Diese Pose wird zur Visualisierung der Box verwendet.

box_length_x, box_length_y, box_length_z:

Die Kantenlängen der gefundenen Box entsprechend der Pose box_pose. box_length_x und box_length_y enthalten immer einen positiven Wert. Wenn nur eine Seite der Box sichtbar ist wird box_length_z auf 0 gesetzt.

gripping_pose:

Entspricht der Pose, die in GrippingPoseGrippingPoseGrippingPoseGrippingPosegrippingPosegripping_pose zurückgegeben wird.

gripping_length_x, gripping_length_y, gripping_length_z:

Die Kantenlängen der gefundenen Box entsprechend der Pose GrippingPoseGrippingPoseGrippingPoseGrippingPosegrippingPosegripping_pose. gripping_length_x und gripping_length_y enthalten immer einen positiven Wert. Wenn nur eine Seite der Box sichtbar ist wird gripping_length_z auf 0 gesetzt.

score:

Entspricht der Bewertung, die in ScoreScoreScoreScorescorescore zurückgegeben wird.

one_side_only:

Gibt an, ob nur eine Seite der Box sichtbar ist ('true'"true""true""true""true""true") oder mehr ('false'"false""false""false""false""false").

gen_param:

Dieses Dictionary enthält die Parameter, die an find_box_3dfind_box_3dFindBox3dFindBox3dFindBox3dfind_box_3d übergeben wurden. SideLen1SideLen1SideLen1SideLen1sideLen1side_len_1, SideLen2SideLen2SideLen2SideLen2sideLen2side_len_2, und SideLen3SideLen3SideLen3SideLen3sideLen3side_len_3 sind in einem Tupel mit dem Schlüssel lengths zusammengefasst. Der Schlüssel min_score verweist auf MinScoreMinScoreMinScoreMinScoreminScoremin_score. Die weiteren Schlüssel sind analog zu den generischen Parametern im Dictionary GenParamGenParamGenParamGenParamgenParamgen_param bezeichnet (siehe unten).

sampled_edges:

Dieses 3D-Objektmodell mit abgetasteten Kanten enthält die Blickrichtung der Kantenpunkte als Normalenvektoren.

sampled_edges_direction:

Dieses 3D-Objektmodell mit abgetasteten Kanten (analog zu sampled_edges) enthält die Kantenrichtungen der Kantenpunkte als Normalenvektoren.

sampled_scene:

Dieser Schlüssel enthält die abgetastete Szene, in der die Boxen gesucht werden. Sie kann zur Visualisierung oder zur Überprüfung der Abtastdistanz verwendet werden.

sampled_reference_points:

Dieser Schlüssel enthält ein 3D-Objektmodell mit allen Punkten der 3D-Szene, die als Referenzpunkte für das Matching verwendet wurde. Für jeden dieser Referenzpunkte wird eine optimale Box-Pose berechnet, in der Annahme, dass sich der Punkt auf der Oberfläche der Box befindet.

Generische Parameter

Weitere generische Parameter können als Schlüssel-Tupeldaten-Paare in das Dictionary GenParamGenParamGenParamGenParamgenParamgen_param übergeben werden um den Matching-Vorgang zu verbessern. Die folgenden Parameternamen fungieren als Schlüssel zu den dazugehörigen Tupeldaten (siehe create_dictcreate_dictCreateDictCreateDictCreateDictcreate_dict und set_dict_tupleset_dict_tupleSetDictTupleSetDictTupleSetDictTupleset_dict_tuple).

3d_edges:

Mit diesem Schlüssel können die zu verwendenden 3D-Kanten übergeben werden. Als Wert muss ein 3D-Objektmodell übergeben werden. Dieses Modell wird üblicherweise mit edges_object_model_3dedges_object_model_3dEdgesObjectModel3dEdgesObjectModel3dEdgesObjectModel3dedges_object_model_3d erzeugt , und kann bei Bedarf noch weiter gefiltert werden um z.B. Ausreißer zu entfernen. Wenn dieser Parameter nicht angegeben wird, werden die Kanten intern aus der Szene ähnlich zum Operator edges_object_model_3dedges_object_model_3dEdgesObjectModel3dEdgesObjectModel3dEdgesObjectModel3dedges_object_model_3d extrahiert.

3d_edge_min_amplitude:

Legt die minimale Amplitude einer Unstetigkeit fest, um als Kante klassifiziert zu werden. Falls Kanten manuell in 3d_edges übergeben werden ist zu beachten, dass dieser Parameter ignoriert wird. Andernfalls verhält sich 3d_edge_min_amplitude ähnlich wie MinAmplitudeMinAmplitudeMinAmplitudeMinAmplitudeminAmplitudemin_amplitude für den Operator edges_object_model_3dedges_object_model_3dEdgesObjectModel3dEdgesObjectModel3dEdgesObjectModel3dedges_object_model_3d.

Restriktion: 3d_edge_min_amplitude >= 0

Standardwert: 10% der kleinsten Boxdiagonale.

max_gap:

Wenn keine 3D-Kanten mittels 3d_edges übergeben wurden, werden diese intern automatisch extrahiert. Der Parameter steuert diese Kantenextraktion.

max_gap hat die gleiche Bedeutung wie in edges_object_model_3dedges_object_model_3dEdgesObjectModel3dEdgesObjectModel3dEdgesObjectModel3dedges_object_model_3d.

remove_outer_edges:

Entfernt die am äußersten gelegenen Kanten (wenn auf 'true'"true""true""true""true""true" gesetzt). Für Anwendungen bei denen ein Griff in die Kiste erfolgt kann dies zum Beispiel nützlich sein, um die Kiste aus den 3D-Daten zu entfernen.

Standardwert: 'false'"false""false""false""false""false"

Mögliche Werte: 'false'"false""false""false""false""false", 'true'"true""true""true""true""true"

max_num_boxes:

Begrenzt die Anzahl an zurückgegebenen Boxen. Standardmäßig gibt find_box_3dfind_box_3dFindBox3dFindBox3dFindBox3dfind_box_3d alle gefundenen Boxen zurück, deren Bewertung über MinScoreMinScoreMinScoreMinScoreminScoremin_score liegt. Mit diesem Parameter kann die Anzahl entsprechend begrenzt werden.

Standardwert: 0 (alle Boxen zurückgeben)

box_type:

Legt die Arten von Boxen fest, die gesucht werden sollen. Für 'full_box_visible'"full_box_visible""full_box_visible""full_box_visible""full_box_visible""full_box_visible" werden nur dann Boxen zurückgegeben, wenn mehr als eine Seite der Box sichtbar ist. Wird 'single_side_visible'"single_side_visible""single_side_visible""single_side_visible""single_side_visible""single_side_visible" gesetzt, wird nur nach Boxen mit einer sichtbaren Seite gesucht. Ist trotzdem eine weitere Boxseite sichtbar wird diese nicht berücksichtigt. Mit 'all'"all""all""all""all""all" werden alle Boxen zurückgegeben.

Standardwert: 'all'"all""all""all""all""all"

Mögliche Werte: 'all'"all""all""all""all""all", 'single_side_visible'"single_side_visible""single_side_visible""single_side_visible""single_side_visible""single_side_visible", 'full_box_visible'"full_box_visible""full_box_visible""full_box_visible""full_box_visible""full_box_visible"

Problembehandlung

Visualisierung der gefundenen Kanten und der abgetasteten Szene:

Um die Ergebnisse der Boxerkennung besser zu verstehen, können einige der intern verwendeten Daten mittels get_dict_tupleget_dict_tupleGetDictTupleGetDictTupleGetDictTupleget_dict_tuple aus BoxInformationBoxInformationBoxInformationBoxInformationboxInformationbox_information ausgelesen werden

Die abgetastete Szene kann mit dem Schlüssel sampled_scene ausgelesen werden. Das Finden von kleineren Boxen braucht eine dichter abgetastete Szene, was die Boxerkennung langsamer macht.

Die abgetasteten 3D-Kanten können mit den Schlüsseln sampled_edges und sampled_edges_directions. ausgelesen werden. Die beiden 3D-Objektmodelle enthalten die gleichen Punkte, allerdings sind in sampled_edges die Normalenrichtungen auf die Blickrichtungen der Kanten gesetzt, während in sampled_edges_directions die Normalenrichtungen auf die Kantenrichtung gesetzt werden. Die Kantenrichtung steht senkrecht auf den Kanten und zeigt nach außen.

Verbesserung der Laufzeit:

Wenn find_box_3dfind_box_3dFindBox3dFindBox3dFindBox3dfind_box_3d zu lange dauert, können die folgenden Schritte helfen, die Laufzeit zu verringern.

Ausführungsinformationen

Dieser Operator unterstützt Cancel-Timeouts und Interrupts.

Parameter

ObjectModel3DSceneObjectModel3DSceneObjectModel3DSceneObjectModel3DSceneobjectModel3DSceneobject_model_3dscene (input_control)  object_model_3d HObjectModel3D, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Handle des 3D-Objektmodells, welches die Szene enthält.

SideLen1SideLen1SideLen1SideLen1sideLen1side_len_1 (input_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Länge der ersten Boxkante.

SideLen2SideLen2SideLen2SideLen2sideLen2side_len_2 (input_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Länge der zweiten Boxkante.

SideLen3SideLen3SideLen3SideLen3sideLen3side_len_3 (input_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Länge der dritten Boxkante.

Defaultwert: -1

MinScoreMinScoreMinScoreMinScoreminScoremin_score (input_control)  real HTupleUnion[float, int]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Mindestbewertung der zurückgegebenen Boxen.

Defaultwert: 0.6

Restriktion: 0 <= MinScore <= 1

GenParamGenParamGenParamGenParamgenParamgen_param (input_control)  dict HDict, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Dictionary für generische Parameter.

Defaultwert: []

GrippingPoseGrippingPoseGrippingPoseGrippingPosegrippingPosegripping_pose (output_control)  pose(-array) HPose, HTupleSequence[Union[float, int]]HTupleHtuple (real / integer) (double / int / long) (double / Hlong) (double / Hlong)

Greifposen der gefundenen Boxen.

ScoreScoreScoreScorescorescore (output_control)  real-array HTupleSequence[float]HTupleHtuple (real) (double) (double) (double)

Bewertungen der gefundenen Boxen.

ObjectModel3DBoxObjectModel3DBoxObjectModel3DBoxObjectModel3DBoxobjectModel3DBoxobject_model_3dbox (output_control)  object_model_3d-array HObjectModel3D, HTupleSequence[HHandle]HTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Gefundene Boxen als 3D-Objektmodell.

BoxInformationBoxInformationBoxInformationBoxInformationboxInformationbox_information (output_control)  dict HDict, HTupleHHandleHTupleHtuple (handle) (IntPtr) (HHandle) (handle)

Weitere Informationen als Dictionary.

Ergebnis

Wenn alle Parameter korrekt sind liefert find_box_3dfind_box_3dFindBox3dFindBox3dFindBox3dfind_box_3d den Wert 2 (H_MSG_TRUE). Gegebenenfalls wird eine Fehlerbehandlung durchgeführt.

Vorgänger

read_object_model_3dread_object_model_3dReadObjectModel3dReadObjectModel3dReadObjectModel3dread_object_model_3d, xyz_to_object_model_3dxyz_to_object_model_3dXyzToObjectModel3dXyzToObjectModel3dXyzToObjectModel3dxyz_to_object_model_3d

Nachfolger

gen_box_object_model_3dgen_box_object_model_3dGenBoxObjectModel3dGenBoxObjectModel3dGenBoxObjectModel3dgen_box_object_model_3d, get_dict_tupleget_dict_tupleGetDictTupleGetDictTupleGetDictTupleget_dict_tuple

Alternativen

find_surface_modelfind_surface_modelFindSurfaceModelFindSurfaceModelFindSurfaceModelfind_surface_model

Modul

3D Metrology