【HALCON】【3D Object Model】find_box_3d

1. 算子原型

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

2. 功能

在输入的3D对象模型中查找指定尺寸范围的箱子,返回中心抓取点、得分,以及相关信息。内部使用基于表面的匹配

3. 参数

  • ObjectModel3DScene

    • 3D对象模型句柄,必须包含 XYZ-mapping
  • SideLen1, SideLen2, SideLen3

    箱子的边长范围,每个参数均包含两个值,分别代表箱子一个边的最大最小值。如果只有一个面可见或者对一个面的长度不加以限制,SideLen3可设置为-1

  • MinScore

    最小得分,低于改值的匹配结果将不被返回

  • GenParam

    通用参数,使用键值对的方式进行输入。使用create_dist进行创建,set_dict_tuple进行赋值

    • ‘3d_edges’

      允许手动设置3D边缘信息。该参数必须是一个3D对象模型的句柄。边缘信息通常是edges_object_model_3d算子的结果,也可以对edges_object_model_3d的结果进行相关处理后作为参数进行输入(例如,移除不相关部分)。如果改参数为指定,find_box_3d内部使用类似于edges_object_model_3d的操作进行边缘提取。

    • ‘3d_edge_min_amplitude’

      设置3D边缘的最小幅值。如果边缘信息通过3d_edges输入,则忽略改参数。否则,该参数类似于edges_object_model_3d算子中的MinAmplitude参数

      默认值为模型最小外包立方体对角线长度的10%

    • ‘max_gap’

      如果边缘信息是find_box_3d内部计算的,则该参数用于边缘提取。其含义类似于算子edges_object_model_3d中的max_gap参数

    • ‘remove_outer_edges’

      如果边缘信息是find_box_3d内部计算的,该参数用于控制是否移除最外围的边缘。该参数在Bin Picking应用中非常有用,用以移除外框

    • ‘max_num_boxes’

      限制结果的数量,默认值为0,表示返回所有得分大于MinScore的结果

    • ‘box_type’

      设置查找箱子的类型。

      • ‘single_side_visible’ 仅一个面可见的箱子
      • ‘full_box_visible’ 仅包含多于一个面可见的箱子
      • ‘all’ 所有类型的箱子

4. 返回值

  • GrippingPose

    抓取点的位姿。被用来计算抓取点的箱面于抓取点姿态的Z轴依赖于XYZ-mapping。如果仅一个箱面可见,抓取姿态的中心为该可见面的中心,Z轴方向为原理XYZ-mapping的查看点方向。如果多个箱面可见,抓取点的中心位于最平行于XYZ-mapping的箱面的中心,Z轴相反的方向远离XYZ-mapping的查看点方向。抓取点姿态的X轴方向平行于XYZ-mapping的列方向,Y轴的方向依赖于XZ轴。

  • Score

    箱子与边缘的可见程度和查找到的箱子与给定的尺寸的匹配程度共同决定该值的大小

  • ObjectModel3DBox

    三角化后的箱子可见区域,一般用于快速可视化

  • BoxInformation

    扩展信息,可用get_dict_paramget_dict_tuple通过key进行获取

    • ‘results’

      该键表示查找到的箱子。根据得分降序排列,索引从0开始。对于每个箱子又包含以下键用于获取具体数据。

      • ‘box_pose’

        箱子在输入模型坐标系中的姿态,一般用于可视化箱子

      • ‘box_length_x’, ‘box_length_y’, ‘box_length_z’

        输入模型坐标系下的箱子边长,box_length_xbox_length_y总是大于零的值。如果仅有一个面可见,box_length_z0

      • ‘gripping_pose’

        返回与GrippingPose参数相同的结果

      • ‘gripping_length_x’, ‘gripping_length_y’, ‘gripping_length_z’

        GrippingPose坐标系下的箱子边长,box_length_xbox_length_y总是大于零的值。如果仅有一个面可见,box_length_z0

      • ‘score’

        返回与Score参数相同的结果

      • ‘one_side_only’

        true仅一个面可见,false多于一个面可见

    • ‘gen_param’

      返回find_box_3d算法的部分输入参数,键lengths代表SideLen1SideLen2SideLen3;键min_score表示Min_Score。其他键与GenParam类似 。

    • ‘sampled_edges’

      采样边缘的模型句柄。以XYZ-mapping的查看方向作为边缘点的法向量

    • ‘sampled_edges_direction’

      采样边缘模型句柄。边缘点的法向量为真实的边缘法向量

    • ‘sampled_scene’

      采样后的模型句柄

    • ‘sampled_reference_points’

      用作匹配参考点的采样点句柄

