跳转至

CaptureAndConvertToPCLType

采集点云并转换为 PCL 格式。

#include <RVC/RVC.h>

#include <iostream>

#include "IO/SavePointMap.h"

// PCL
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

static pcl::PointCloud<pcl::PointXYZ>::Ptr PointMap2CloudPoint(RVC::PointMap &pm) {
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
    cloud->height = pm.GetSize().height;
    cloud->width = pm.GetSize().width;
    cloud->is_dense = false;
    cloud->resize(cloud->height * cloud->width);
    const unsigned int pm_sz = cloud->height * cloud->width;
    const double *pm_data = pm.GetPointDataPtr();
    for (int i = 0; i < pm_sz; i++, pm_data += 3) {
        cloud->points[i].x = pm_data[0];
        cloud->points[i].y = pm_data[1];
        cloud->points[i].z = pm_data[2];
    }
    return cloud;
}

int main(int argc, char **argv) {
    // Initialize RVC X system
    RVC::SystemInit();

    // Scan all RVC X Camera devices
    RVC::Device devices[10];
    size_t actual_size = 0;
    SystemListDevices(devices, 10, &actual_size, RVC::SystemListDeviceType::All);

    // Find whether any RVC X Camera is connected or not
    if (actual_size == 0) {
        std::cout << "Can not find any RVC X Camera!" << std::endl;
        return -1;
    }

    // Create a RVC X Camera and choose use left side camera
    RVC::X1 x1 = RVC::X1::Create(devices[0], RVC::CameraID_Left);

    // Open RVC X Camera
    x1.Open();

    // Test RVC X Camera is opened or not
    if (!x1.IsOpen()) {
        std::cout << "RVC X Camera is not opened!" << std::endl;
        RVC::X1::Destroy(x1);
        RVC::SystemShutdown();
        return 1;
    }

    // Capture a point map and a image (default can be x1.Capture();)
    if (x1.Capture() == true) {
        std::cout << "RVC X Camera capture successed!" << std::endl;
        // Get point map data (m)
        RVC::PointMap pm = x1.GetPointMap();
        pcl::PointCloud<pcl::PointXYZ>::Ptr cloud = PointMap2CloudPoint(pm);

        const double *pm_data = pm.GetPointDataPtr();

        const size_t n_pts = pm.GetSize().width * pm.GetSize().height;
        const size_t step = n_pts / 10000;  // print 10000 point

        for (size_t i = 0; i < n_pts; i += step) {
            printf("index: %d RVC::PointMap: (%.6f, %.6f, %.6f), pcd::PointCloud: (%.6f, %.6f, %.6f)\n", i,
                   pm_data[i * 3], pm_data[i * 3 + 1], pm_data[i * 3 + 2], cloud->points[i].x, cloud->points[i].y,
                   cloud->points[i].z);
        }

    } else {
        std::cout << RVC::GetLastErrorMessage() << std::endl;
        std::cout << "RVC X Camera capture failed!" << std::endl;
    }

    // Close RVC X Camera
    x1.Close();

    // Destroy RVC X Camera
    RVC::X1::Destroy(x1);

    // Shut Down RVC X System
    RVC::SystemShutdown();
    return 0;
}