1. 简述
Orbbec SDK K4A
Wrapper基于Orbbec SDK进行设计封装,将Orbbec SDK转换到Azure Kinect Sensor SDK的接口。主要实现数据流接收,彩色参数设置,D2C和点云功能,录像和回放,API的接口和Azure Kinect Sensor SDK保持一致,方便用户在不修改应用代码的情况下快速的切换至 Orbbec Femto Bolt 及 Orbbec Femto Mega 相机。
Orbbec SDK K4A
Wrapper开源链接:https://github.com/orbbec/OrbbecSDK-K4A-Wrapper
Orbbec SDK K4A
Wrapper的实现原理如下:
Orbbec SDK K4A
Wrapper的特点如下:
● 保持Azure
Kinect Sensor SDK原有的接口不变。
● 修改Azure
Kinect Sensor SDK C API 的实现(impl),内部调用Orbbec SDK 获取视频帧和控制 Femto Mega & Bolt 相机.
● 坐标点的转换、D2C、C2D、点云 复用Azure
Kinect Sensor SDK。
Orbbec SDK K4A
Wrapper当前支持的相机:
Orbbec Femto
Bolt:
Win10 x86/x64,
Ubuntu18.04 x64,Ubuntu20.04 x64
Orbbec Femto
Mega:
Win10 x86/x64,
Ubuntu20.04 x64
2. AKDK 应用如何切换到Orbbec SDK K4A Wrapper
本章节主要展示在用户应用代码工程下,通过使用Orbbec SDK K4A Wrapper替换Azure Kinect Sensor
SDK库文件及头文件的方式,实现代码工程切换适配Femto Bolt相机。
对于用户已编译输出的应用,也可以直接替换应用可执行文件所链接的libk4a库文件的方式直接切换。
2.1 Windows 平台应用
2.1.1 环境配置: 修改注册表
因Windows系统机制,对于UVC协议设备,如果需要拿到时间戳等metadata信息,需要先往注册表完成注册。可依据obsensor_metadata_win10.md文档指引执行obsensor_metadata_win10.ps1脚本自动完成。
2.1.2 替换头文件
Orbbec SDK K4A
Wrapper基于Azure Kinect Sensor SDK V1.4.1 版本开发,头文件直接使用了K4A 库原有头文件,如果用户工程原先使用的是Azure Kinect Sensor
SDK V1.4.1 版本,可以忽略此步骤。
● 找到Orbbec SDK K4A Wrapper中的头文件
● 替换掉Azure
Kinect Sensor SDK中对应的头文件
2.1.3 替换库文件
编译
● 将Orbbec SDK K4A Wrapper中k4a.lib和k4arecord.lib库文件拷贝到Azure Kinect Sensor SDK对应路径下。
● 替换掉Azure
Kinect Sensor SDK中对应的k4a.lib和k4arecord.lib库文件,即可对应用程序进行编译。
运行
● 找到Orbbec
SDK K4A Wrapper中的k4a.dll、k4arecord.dll、OrbbecSDK.dll、depthengine_2_0.dll的库文件
将上述库文件拷贝到Azure Kinect Sensor SDK的原有可执行应用程序路径下,并替换原有k4a.dll、k4arecord.dll、depthengine_2_0.dll库文件,即可运行应用程序。
2.2 Linux 平台应用
2.2.1 环境配置: 安装udev rules配置
Linux系统默认对USB设备的直接访问需要root权限,可以通过rules配置文件解决。Orbbec SDK K4A Wrapper提供有一个配置文件和安装脚本,执行脚本即可完成安装。
执行方法如下:
sudo chmod +x ./install.sh # 确保安装脚本有可执行权限
sudo ./install.sh #
通过 sudo 命令执行脚本
2.2.2 替换头文件
Orbbec SDK K4A
Wrapper基于Azure Kinect Sensor SDK V1.4.1 版本开发,头文件直接使用了K4A库原有头文件,如果用户工程原先使用的是Azure Kinect Sensor
SDK V1.4.1版本,可以忽略此步骤。
找到原Orbbec SDK K4A Wrapper的头文件,替换掉Azure Kinect
Sensor SDK对应路径下的头文件。
2.2.3 替换库文件
● 将Orbbec
SDK K4A Wrapper中的库文件拷贝到Azure Kinect Sensor SDK对应路径下。
● 替换掉Azure
Kinect Sensor SDK中对应的库文件,即可对应用程序进行编译。
注意事项:
Linux平台下,深度引擎库需要使用OpenGL,如果应用层也使用OpenGL、且跨线程调用OpenGL实例,可能会造成上下文冲突,导致深度引擎在初始化时出现问题,以及无法正常启动深度数据流。
如果应用层使用了OpenGL渲染,要在应用层参考OpenGL下面链接切换Context:
(https://www.khronos.org/opengl/wiki/OpenGL_and_multithreading)
以下是我们使用glfw库的解决方法:
a. 在开流之前,调用glfwMakeContextCurrent(NULL) 。
b. 然后再开流。
c. 开流结束后,glfwMakeContextCurrent(currentContext)。
// 参考github:
file: tools/k4aviewer/k4adevicedockcontrol.cpp
GLFWwindow *currentContext = glfwGetCurrentContext(); // store the current
context
glfwMakeContextCurrent(NULL); // make current context to NULL
StartCameras(); // will initialize the DepthEngine
glfwMakeContextCurrent(currentContext); // restore the current context
3. AKDK 用户骨架算法适配
下面以 Azure Kinect Body Tracking SDK的 Sample 为例,介绍如何通过替换掉Azure Kinect Sensor SDK,实现通过 Azure Kinect
Body Tracking SDK ( 以下简称:K4ABT )使用 Orbbec Femto Bolt 相机数据获取骨架数据。 (用户可以在不修改代码甚至不重新编译的情况下,直接替换库文件切换)
3.1
windows 平台
3.1.1 骨架安装包下载安装
依据微软提供的安装文档完成安装:https://learn.microsoft.com/zh-cn/azure/kinect-dk/body-sdk-setup下载
,然后执行该文件完成安装。
3.1.2 演示骨架算法效果
依据章节2完成环境配置(metadata 注册),然后在安装目录上将Azure kinect Sensor SDK的以下几个库替换成 Orbbec SDK
K4A Wrapper库(k4a.dll、OrbbecSDK.dll、k4arecord.dll,depthengine_2_0.dll),然后以管理员权限运行simple_3d_viewer.exe。
下面是骨架算法的效果:
3.1.3 骨架算法二次开发(sample 编译)
1、下载Azure Kinect Samples
网址:https://github.com/microsoft/Azure-Kinect-Samples.git
代码克隆:
git clone https://github.com/microsoft/Azure-Kinect-Samples.git
2、使用Visual Studio 打开微软骨架sample
微软骨架sample,只支持visual studio打开,使用VS2019打开 以下工程。
3、使用Orbbec SDK K4A Wrapper的头文件和库文件替换Azure Kinect
Sensor SDK的头文件和库文件。
a、替换头文件
b、替换库文件
4、 编译&运行
a. simple_3d_viewer.exe
例子依赖 以下2个库,从安装包拷贝到编译的生成应用程序的bin 目录。
b. 将依赖库拷贝到运行目录:
c. 编译运行界面如下:
3.2
Linux 下运行 Kinect 骨架算法
由于微软Azure Kinect Sensor SDK库只提供了 Ubuntu
18.04 的安装,以下内容推荐在 Ubuntu 18.04 系统上完成。
3.2.1 安装 Azure Kinect Sensor SDK
参考微软安装文档的章节完成安装。文档链接: Azure
Kinect Sensor SDK download | Microsoft Learn
安装指令:
curl -sSL -O
https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update
sudo apt-get install libk4a1.4-dev
sudo apt-get install k4a-tools
3.2.2 安装 Azure Kinect Body Tracking SDK
参考微软安装文档的章节完成安装。文档链接:Azure
Kinect Body Tracking SDK download | Microsoft Learn
以下指令在安装Azure Kinect Sensor SDK时执行,可以不用重复执行:
curl -sSL -O
https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb
sudo apt-get update
安装 libk4abt:
sudo apt install libk4abt1.1-dev
3.2.3 使用Orbbec SDK K4A Wrapper替换Azure Kinect Sensor
SDK库
依据章节 2 完成环境配置(udev rules 脚本安装),然后将Orbbec SDK K4A Wrapper包内库文件替换掉Azure Kinect
Sensor SDK库文件(libk4a.so,libOrbbecSDK.so,
depthengine2)。替换后连 Orbbec相机,终端输入 simple_3d_viewer 命令,可看到如下运行效果:
4. Orbbec SDK
K4A Wrapper和Azure Kinect Sensor SDK差异点
1. 有差异的功能点
序号 |
功能点 |
Orbbec SDK
K4A Wrapper |
Azure Kinect
Sensor SDK |
差异点对应用程序影响点 |
1 |
录像 |
typedef
struct _k4a_record_configuration_t { /** *
The timestamp offset of the start of the recording. All recorded timestamps
are offset by this value such that *
the recording starts at timestamp 0. This value can be used to synchronize
timestamps between 2 recording files. */ uint64_t start_timestamp_offset_usec; }
k4a_record_configuration_t; |
typedef
struct _k4a_record_configuration_t { /** *
The timestamp offset of the start of the recording. All recorded timestamps
are offset by this value such that *
the recording starts at timestamp 0. This value can be used to synchronize
timestamps between 2 recording files. */ uint32_t start_timestamp_offset_usec; }
k4a_record_configuration_t; |
需要替换更新Orbbec SDK
K4a Wrapper的头文件重新编译 |
2 |
深度引擎库 |
Orbbec Femto
Bolt深度引擎与Azure Kinect DK不通用,因此Orbbec Femto Bolt相机需要使用Orbbec打包提供的专用深度引擎库 |
多个版本 |
替换Femto Bolt定制的深度引擎库 |
3 |
IMU 采样率 |
默认500Hz,相机支持50Hz、100Hz、200Hz、500Hz、1KHz、2KH |
1.6KHz |
无影响,用户可以使用更多的采样率。 |
2. Orbbec SDK K4A Wrapper未实现的接口(返回空值或返回异常状态)
序号 |
Azure Kinect Sensor SDK |
接口涵义 |
差异点影响 |
1 |
k4a_result_t k4a_set_allocator(k4a_memory_allocate_c b_t allocate, k4a_memory_destroy_cb_t free) |
传入外部用户自定义内存管理器供 SDK 内部申请需要的内存 |
用户无法使用其自定义内存管理器供 SDK 内部使用。 SDK 自身功能运行基本不受影响 |
2 |
void k4a_capture_set_temperature_c(k4a_capture_t ca pture_handle, float temperature_c) |
设置 capture 的温度信息 |
用户无法修改该值,对用户保存自定义数值有影响 |
3 |
float k4a_capture_get_temperature_c(k4a_capture_t ca pture_handle) |
获取capture 的温度信息 |
用户无法获取到该值,对用户依赖该值的算法或应用运行有影响。 |
4 |
void k4a_image_set_exposure_usec(k4a_image_t imag e_handle, uint64_t exposure_usec) |
设置图像的曝光值 |
用户无法修改该值,对用户保存自定义数值有影响 |
5 |
void k4a_image_set_white_balance(k4a_image_t image _handle, uint32_t white_balance) |
设置图像的白平衡值 |
|
6 |
void k4a_image_set_iso_speed(k4a_image_t image_handle, uint32_t
iso_speed) |
设置图像快门速度 |
|
7 |
uint64_t k4a_image_get_exposure_usec(k4a_image_t i mage_handle) |
获取图像曝光值 |
用户无法获取到该值,对用户依赖该值的算法或应用运行有影响。 |
8 |
uint32_t k4a_image_get_white_balance(k4a_image_t i mage_handle) |
获取图像白平衡值 |
|
9 |
uint32_t k4a_image_get_iso_speed(k4a_image_t image _handle) |
读取图像快门速度 |
|
10 |
k4a_result_t k4a_device_get_sync_jack(k4a_device_t de vice_handle, bool
*sync_in_jack_connected, bool
*sync_out_jack_connected ) |
获取设备的同步线的连接状态 |
用户应用无法依赖该接口判断多机同步线链接状态 |