C/C++
Xvisio SDK 文档主页

demo-api


1 概述

demo_api 示例提供了使用数字字符选择执行功能来演示 Xvisio 设备和对应的 SDK API 的基本功能以及执行功能对应的示例代码。

2 构建和运行

2.1 Linux/Ubuntu

2.1.1 Cmake 构建
  1. 首先需要在 Linux/Ubuntu 主机上安装 Xvisio SDK,可以参考 SDK 安装指南
  2. 启动终端并导航到 demo-api 安装路径 "/usr/share/xvsdk/demo-api" ,或者复制 "/usr/share/xvsdk/demo-api" 到工作目录后导航到“demo-api"目录。
    cp -r /usr/share/xvsdk/demo-api <path_to_work>
    cp -r /usr/share/xvsdk/pipe_srv <path_to_work>
    cd <path_to_work>/demo-api
  3. Cmake生成 Makefile
    mkdir build
    cd build
    cmake ..
  4. 构建
    make
    构建成功会生成名称叫‘demo-api’的可执行二进制程序。
2.1.2 运行
  1. 使用 USB 线连接 xvisio 设备和 Ubunut 主机。

  2. 查看 USB 设备状态,在任意位置打开终端输入:
    lsusb
    观察终端输出usb状态信息,其中 VID:PID 为"040e:f408" ,设备名为"MCCI XVisio vSLAM" 的USB 设备即为 Xvisio 设备。
    通过 Xvisio 设备的 USB Bus 号和对应的总线的 hub 类型来确认当前设备枚举是 USB3.0 或USB2.0 。
    请确保 Xvisio 设备的正确枚举
    以上描述见下图:
    image

  3. 启动终端并导航到 <path_to_work>/demo-api/build 目录
    ./demo-api
    执行这一步前需要确保程序已成功构建并生成了‘demo-api’的可执行二进制程序。

  4. 在相同位置打开另一个终端输入程序名称并回车:
    ./pipe_srv
    pipe_srv 和 demo-api 必须在同一目录下打开。
    打开成功后,终端会输出功能菜单打印,如下:
    pipe server recv has already exist
    pipe server send has already exist
    wait for client connect....
    pipe server get send handle: 3
    pipe server get recv handle: 4
    ready handle: send:3,recv:4


    Demo
    ------------------------------
    1 : Init SDK and get IMU
    2 : Stop get IMU, start slam, get 6dof
    ....
    0 : exit program
    ------------------------------
    enter select:

  5. 执行菜单功能
    pipe-srv的终端上输入对应数字字符后回车 ,执行相应功能,并观察demo-api终端输出结果。
    功能菜单描述

2.2 Windows10/11

2.2.1 构建
  1. 首先需要在 Windows 主机上安装 Xvisio SDK,可以参考 SDK 安装指南
  2. 安装 SDK 成功后,进入安装目录里的 demo-api 示例目录,例如:C:\Program Files\xvsdk\samples\demo-api 。
  3. visual studio 编译
  1. cmake 生成 sln 文件
  • 启动 windows powershell 工具并导航到安装目录下 demo-api 目录。
  • 根据当前的 visual studio 版本执行对应的生成工程命令:
    版本 cmake 命令
    VS2019 64位 cmake -G "Visual Studio 16 2019" -A x64
    VS2019 32位 cmake -G "Visual Studio 16 2019" -A Win32
    VS2017 64位 cmake -G "Visual Studio 15 2017" -A x64
    VS2017 32位 cmake -G "Visual Studio 15 2017" -A Win32
  • dmeo-api 目录里会生成 demo-api.sln 文件
  • 使用 visual studio 打开 demo-api.sln
  • 构建(生成) 解决方案中 demo-api 项目,构建成功会在对应目录中生成 demo-api.exe 。
