目录
- [一、find_box_3d 函数](#一、find_box_3d 函数)
- [二、find_box_3d 函数调用过程](#二、find_box_3d 函数调用过程)
首先说明一下这部分代码在find_box_3d这个例程中,非常好用的一个坐标系生成函数。
一、find_box_3d 函数
find_box_3d在3D对象模型ObjectModel3DScene中查找盒子,并返回抓握点的姿势GrippingPose,一个3D对象模型ObjectModel3DBox一个分数值score和一个字典BoxInformation,其中包含关于每个找到的盒子的进一步信息。
盒子的边长在SideLen1、SideLen2和SideLen3中传递。每个长度由一个包含两个值的元组组成,表示该边的最小和最大长度。如果只期望盒子的一个面是可见的,或者不应该限制盒子的剩余长度,SideLen3=-1
首先,在GrippingPose中返回一个紧握点的姿势。根据xyz映射设置盒子的使用面和抓取姿势的z轴。如果只有盒子的一面是可见的,那么抓握姿势的中心就在那一面的中心,并且它的z轴方向远离xyz映射的观察点。如果盒子的多个侧面可见,则抓握姿势位于与xyz映射的观察点最平行的一侧的中心。z轴再次朝向远离xyz映射的观察点。
在ObjectModel3DBox中,该框也以三角化形式返回。这允许对结果进行快速可视化。
对于每个找到的框,在score中返回0到1之间的分数。分数表示盒子及其边缘的可见程度,以及找到的盒子与指定尺寸的匹配程度。
csharp
find_box_3d( : : ObjectModel3DScene, SideLen1, SideLen2, SideLen3, MinScore, GenParam : GrippingPose, Score, ObjectModel3DBox, BoxInformation)
results:这个键引用一个包含找到的框的字典。
它们根据它们的分数按降序排序,从0开始的升序整数键。
每个框的结果都是一个字典,包含以下关键字:box_pose:这是框在场景坐标系统中的姿态。
这个姿势用于可视化找到的盒子。
box_length_x, box_length_y, box_length_z:与box_pose对应的找到的盒子的边长。
Box_length_x和box_length_y总是包含一个正数。
如果只有盒子的一面是可见的,box_length_z将被设置为O.gripping_pose:与GrippingPose中返回的姿势相同。
gripping_length_x, gripping_length_y, gripping_length_z:找到的盒子对应于GrippingPose的边长。
Gripping_length_x和gripping_length_y总是包含一个正数。
如果只有盒子的一面是可见的,gripping_length_z将被设置为0。
score:与score中返回的分数相同。
one_side_only:布尔值,指示框的一侧是否可见('true')或不可见('false ')。
gen_param:这是一个字典,其中包含用于查找box 3d的参数。
SideLen1、SideLen2和SideLen3被池放在一个具有密钥长度的元组中。
关键的最小分数引用MinScore。
其他键的表示类似于字典Gen Param的通用参数。
sampled_edges:这是带有采样边缘的3D对象模型。
它包含作为法向量的边缘点的观察方向。
sampled_edges_direction:这是带有采样边缘的3D对象模型(与sampled_edges键相同)。
它包含作为法向量的边缘点的边缘方向。
sampled_scene:这是在其中寻找盒子的采样场景。
它可以用于可视化或调试采样距离。
sampled_reference_points:这是一个3D对象模型,其中来自3D场景的所有点在匹配过程中用作参考点。
对于每个参考点,在假设参考点位于箱体表面的情况下,计算箱体的最佳位姿。
二、find_box_3d 函数调用过程
这个例子展示了如何在3D场景中找到通用的盒子。
*首先,3D场景由带有的xyz图像生成
- xyz_to_object_model_3d运算符。然后,用指定的方框
*在3D场景中可以找到边长。 - find_box_3d为每个找到的框返回一个GrippingPose
*在调用find_box_3d指定的大小范围内。
*这种抓握姿势可以提供给手眼校准
*机器人抓取找到的盒子。请确保 - GrippingPose和机器人使用相同的姿态类型(参见
- create_pose)。
*在大多数应用场景中,3D场景必须是
*预处理,以便在a中找到通用框
*快速而健壮的方法。
- find_box_3d操作符提供的文档
*如何准备数据的详细描述
*故障排除。
csharp
* ***************************************************************
* Example for the generic box finder using 3D data.
*
* This example shows how to find generic boxes in a 3D scene.
* First, the 3D scene is generated from an XYZ-image with the
* operator xyz_to_object_model_3d. Then, the boxes with specified
* side lengths are found in the 3D scene.
*
* find_box_3d returns a GrippingPose for each found box that is
* within the size range specified in the call to find_box_3d.
* This GrippingPose can be provided to a hand-eye calibrated
* robot to grip the found boxes. Please ensure that the
* GrippingPose and the robot use the same pose type (see
* create_pose).
*
* In most application scenarios, the 3D scene has to be
* preprocessed in order to find generic boxes in a
* fast and robust way.
* The documentation of the operator find_box_3d provides
* detailed descriptions how to prepare your data or how to
* troubleshoot in case of problems.
*
* The example demonstrates how to use the operators
* xyz_to_object_model_3d,
* find_box_3d,
* and the procedure debug_find_box_3d.
*
* ***************************************************************
dev_update_off ()
ImagePath := 'boxes/cardboard_boxes_'
*
dev_close_window ()
dev_open_window (0, 0, 1024, 768, 'black', WindowHandle)
*
* Prepare and display description.
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_disp_introduction ()
stop ()
*
* Show the example image.
dev_clear_window ()
read_image (Image, ImagePath + '01')
dev_display (Image)
Message := 'This is an image of the example scene in which we want to find the boxes.'
dev_disp_text (Message, 'window', 'top', 'left', 'black', [], [])
dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], [])
stop ()
*
RobotToolSize := 0.03
gen_robot_tool_and_base_object_model_3d (RobotToolSize * 0.05, RobotToolSize, OM3DToolOrigin, OM3DBase)
*
Pose := []
for SceneIdx := 1 to 4 by 1
* Read the image of the scene and create a 3D object model.
read_image (ImageXYZ, ImagePath + 'xyz_' + SceneIdx$'02')
decompose3 (ImageXYZ, X, Y, Z)
xyz_to_object_model_3d (X, Y, Z, OM3DScene)
*
* Set the minimum and maximum side lengths of the boxes in meter.
Len1 := [0.099, 0.11]
Len2 := [0.075, 0.085]
Len3 := [0.045, 0.065]
* Set box detection parameters.
Params := dict{}
Params.remove_outer_edges := 'true'
Params.max_gap := 150
* Find the boxes.
find_box_3d (OM3DScene, Len1, Len2, Len3, 0.2, Params, GrippingPose, Score, OM3DBox, BoxInformation)
* The procedure debug_find_box_3d can be used to debug the
* results of find_box_3d.
* debug_find_box_3d (OM3DBox, OM3DScene, BoxInformation, FindBox3DGenParam)
*
* Visualize the found boxes and the gripping poses.
GripTools := []
Colors := []
for Index := 0 to |Score| - 1 by 1
rigid_trans_object_model_3d (OM3DToolOrigin, GrippingPose[7 * Index:7 * Index + 6], OM3DToolTransformed)
GripTools := [GripTools,OM3DToolTransformed]
* Determine color of the gripping point
* coordinate system in RGB.
Colors := [Colors,'red', 'green', 'blue']
endfor
*
OM3DSampledScene := BoxInformation.sampled_scene
OM3DSampledEdges := BoxInformation.sampled_edges
gen_visualization_title (BoxInformation, Title)
*
Colors := [Colors,gen_tuple_const(|OM3DBox|,'green'),'yellow', 'gray']
Labels := [gen_tuple_const(3 * |OM3DBox|,''),Score$'.2f','', '']
visualize_object_model_3d (WindowHandle, [GripTools,OM3DBox,OM3DSampledEdges,OM3DSampledScene], [], Pose, ['color_' + [0:4 * |OM3DBox| + 2 - 1],'alpha_' + [3 * |OM3DBox|:4 * |OM3DBox| - 1]], [Colors,gen_tuple_const(|OM3DBox|,0.5)], Title, Labels, [], Pose)
endfor
dev_disp_text (' End of program ', 'window', 'bottom', 'right', 'black', [], [])