KSJXS SDK 示例代码

版本 1.0 · 更新于 2026-10-21 · 阅读 1

基于真实接口的最小可用示例:主动采集 3D 点云、回调模式取轮廓、参数与触发配置。

以下示例使用头文件中的真实接口名(注意 KSJXS_Inital 的拼写)。

示例一:主动采集一帧 3D 点云(nMode = 1)

#include "KSJXS_Device.h"
#include <cstdio>

int main()
{
    // 1) 初始化(可选先开日志)
    KSJXS_SetLog(true, nullptr, 2);
    if (KSJXS_Inital() != KSJXS_RET_SUCCESS) {
        return -1;
    }

    // 2) 枚举设备
    KSJXS_DEVICE_INFO_LIST list{};
    if (KSJXS_EnumDevices(&list) != KSJXS_RET_SUCCESS || list.nDeviceNum == 0) {
        printf("未找到设备\n");
        KSJXS_UnInitial();
        return -1;
    }

    // 3) 创建句柄并打开设备
    void* handle = nullptr;
    KSJXS_CreateDeviceHandle(&handle, list.pDeviceInfo[0]);
    KSJXS_OpenDevice(handle);

    // 4) 先设数据格式,再取 ROI(顺序约束)
    KSJXS_SetDataFormat(handle, KSJXS_DF_NON_UNIFORM);
    int colStart = 0, rowStart = 0, colSize = 0, rowSize = 0;
    KSJXS_GetRoi(handle, &colStart, &rowStart, &colSize, &rowSize);

    // 5) 关键参数(按需)
    KSJXS_SetExposureTime(handle, 1.0f);      // 单位 ms
    KSJXS_SetYResolution(handle, 0.05f);      // 运动方向精度,单位 mm

    // 6) 主动采集模式取一帧
    KSJXS_StartAcquisition(handle, 1);
    CaptureData* data = nullptr;
    if (KSJXS_CaptureData(handle, &data) == KSJXS_RET_SUCCESS && data != nullptr) {
        // 数据格式为 KSJXS_DF_NON_UNIFORM → 解析 capPtCloud
        int nProfiles = data->capPtCloud.pParam->nPointNum;   // 单轮廓点数
        float* x = data->capPtCloud.x;
        float* z = data->capPtCloud.z;
        for (int i = 0; i < nProfiles; ++i) {
            if (x[i] <= -1000.0f) continue;   // 跳过无效点
            // ... 使用 (x[i], z[i]) 做测量 ...
        }
        KSJXS_ReleaseData(handle, data);      // 必须释放
    } else {
        printf("采集失败,错误码 %d\n", data ? KSJXS_RET_FAIL : KSJXS_RET_TIMEOUT);
    }
    KSJXS_StopAcquisition(handle);

    // 7) 收尾
    KSJXS_CloseDevice(handle);
    KSJXS_DestroyDeviceHandle(handle);
    KSJXS_UnInitial();
    return 0;
}

示例二:回调模式取轮廓

// 回调:在 SDK 线程被调用
static void __stdcall OnProfile(void* handle, float* x, float* z,
                                KSJXS_PROFILE_DATA_PARAM* pParam, void* lpContext)
{
    // pParam->nProfileStatus:0 正常轮廓,1 本帧最后一根,-1 无效轮廓(本帧结束)
    for (int i = 0; i < pParam->nPointNum; ++i) {
        if (x[i] <= -1000.0f) continue;   // 无效点
        // ... 处理 (x[i], z[i]) ...
    }
}

// 注册 + 启动(nMode = 0,默认回调模式)
KSJXS_SetDataFormat(handle, KSJXS_DF_NON_UNIFORM);
KSJXS_RegisterProfileCB(handle, OnProfile, nullptr);
KSJXS_StartAcquisition(handle);       // 等价于 nMode = 0

示例三:内触发 + 采集轮廓数配置

// 轮廓触发:内触发,按"运动速度 / 轮廓间隔"计算频率
//   物体 Y 向速度 ν = 100 mm/s,轮廓间隔 Δy = 0.05 mm
//   内触发频率 f = ν / Δy = 2000 Hz
KSJXS_SetDataTriggerMode(handle, KSJXS_DTM_INTERNAL);
KSJXS_SetDataTriggerInternalFrequency(handle, 2000.0f);

// 一次 3D 帧需采集的轮廓数 N = y / Δy(y 为物体 Y 向尺寸)
KSJXS_SetMaxNumberOfProfilesToCapture(handle, 200);

// 运动方向精度 = ν / f = 0.05 mm
KSJXS_SetYResolution(handle, 0.05f);

示例四:保存点云为 PCD

// 拥有 x / y / z 三块连续数据(长度均为 nWidth*nHeight)时
KSJXS_HelperSaveToPCD(nWidth, nHeight, pfX, pfY, pfZ, "cloud.pcd");

更多示例见 SDK 安装包 samples/ 目录。