在新版本的halcon中内置了realsense的接口,本文对doc/html/reference/acquisition/hAcqRealSense.html
文档中的内容做一定的整理 翻译 机翻 部分机翻。
跳过安装SDK、配置Halcon接口的步骤。
open_framegrabber
:该算子用于连接realsense设备,其中的参数可以对获取到的图像的特性进行配置,当然,在持续采样过程中,也可以通过set_framegrabber_param
算子对这些参数进行修改,一般情况可以使用默认参数。
与通过RealSense接口访问的设备的连接是通过设备ID建立的,该ID在每个设备上保证是唯一的,并且在多个会话中保持不变。系统中所有设备的列表可以通过info_framegrabber
算子的参数'device'
或'info_boards'
获得,这两个参数返回的列表格式为:' | device:
。上面的字符串参数不仅可以标识不同的设备,而且可以直接用于open_framegrabber
中的'Device'
参数中(这时只需要'| device:
字符串条目)。
作为一种特殊情况,可以使用字符串 "default"
–在这种情况下,HALCON采集接口将使用第一个可用设备(不可访问的设备将被跳过)。然而,当多个设备连接到系统时,这可能导致设备的非确定性打开。
RealSense设备通常由多个模块组成,每个模块提供一种类型的数据流。例如,深度模块提供深度数据,颜色模块提供颜色数据,可以叠加生成彩色点云。每个模块也可能由多个子组件组成(例如,D400设备的深度模块由两个红外传感器和一个红外激光投影仪组成)。
配置选项是在每个模块的基础上管理的。这意味着有些选项可能只对其中一个模块有效,有些选项可能对两个模块都有效。例如,"ExposureTime
(曝光时间) "功能可以为深度和颜色模块配置,"LaserPower
(激光功率) "功能只能为深度模块配置。为了涵盖这种使用情况,同时保持 "曝光时间 "等功能的单一性,SFNC(GenICam标准功能命名公约)指定了 “SourceSelector
”。它允许切换配置选项的目标。
下面的例子说明了这个概念,它为每个模块配置了不同的 “曝光时间”:
set_framegrabber_param (AcqHandle,'SourceSelector','Depth')
set_framegrabber_param (AcqHandle,'ExposureTime',10000)
set_framegrabber_param (AcqHandle,'SourceSelector','Color')
set_framegrabber_param (AcqHandle,'ExposureTime',15000)
诸如ExposureTime
这些特性的名称参考于librealsense2/h/rs_option.h
文件,除非SFNC规定了一个特定的不同名称。
图像采集可以是同步的(grab_image
/grab_data
),也可以是异步的(grab_image_start
/grab_image_async
/grab_data_async
),见操作符的参考文件。
该接口可完全配置和控制摄像机的采集过程。请注意,在采集过程中,GenICam可能会锁定相机的某些功能。
在同步抓取(grab_image
/grab_data
)的情况下,每张图像都会在内部(internally)开始新的采集,因此应用程序总是能得到一张新的图像。在提供图像之前,采集会再次停止,因此在各个grab_image
/grab_data
调用之间,所有与采集有关的功能都保持解锁状态。
在异步抓取中,通过 grab_image_start
显式启动或通过 grab_image_async
/grab_data_async
隐式启动,接口在内部保持抓取运行,收集更多的图像,通过未来的 grab_image_async
/grab_data_async
调用传递。采集的相关功能被锁定,直到使用set_framegrabber_param(..., 'do_abort_grab', ...)
停止采集。
采集接口提供了两种从设备获取图像(或其他)数据的机制,即 grab_image
/grab_image_async
和 grab_data
/grab_data_async
。在内部,这两种机制的工作方式完全相同(特别是它们如何从设备上获取和处理数据),它们的区别在于如何向应用程序提供输出。
grab_image
/grab_image_async
操作符只能输出一张图像。对于RealSense设备,这个单一的图像将包含3D点的Z坐标。它将作为图像类型 "real "的图像返回,其中每个像素是一个浮点值。这种方法目前也被HDevelop的图像采集助手所使用。
对于RealSense设备来说,grab_image
/grab_image_async
操作符太有限了,无法处理所有的数据。相反,应该使用 grab_data
/grab_data_async
操作符。操作符的第一个输出变量中返回的图像元组总是包含三维点的X、Y和Z平面。所有这些都是 "real "图像类型的图像。此外,如果激活了,并且设备提供了必要的视频流,图像元组将包含颜色叠加和置信度图。要打开和关闭这些额外的组件,请参考SFNC的功能 "ComponentSelector "和 “ComponentEnable”。操作符也可以在’Date’输出变量中返回一个自动生成的ObjectModel3D。
默认情况下,grab_data
运算符只输出各种可用的图像或图像平面。为了处理三维数据,三维坐标必须被组合成一个点云。在HALCON的术语中,这被称为ObjectModel3D。RealSense采集接口提供了自动生成这种ObjectModel3D的机制。要激活这个功能,请使用参数 “create_objectmodel3d
”。无效的点将被自动从生成的ObjectModel3D中排除。此外,可以使用参数’coordinate_transform_mode
’、‘confidence_mode
’、'confidence_threshold
’和’add_objectmodel3d_overlay_attrib
’配置这个过程。
点云可以被手动生成:ObjectModel3D也可以通过从图像元组中提取X、Y和Z平面并使用HALCON操作符’xyz_to_object_model_3d
’来手动生成。
在open_framegrabber
过程中,会自动选择深度数据流的最大可用分辨率。如果有的话,彩色数据流和置信度叠加会自动激活。
接口默认为采集引擎分配了4个缓冲区(缓冲区的数量可以通过open_framegrabber
的’Generic’参数改变)。
每当一个新的图像被成功获取并作为HALCON图像传递给应用程序时,接口就会将缓冲区锁定(不将其返回给采集引擎),直到应用程序调用一个新的抓取相关的操作符或者使用set_framegrabber_param(.., 'do_abort_grab', ...)
中止采集。在这期间,查询这个 "最后获取的 "缓冲区的信息是完全安全的–例如通过get_framegrabber_param
参数查询缓冲区属性,如’buffer_timestamp’, ‘buffer_is_incomplete’, ‘image_width’ 和 ‘image_height’。
当应用程序调用一个新的抓取相关的操作符时,接口会将缓冲区返回给采集引擎,与缓冲区相关的查询就不再有效了。
可能发生的情况是,摄像机暂时或不断地以高于应用程序处理数据的速度获取数据。在这种情况下,RealSense Producer的流媒体引擎会根据’[Stream]StreamBufferHandlingMode’参数来决定如何处理所获取的缓冲区。
一共分三种命名规则,对应三种来源的参数:
"[System]", e.g., [System]TLVendorName.
"[Interface]", e.g., [Interface]InterfaceType.
"[Device]", e.g., [Device]DeviceID.
"[Stream]", e.g., [Stream]StreamBufferHandlingMode.
Halcon提供的原生类型:
在访问基于GenICam的特性时,必须将GenICam数据类型映射到HALCON识别的参数类型。GenICam提供以下类型:
采集设备设置的当前状态(定义其工作状态的所有参数的值)可能会在没有采集活动时持续存在,即在 grab_image_start
或 grab_image_async
之前或 set_framegrabber_param(.., 'do_abort_grab', 1)
之后。这不仅适用于实际的设备参数,也适用于配置RealSense Producer的参数和RealSense图像采集接口的内部参数。设备参数通常会保留到设备断电为止。RealSense Producer模块和Cusumer参数会一直保留到调用close_framegrabber
。要指示哪些参数需要持久化,请使用参数’settings_selector
’。持久性功能包括两个步骤,将当前的配置存储到一个文件中,之后再将其重新加载到设备上。由’settings_selector
’指示的所选模块设置,可以使用’do_write_settings
’参数存储,随后使用’do_load_settings
’参数重新加载,在这两种情况下都要指定想要的持久化文件路径。要查询一个特征是否可以被持久化,可以使用后缀’_streamable
’。
请注意,虽然文件的格式是有意让人阅读的,而且如果需要的话,可以手工修改文件,但这种修改应该由熟悉GenICam持久性功能内部和给定设备的人小心进行。对文件的不当修改会导致使用时出现错误。
相同的持久化文件可以应用于相同类型和固件版本的整套设备。将持久化文件应用于另一种类型的设备或使用不同的固件版本,可能会导致不一致或甚至完全失败。
比较简单,容易看懂