C/C++
Xvisio SDK 文档主页

all_stream


1 概述

all_stream 示例演示了 Xvisio 设备和对应 SDK API 的所有基本功能,提供了执行功能对应的示例代码。

2 构建和运行

2.1 Linux/Ubuntu

2.1.1 Cmake 构建
  1. 首先需要在 Linux/Ubuntu 主机上安装 Xvisio SDK,可以参考 SDK 安装指南
  2. 启动终端并导航到 all_stream 安装路径 "/usr/share/xvsdk/all_stream" ,或者复制 "/usr/share/xvsdk/all_stream" 到工作目录后导航到“all_stream"目录。
    cp -r /usr/share/xvsdk/all_stream <path_to_work>
    cd <path_to_work>/all_stream
  3. Cmake生成 Makefile
    mkdir build
    cd build
    cmake ..
  4. 构建
    make
    构建成功会生成名称叫‘all_stream’的可执行二进制程序。
2.1.2 运行
  1. 使用 USB 线连接 Xvisio 设备和 Ubuntu 主机。
  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>/all_stream/build 目录
    ./all_stream
    执行这一步前需要确保程序已成功构建并生成了‘all_stream’的可执行二进制程序。
    打开成功后,会显示Xvisio 设备支持的所有功能画面。
    image

2.2 Windows10/11

2.2.1 构建
  1. 首先需要在 Windows 主机上安装 Xvisio SDK,可以参考 SDK 安装指南
  2. 安装 SDK 成功后,进入安装目录里的 all_stream 示例目录,例如:C:\Program Files\xvsdk\samples\all_stream 。
  3. visual studio 编译
  1. cmake 生成 sln 文件
  • 启动 windows powershell 工具并导航到安装目录下 all_stream 目录。
  • 根据当前的 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
  • all_stream 目录里会生成 all_stream.sln 文件
  • 使用 visual studio 打开 all_stream.sln
  • 构建(生成) 解决方案中 all_stream 项目,构建成功会在对应目录中生成 all_stream.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 目录,输入程序名称并回车:
    ./all_stream.exe
    打开成功后,会显示Xvisio 设备支持的所有功能画面。
    image

3 代码介绍

3.1 目录

平台 目录
Windows 安装目录下 samples\all_stream 目录,例如:C:\Program Files\xvsdk\samples\all_stream\
Linux/Ubuntu /usr/share/xvsdk/all_stream/

3.2 文件

文件 描述
all_stream.cpp all_stream 主要文件
fps_count.hpp 计算帧率的类实现文件
raw2opencv.cpp 依赖的opencv实现文件
CMakeLists.txt Cmake 工程文件(Android 平台无效)

3.3 代码解析和介绍

all_stream 文件 main(....) 函数为入口函数:

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

enableDevMap控制all_stream需要启用的功能:

static std::map<std::string,int> enableDevMap;
enableDevMap["rgb"] = true;
enableDevMap["tof"]= true;
enableDevMap["fisheye"] = true;
enableDevMap["sgbm"] = true;
enableDevMap["slam"] = true;
enableDevMap["slam_edge"] = true;
enableDevMap["imu"] = true;
enableDevMap["eyetracking"] = true;
enableDevMap["sync"] = false;
enableDevMap["dewarp"] = true;
enableDevMap["VGA"] = true;
enableDevMap["720P"] = false;
enableDevMap["tof_mode"] = 3;//default lablize sf
enableDevMap["tof_point_cloud"] = false;
enableDevMap["log"]=true;
enableDevMap["ir"]=true;

可以通过调整运行时参数来设置设备描述信息,控制启动或关闭某项功能,详细描述见第4节( 字符控制描述):

if (argc >1 && *argv[1]!='\0') {
  std::ifstream ifs( argv[1] );
  if( !ifs.is_open() ){
    std::cerr << "Failed to open: " << argv[1] << std::endl;
  }
  else
  {
    std::stringstream fbuf;
    fbuf << ifs.rdbuf();
    json = fbuf.str();
  }
}

if (argc == 3)
{
  std::string enableDevStr(argv[2]);
  enableDevStr+=" ";
  int index,index2;
  while(true)
  {
    index = enableDevStr.find(' ');
    if(index == std::string::npos)
    {
      break;
    }
    auto one = enableDevStr.substr(0,index);
    index2 = one.find('':'');
    auto key = one.substr(0,index2);
    auto value = one.substr(index2+1,one.size()-index2-1)=="1"true:false;
    enableDevStr = enableDevStr.substr(index+1);
    std::cout<<key<<" : "<<value<<std::endl;
    enableDevMap[key] = value;
  }
}

使用样例:

./all_stream test.json "rgb:0 tof:1 tof_mode:3"

all_stream中的while循环来等待需要输入的控制指令,详细描述见第4节( 字符控制描述):