2.2.2 运行
  1. 使用 USB 线连接 xvisio 设备和 Windows 主机。
  2. 使用 USB 连接 Xvisio 设备到 PC,如果 Xvisio 设备连接正常,那么通常会有3个设备枚举,可以通过系统的设备管理器查看设备状态:
    image
    请检查"VSC interface"设备状态、照相机设备"XVisio vSLAM"状态、"USB Composite Device"状态。如果状态异常请检查 USB线、Xvisio设备固件是否正常以及 Windows 主机 USB 状态是否满足要求,或者请联系 Xvisio FAE 人员寻求支持
  3. 启动 windows powershell 工具并导航到安装目录下 bin 目录,输入程序名称并回车:
    ./demo-api.exe
    image
  4. 打开成功后,powershell 窗口会输出功能菜单打印.
  5. 执行菜单功能
    powershell 窗口上输入对应数字字符后回车 ,执行相应功能,并观察 powershell 窗口输出运行结果。
    功能菜单描述

2.3 Android

注意:

  1. demo-api 工具只能在安装了 root 版本 SDK 的 android 设备运行。所以本节的介绍只对 root 版本的 SDK 介绍。
  2. 本文选择 linux 平台为编译平台为例来介绍。
2.3.1 构建
  1. 安装NDK
  • 下载
    可以从此链接NDK下载,推荐选择r21e版本,请选择适合您的 linux 或 windows 开发平台的 NDK 软件包并下载。本文选择 linux 平台为例介绍。
  • 解压
    unzip android-ndk-r21e-linux-x86_64.zip
  • 设置环境变量
    sudo gedit ~/.bashrc
    在文件末尾添加
    export ANDROID_NDK_ROOT=/path_from_yours/android-ndk-r21e/
    export NDK=${ANDROID_NDK_ROOT}
    export PATH=${PATH}:$NDK
    其中“/path_from_yours/android-ndk-r21e/”替换成 NDK 解压的绝对路径。
    sourc ~/.bashrc
  • 检查设置
    ndk-build -v
    版本信息正确,无报错。
  1. 下载 SDK
  • 获取最新安装包:,请选择下载目录下压缩包:xvsdk_3.2.x-xxxxxxxx_android.zip 。
  • 解压xvsdk_3.2.x-xxxxxxxx_android.zip,并进入解压后文件夹。
  1. 编译
    cd android/jni/
    ndk-build
    会编译出 “Android.mk” 里所有 link 的example 程序。
    编译成功无报错,android/libs/目录下的arm64-v8a会生成可编译好的可执行程序。
2.3.2 运行
  1. 首先需要在 android 主机上安装 Xvisio SDK,可以参考 SDK 安装指南中的 "Android SDK(root 版本)的安装介绍"。
  2. ADB 连接 android 设备到主机,确保adb环境正常,确保 Android 设备具备 remount 权限,确保 push 目录的存在性,这里的示例目录为 "/data/test/" 。
  3. push sdk
    启动终端并导航到sdk解压文件夹内的 android/libs/ 目录,执行:
    adb root
    adb remount
    如果 remount 失败,可以执行:
    adb disable-verity
    adb reboot
    adb root
    adb remount
    如果仍然失败请联系 Android 设备供应商寻求支持
    arm64位示例:
    adb push arm64-v8a /data/test/
    arm32位示例:
    adb push armeavi-v7a /data/test/
  4. 运行demo-api程序:
  • 启动终端并执行:
    adb shell
    cd /data/test/arm64-v8a/
    LD_LIBRARY_PATH=./ ./demo-api
  • 启动另一个终端,运行pipe_srv:
    adb shell
    cd /data/test/arm64-v8a/
    LD_LIBRARY_PATH=./ ./pipe_srv
  • pipe_srv 和 demo-api 必须在同一目录下启动。
    启动成功后,终端会输出功能菜单打印,如下:
    pipe server recv has already exist
    pipe server send has already exist
    wait for client connect....
    pipe server get send handle: 3
    pipe server get recv handle: 4
    ready handle: send:3,recv:4


    Demo
    ------------------------------
    1 : Init SDK and get IMU
    2 : Stop get IMU, start slam, get 6dof
    ....
    0 : exit program
    ------------------------------
    enter select:
  1. 执行菜单功能
    pipe-srv的终端上输入对应数字字符后回车 ,执行相应功能,并观察demo-api终端输出结果。
    功能菜单描述