5. 样例

dev_update_off ()
ImagePath := 'boxes/cardboard_boxes_'
dev_close_window ()


RobotToolSize := 0.03
gen_robot_tool_and_base_object_model_3d (RobotToolSize * 0.05, RobotToolSize, OM3DToolOrigin, OM3DBase)


read_image (ImageXYZ, ImagePath + 'xyz_04')
decompose3 (ImageXYZ, X, Y, Z)
xyz_to_object_model_3d (X, Y, Z, OM3DScene)


Len1 := [0.099,0.11]
Len2 := [0.075,0.085]
Len3 := [0.045,0.065]

create_dict (Params)
set_dict_tuple (Params, 'remove_outer_edges', 'true')
set_dict_tuple (Params, 'max_gap', 150)


find_box_3d (OM3DScene, Len1, Len2, Len3, 0.2, Params, GrippingPose, Score, OM3DBox, BoxInformation)


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]
endfor

5.1 结果显示

在这里插入图片描述

5.2 ObjectModel3DBox

在这里插入图片描述
在这里插入图片描述

5.3 BoxInformation

在这里插入图片描述

5.3.1 sample_scene 与 sample_reference_points

  • 原始点云
    在这里插入图片描述
  • 重采样后的点云

在这里插入图片描述

  • 用于匹配的参考点点云
    在这里插入图片描述

5.3.2 sample_edges 与 sample_edges_directions

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KH8uOb9e-1626748024141)(【HALCON】【3D Object Model】find_box_3d.assets/image-20210720102432768.png)]

  • sample_edges边缘点的法向量远离XYZ-mapping查看点方向
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFdnFeqo-1626748024141)(【HALCON】【3D Object Model】find_box_3d.assets/image-20210720102356249.png)]
  • sample_edges_directions边缘点法向量向外
    在这里插入图片描述
由于 `ServerSideSensor` 没有 `set_box_extent` 方法,您需要使用 `carla.World` 类的 `spawn_actor` 方法在仿真环境中生成一个新的 `BoxTrigger` 对象,然后将其分配给传感器的触发器属性。以下是示例代码: ```python import carla # 获取仿真世界和蓝图库 client = carla.Client('localhost', 2000) client.set_timeout(10.0) world = client.get_world() blueprint_library = world.get_blueprint_library() # 获取传感器蓝图 sensor_blueprint = blueprint_library.find('sensor.lidar.ray_cast') # 设置传感器属性 sensor_transform = carla.Transform(carla.Location(x=1.5, z=2.4)) sensor = world.spawn_actor(sensor_blueprint, sensor_transform) sensor_tick = 0.05 sensor.listen(lambda data: process_lidar_data(data)) # 设置触发器属性 extent = carla.Vector3D(5.0, 5.0, 5.0) box_trigger_blueprint = blueprint_library.find('sensor.other.box_trigger') box_trigger = world.spawn_actor(box_trigger_blueprint, carla.Transform(), attach_to=sensor) box_trigger.set_extent(extent) # 运行仿真 world.tick() ``` 在这段代码中,我们使用 `blueprint_library` 对象查找 `sensor.lidar.ray_cast` 和 `sensor.other.box_trigger` 两种蓝图,分别用于生成激光雷达传感器和盒子触发器。然后,我们使用 `world.spawn_actor` 方法在仿真环境中生成传感器和触发器对象,并设置它们的相关属性。最后,我们使用 `world.tick` 方法来运行仿真环境。请注意,您需要将 `process_lidar_data` 函数定义为回调函数,以便接收传感器的数据并进行处理。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhy29563

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值