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 相机.

  坐标点的转换、D2CC2D、点云 复用Azure Kinect Sensor SDK

 

Orbbec SDK K4A Wrapper当前支持的相机:

Orbbec Femto Bolt

Win10 x86/x64,  Ubuntu18.04 x64Ubuntu20.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 Wrapperk4a.libk4arecord.lib库文件拷贝到Azure Kinect Sensor SDK对应路径下。

 

 替换掉Azure Kinect Sensor SDK中对应的k4a.libk4arecord.lib库文件,即可对应用程序进行编译。

 

运行

 找到Orbbec SDK K4A Wrapper中的k4a.dllk4arecord.dllOrbbecSDK.dlldepthengine_2_0.dll的库文件

 

 

将上述库文件拷贝到Azure Kinect Sensor SDK的原有可执行应用程序路径下,并替换原有k4a.dllk4arecord.dlldepthengine_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.dllOrbbecSDK.dllk4arecord.dlldepthengine_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.solibOrbbecSDK.so, depthengine2)。替换后连 Orbbec相机,终端输入 simple_3d_viewer 命令,可看到如下运行效果:

 

 

4. Orbbec SDK K4A WrapperAzure 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,相机支持50Hz100Hz200Hz500Hz1KHz2KH

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

)

获取设备的同步线的连接状态

用户应用无法依赖该接口判断多机同步线链接状态