while(true)
{
  if(res == xv::FisheyeCamerasEx::ResolutionMode::MEDIUM)
    std::cerr << "ENTER 'f' to switch FE to HIGH res" << std::endl;
  else
    std::cerr << "ENTER 'f' to switch FE to MEDIUM res" << std::endl;
  if(sgbm_ctl == true){
    std::cerr << "ENTER 's' to stop SGBM to res" << std::endl;
    std::cerr << "ENTER 'r' to modify SGBM resolution" << std::endl;
  }
  else{
    std::cerr << "ENTER 's' to start SGBM to res" << std::endl;
  }
  std::cerr << "ENTER 'q' to exit" << std::endl;
  std::cin >> getkey;
  //getkey = std::cin.get();
  if(getkey == "f")
  {
    res = (res == xv::FisheyeCamerasEx::ResolutionMode::MEDIUM)?(xv::FisheyeCamerasEx::ResolutionMode::HIGH):(xv::FisheyeCamerasEx::ResolutionMode::MEDIUM);
    std::cout<<"device->fisheyeCameras())->setResolutionMode:"<<static_cast<int>(res)<<std::endl;
    std::dynamic_pointer_cast<xv::FisheyeCamerasEx>(device->fisheyeCameras())->setResolutionMode(res);
  }
  else if(getkey == "s")
  {
    if(sgbm_ctl == false)
    {
      std::cout<<"device->sgbmCamera()->start(global_config)"<<static_cast<int>(res)<<std::endl;
      device->sgbmCamera()->start(global_config);
    }
    else
    {
      std::cout<<"device->sgbmCamera()->stop()"<<static_cast<int>(res)<<std::endl;
      device->sgbmCamera()->stop();
    }
    sgbm_ctl = !sgbm_ctl;
  }
  else if(getkey == "r")
  {
    sgbmres = (sgbmres == xv::SgbmCamera::Resolution::SGBM_640x480) ?   xv::SgbmCamera::Resolution::SGBM_1280x720 :   xv::SgbmCamera::Resolution::SGBM_640x480;
    bool ret = device->sgbmCamera()->setSgbmResolution(sgbmres);
    if(ret){
      std::cout << "device->sgbmCamera()->setSgbmResolution: " << static_cast<int>(res)<<std::endl;
    }else{
      std::cout << "device->sgbmCamera()->setSgbmResolution failed"<<std::endl;
    }
  }
  else if(getkey == "q")
  {
    break;
  }
}

all_stream中的各个图像均是由OpenCV绘制,在代码中通过不同的重载函数raw_to_opencv处理不同的数据,从而绘制对应的图像。

通过OpenCV绘制Fisheye数据:

cv::Mat left;
cv::Mat right;
if (stereo) {
  auto const& leftInput = stereo->images[0];
  auto const& rightInput = stereo->images[1];
  if( leftInput.data != nullptr ){
    left = cv::Mat::zeros(leftInput.height, leftInput.width, CV_8UC1);
    std::memcpy(left.data, leftInput.data.get(), static_cast<size_t>(left.rowsleft.cols));
  }
  if( rightInput.data != nullptr ){
    right = cv::Mat::zeros(rightInput.height, rightInput.width, CV_8UC1);
    std::memcpy(right.data, rightInput.data.get(), static_cast<size_t>(right.rows
right.cols));
  }
} else {
  left = cv::Mat::zeros(400, 640, CV_8UC1);
  right = cv::Mat::zeros(400, 640, CV_8UC1);
}
cv::cvtColor(left, left, cv::COLOR_GRAY2BGR);
cv::cvtColor(right, right, cv::COLOR_GRAY2BGR);

根据特征点绘制线条:

if (keypoints) {
  const int size = 2;
  int s=0;
  for(unsigned int i=0; idescriptors[s].size; i++ ){
    auto p = keypoints->descriptors[s].keypoints.get() + i*2;
    cv::Point pt(*p, (p+1));
    cv::line(left, pt - cv::Point(size,0), pt + cv::Point(size,0),     cv::Scalar(0,0,255) );
    cv::line(left, pt - cv::Point(0,size), pt + cv::Point(0,size),   cv::Scalar(0,0,255) );
  }
  s=1;
  for(unsigned int i=0; idescriptors[s].size; i++ ){
    auto p = keypoints->descriptors[s].keypoints.get() + i
2;
    cv::Point pt(*p, *(p+1));
    cv::line(right, pt - cv::Point(size,0), pt + cv::Point(size,0),     cv::Scalar(0,0,255) );
    cv::line(right, pt - cv::Point(0,size), pt + cv::Point(0,size),     cv::Scalar(0,0,255) );
  }
}

4 字符控制描述

在all_stream启动时,可以通过设置运行时参数来设控制启动或关闭某项功能,具体描述如下:

设置参数 默认值 备注
rgb true 调整该参数决定是否开启rgb
tof true 调整该参数决定是否开启tof
fisheye true 调整该参数决定是否开启fisheye
sgbm true 调整该参数决定是否开启sgbm
slam true 调整该参数决定是否开启slam
slam_edge true 调整该参数决定是否开启Edge模式,如果为false则设置为Mixed模式
imu true 调整该参数决定是否开启imu
eyetracking true 调整该参数决定是否开启eyetracking(眼控)功能
sync false 调整该参数决定是否开启同步模式,默认为不开启
dewarp true 调整该参数决定是否开启图像畸变,默认为开启,如果使用平角镜头则可以不设置该参数
VGA true 调整该参数将fisheye相机分辨率设置为VGA(640*400)
720P false 调整该参数将fisheye相机分辨率设置为720P(1280*720)
tof_mode 3 调整该参数设置tof模式,IQMIX_DF = 0,IQMIX_SF = 1, LABELIZE_DF = 2,LABELIZE_SF = 3,M2MIX_DF = 4,M2MIX_SF = 5,默认为LABELIZE_SF模式
tof_point_cloud false 调整该参数决定是否获取tof点云数据,默认不获取
log true 调整该参数决定是否输出log
ir true 调整该参数决定是否开启Tof IR图像输出

C/C++
Xvisio SDK 文档主页

all_stream

2 构建和运行

3 代码介绍