3 代码介绍

3.1 目录

平台 目录
Windows 安装目录下 samples\demo-api 目录,例如:C:\Program Files\xvsdk\samples\demo-api\
Linux/Ubuntu /usr/share/xvsdk/demo-api/
Android Android SDK 压缩包解压后文件夹里的 examples/demo-api/

3.2 文件

文件 描述
demo-api.cpp demo-api 主要文件
fps_count.hpp 计算帧率的类实现文件
pipe_srv.h 实现管道功能文件(Windows 平台无效)
CMakeLists.txt Cmake 工程文件(Android 平台无效)

3.3 代码解析和介绍

demo-api.cpp 文件 main(....) 函数为入口函数:

int main( int argc, char* argv[] ) try{....}

meun_main[]数组为预设定的功能菜单:

static const char meun_main[] = { ....}

while 循环来等待输入字符命令解析 ,

while (cond) {

Windows平台不使用管道,通过输入字符 'm' 来停止已运行的功能,并输出菜单

#ifdef _WIN32
std::cin >> cCmd;
if (cCmd == "m")
{
if (device)
{
//stop all running items
if (device->display())
{
device->display()->close();
}
if (device->orientationStream())
{
//device->orientationStream()->stop();
device->orientationStream()->unregisterCallback(imuId);
} ....

非 Windows 平台等待管道命令:

#else
cmd = requestCmdAllPlatform(meun_main, sizeof(meun_main));
#endif

解析命令:

switch (cmd) {
case 1:
{
....
}
break;
case 3:
case 22:
case 28:
case 36:
....

每个 case 里执行对应序列号的菜单功能,菜单功能描述见第 4 节.

4 功能菜单描述

功能菜单描述:

序号 功能 描述 备注 关键字
1 Init SDK and get IMU 初始化 SDK 和设备后开始获取 IMU 数据流 运行程序后,首先要做的功能,执行此项可以检查 SDK 版本 Xvisio 设备版本等初始信息 INIT
2 Stop get IMU, start slam, get 6dof 停止获取 IMU ,启动 SLAM 流程获取mixed模式 6dof 数据流 测试验证 SLAM 功能时使用 SLAM
3 Stop slam, stop get 6dof, get IMU 停止获取 6dof ,停止 SLAM 流程,重新启动获取 IMU 数据流 测试验证 SLAM 功能时使用 SLAM
4 Get eyetracking data, stop get IMU 停止获取 IMU ,启动 Eye tracking (眼控) 流程获取 眼控图像流 测试验证 ET (眼控) 功能时使用 ET(眼控)
5 Stop get eyetracking data, get IMU 停止 Eye tracking (眼控) 流程,重新启动获取 IMU 数据流 测试验证 ET (眼控) 功能时使用 ET
9 Stop get IMU, get rgb data 停止获取IMU,启动RGB流程获取RGB数据 测试验证RGB相机功能时使用 RGB
10 Stop rgb, get IMU 停止获取RGB数据,重新启动获取IMU数据流 测试验证RGB相机功能时使用 RGB
11 Stop get IMU, get tof data 停止获取IMU,打开 TOF sensor获取TOF数据 测试验证TOF相机功能时使用 TOF
12 Stop tof, get IMU 停止获取TOF数据,重新启动获取IMU数据流 测试验证TOF相机功能时使用 TOF
13 Start tof plane detection, start slam, stop get IMU, get 6dof 停止获取IMU,启动TOF平面检测流程,并启动slam,获取6DOF数据 验证TOF平面检测功能时使用 TOF plane detection
14 Stop tof plane detection, stop slam, get IMU 停止TOF平面检测流程,并停止slam,重新启动获取IMU数据流程 验证TOF平面检测功能时使用 TOF plane detection
15 Stop get IMU, switch to edge mode, get edge 6dof 停止获取IMU,开启slam,切换至edge模式,获取edge模式下的6dof数据 验证edge模式slam功能时使用 edge slam
16 Stop get edge 6dof, get IMU 停止获取edge模式下的slam数据,重新启动获取IMU数据流程 验证edge模式slam功能时使用 edge slam
17 Test display: open display,set brightness to 2,set brightness to 9 打开屏显,先设置亮度为2,再设置亮度为9 验证屏显亮度调节时使用 display
18 Test display: close display 关闭屏显设置 验证屏显亮度调节时使用 display
19 Stop get IMU, start slam, get 6dof 停止获取 IMU ,启动 SLAM 流程获取mixed模式 6dof 数据流 测试验证 SLAM 功能时使用 SLAM
20 Save shared map 创建Cslam共享地图并保存成bin文件 验证cslam功能时使用 cslam
21 Stop slam, start CSLAM using shared map, start slam 停止获取IMU,加载创建好的Cslam共享地图,并切换到clsam模式 验证cslam功能时使用 cslam
22 Stop slam, get IMU 停止获取slam,重新启动获取IMU数据流程 验证slam功能时使用 slam
23 Start stereo plane detection, start slam, stop get IMU, get 6dof 停止获取IMU,开启fisheye平面检测获取数据,同时开启slam,获取6dof数据 验证fisheye平面检测时使用 fisheye plane detection
24 Stop stereo plane detection, stop slam, get IMU 停止获取fisheye平面检测数据,停止slam数据,重新开启IMU数据流程 验证fisheye平面检测时使用 fisheye plane detection
25 Stop get IMU, switch to EdgeFusionOnHost mode, get 6dof with callback 停止获取IMU,开启slam,切换至EdgeFusionOnHost模式,获取EdgeFusionOnHost模式下的6dof数据 验证edge模式slam功能时使用 EdgeFusionOnHost slam
26 Stop get IMU, switch to EdgeFusionOnHost mode, get 6dof with get-pose 停止获取EdgeFusionOnHost模式下的slam数据,重新启动获取IMU数据流程 验证EdgeFusionOnHost模式slam功能时使用 EdgeFusionOnHost slam
27 Stop get IMU, switch to EdgeFusionOnHost mode, get 6dof with get-pose 停止获取IMU数据,开启slam并切换至EdgeFusionOnHost模式,通过get-pose接口获取6dof数据 验证EdgeFusionOnHost模式下get-pose接口时使用 EdgeFusionOnHost get-pose
28 Stop get 6dof with get-pose, stop EdgeFusionOnHost slam, get IMU 停止使用get-pose接口获取6dof数据,停止EdgeFusionOnHost模式slam,重启开启imu获取流程 验证EdgeFusionOnHost模式下get-pose接口时使用 EdgeFusionOnHost get-pose
29 Call 3Dof get() 停止获取IMU数据,开启通过get接口获取3dof数据流程 测试验证使用get接口获取3dof时使用 3dof get
30 Stop call 3Dof get(), get IMU 停止通过get接口获取3dof数据流程,重新开区获取IMU数据流程 测试验证使用get接口获取3dof时使用 3dof get
31 Call 3Dof getAt() 停止获取IMU数据,开启通过getAt接口获取3dof数据流程 测试验证使用getAt接口获取3dof时使用 3dof getAt
32 Stop call 3Dof getAt(), get IMU 停止通过getAt接口获取3dof数据流程,重新开区获取IMU数据流程 测试验证使用getAt接口获取3dof时使用 3dof getAt
33 Stop get IMU, switch to mixed mode, get 6dof with callback 停止获取IMU,开启slam,切换至mixed模式,通过callback形式获取mixed模式下的6dof数据 验证mixed模式slam功能时使用 mixed slam callback
34 Stop get 6dof with callback, stop mix slam, get IMU 停止获取mixed模式下的slam数据callback, 停止slam,重新启动获取IMU数据流程 验证mixed模式slam功能时使用 mixed slam callback
35 Stop get IMU, switch to mixed mode, get 6dof with get-pos-at 停止获取IMU,开启slam,切换至mixed模式,通过get-pose-at接口获取mixed模式下的6dof数据 验证mixed模式slam功能的get-pos-at接口时使用 mixed slam get-pos-at
36 Stop get 6dof with get-pos-at, stop mix slam, get IMU 停止通过get-pos-at接口获取mixed模式下的slam数据,重新启动获取IMU数据流程 验证mixed模式slam功能的get-pos-at接口时使用 mixed slam get-pos-at
37 Stop get IMU, read rgb calibration 停止获取IMU数据,获取RGB标定数据 测试验证RGB标定时使用 RGB Calibration
38 Stop get IMU, set rgb resolution 停止获取IMU数据,设置RGB分辨率 测试验证RGB分辨率设置时使用 RGB Resolution
39 Stop get rgb data, get IMU 停止获取RGB数据,重新开启获取IMU数据流程 测试验证RGB相机时使用 RGB
40 Stop get IMU, set rbg format 停止获取IMU,设置RGB相机格式 测试验证RGB格式设置时使用 RGB format
41 Stop get IMU, set rbg exposure mode, white balance control, ISO level, EXP level 停止获取IMU,设置RGB曝光模式,白平衡及IOS等级 测试验证RGB相机功能设置时使用 RGB
42 Stop get IMU, set eyetracking exposure, gain 停止获取IMU,设置眼控曝光,增益 测试验证眼控曝光增益设置时使用 ET
43 Stop get IMu, set eyetracking led control 停止获取IMU,设置眼控照明灯光控制 测试验证眼控照明灯光功能时使用 ET
44 Stop get IMU, read fisheye calibration 停止获取IMU,读取fisheye标定 测试验证fisheye标定时使用 fisheye calibration
45 Stop get IMU, read TOF calibration 停止获取IMU,读取TOF标定 测试验证TOF标定时使用 TOF calibration
46 Stop get IMU, set TOF stream mode 停止获取IMU,设置TOF模式 测试验证TOF模式时使用 TOF mode
47 Stop get IMU, set TOF distance mode 停止获取IMU,设置TOF距离模式 测试验证TOF距离模式时使用 TOF Distance
48 Stop get IMU, set event data 停止获取IMU,注册事件callback,获取事件数据 测试验证事件数据时使用 event
49 Stop get IMU, set CNN data 停止获取IMU,注册CNN callback,获取CNN数据 测试验证CNN数据时使用 CNN
50 Stop get IMU, get gesture stream data 停止获取IMU数据,注册标准手势callback,获取标准手势index数据 测试验证标准手势index获取时使用 gesture index
51 Stop get gesture stream data, get IMU 停止获取标准手势数据,重新开启IMU数据获取流程 测试验证获取标准手势时使用 gesture
52 Stop get IMU, get dynamic gesture stream data 停止获取IMU数据,注册动态手势callback,获取动态手势index数据 测试验证动态手势index获取时使用 dynamic gesture
53 Stop get dynamic gesture stream data, get IMU 停止获取动态手势数据,重新开启IMU数据获取流程 测试验证获取动态手势时使用 dynamic gesture
54 Stop get IMU, get gesture keypoints 停止获取IMU数据,注册标准手势特征点callback,获取标准手势特征点数据 测试验证标准手势特征点获取时使用 gesture keypoints
55 Stop get gesture keypoints, get IMU 停止获取标准手势特征点数据,重新开启IMU数据获取流程 测试验证获取标准手势特征点时使用 gesture keypoints
56 Stop get IMU, get gesture keypoints based on slam 停止获取IMU数据,注册标准手势基于slam带深度的特征点callback,获取标准手势基于slam带深度的特征点数据 测试验证标准手势基于slam带深度的特征点获取时使用 gesture slam keypoints
57 Stop get gesture keypoints based on slam, get IMU 停止获取标准手势基于slam带深度的特征点数据,重新开启IMU数据获取流程 测试验证获取标准手势基于slam带深度的特征点时使用 gesture slam keypoints
58 Set gesture configuration file path 停止IMU数据,设置标准手势配置文件路径 测试验证标准手势配置文件路径设置时使用 gesture path
59 Get display calibration 停止IMU数据,获取display标定参数 测试验证获取display标定参数时使用 display calibration
60 Camera on/off switch 配置fisheye,rgb,tof相机开关 测试验证相机开关时使用 camera switch
61 Start april tag detection 停止IMU数据,开启April-tag检测功能,获取April-tag回调数据 测试验证April-tag功能时使用 April-tag
62 Stop april tag detection, get IMU 停止April-tag检测功能,关闭April-tag回调数据,重新开启获取IMU数据流程 测试验证April-tag功能时使用 April-tag
63 Start surface callback 停止IMU数据,开启surface检测功能,获取surface回调数据 测试验证surface功能时使用 surface
64 Stop surface callback, get IMU 停止surface检测功能,关闭surface回调数据,重新开启获取IMU数据流程 测试验证surface功能时使用 surface
65 Start event callback 停止IMU数据,开启event回调,获取event回调信息 测试验证event回调数据时使用 event
66 Stop event callback, get IMU 停止event回调,重新开启获取IMU数据流程 测试验证event回调数据时使用 event
67 Stop get IMU, start SGBM 停止获取IMU,启动SGBM流程获取SGBM数据 测试验证SGBM相机功能时使用 SGBM
68 Stop SGBM, get IMU 停止获取SGBM数据,重新启动获取IMU数据流 测试验证SGBM相机功能时使用 SGBM
69 Stop get IMU, start get gaze data 停止获取IMU,启动眼动瞳孔流程获取眼动瞳孔数据 测试验证获取眼动瞳孔数据功能时使用 GAZE
77 Start get device status data 停止IMU数据,开启设备状态回调,获取设备状态数据 测试验证设备状态数据时使用 device status
78 Stop get device status data 停止设备状态回调,关闭获取设备状态数据 测试验证设备状态数据时使用 device status
79 Stop get IMU, switch the fisheye resolution to HIGH 关闭IMU数据,切换fisheye分辨率模式到HIGH 测试验证fisheye分辨率模式功能时使用 fisheye resolution mode
80 Stop get IMU, switch the fisheye resolution to MEDIUM 关闭IMU数据,切换fisheye分辨率模式到MEDIUM 测试验证fisheye分辨率模式功能时使用 fisheye resolution mode
81 Stop get fisheye data, get IMU 停止获取fisheye数据,重新开启获取IMU数据流程 测试fisheye数据时使用 fisheye
82 Start RGBD 停止获取IMU,启动RGBD流程获取RGBD数据 测试验证RGBD相机功能时使用 RGBD
83 Stop RGBD, get IMU 停止获取RGBD数据,重新启动获取IMU数据流 测试验证RGBD相机功能时使用 RGBD
84 Change FE framerate into 50Hz 关闭IMU数据,切换fisheye帧率到50Hz 测试验证fisheye帧率切换功能时使用 fisheye framerate
85 Change FE framerate into 60Hz 关闭IMU数据,切换fisheye帧率到60Hz 测试验证fisheye帧率切换功能时使用 fisheye framerate
0 exit program

C/C++
Xvisio SDK 文档主页