GrabBag/Test/camera/test.cpp

301 lines
8.2 KiB
C++

#include <iostream>
#include <vector>
#include <thread>
#include <chrono>
#include <atomic>
#include <mutex>
// VzNLSDK includes
#include "../../SDK/VzNLSDK/Inc/VZNL_Common.h"
#include "../../SDK/VzNLSDK/Inc/VZNL_Types.h"
#include "../../SDK/VzNLSDK/Inc/VZNL_DetectLaser.h"
#include "../../SDK/VzNLSDK/Inc/VZNL_RGBConfig.h"
#include "../../SDK/VzNLSDK/Inc/VZNL_SwingMotor.h"
class CameraDemoTest
{
private:
VZNLHANDLE m_hDevice;
std::atomic<bool> m_bScanning;
std::atomic<int> m_nScanDataCount;
bool m_isRGBD;
public:
CameraDemoTest()
: m_hDevice(nullptr)
, m_bScanning(false)
, m_nScanDataCount(0)
, m_isRGBD(false)
{
}
~CameraDemoTest()
{
Cleanup();
}
// Initialize camera
bool InitializeCamera(bool isRGBD)
{
m_isRGBD = isRGBD;
int nErrCode = 0;
// 初始化SDK
SVzNLConfigParam sVzNlConfigParam;
sVzNlConfigParam.nDeviceTimeOut = 5000; // 5 seconds timeout
nErrCode = VzNL_Init(&sVzNlConfigParam);
// 搜索设备
VzNL_ResearchDevice(keSearchDeviceFlag_EthLaserRobotEye);
// 获取搜索到的设备
SVzNLEyeCBInfo* pCBInfo = nullptr;
int nCount = 0;
nErrCode = VzNL_GetEyeCBDeviceInfo(nullptr, &nCount);
if (0 != nErrCode)
{
return false;
}
if(0 == nCount)
{
return false;
}
pCBInfo = new SVzNLEyeCBInfo[nCount];
if (!pCBInfo) {
return false;
}
nErrCode = VzNL_GetEyeCBDeviceInfo(pCBInfo, &nCount);
if (0 != nErrCode) {
delete[] pCBInfo;
return false;
}
SVzNLOpenDeviceParam sVzNlOpenDeviceParam;
sVzNlOpenDeviceParam.eEyeResolution = keVzNLEyeResolution_Unknown;
sVzNlOpenDeviceParam.eSDKType = keSDKType_DetectLaser;
sVzNlOpenDeviceParam.bStopStream = VzTrue;
m_hDevice = VzNL_OpenDevice(&pCBInfo[0], &sVzNlOpenDeviceParam, &nErrCode);
// 清理pCBInfo数组
delete[] pCBInfo;
pCBInfo = nullptr;
if(nullptr == m_hDevice)
{
return false;
}
if(0 != nErrCode)
{
return false;
}
SVzNLEyeDeviceInfoEx m_sEeyCBDeviceInfo;
m_sEeyCBDeviceInfo.sEyeCBInfo.nSize = sizeof(SVzNLEyeDeviceInfoEx);
VzNL_GetDeviceInfo(m_hDevice, (SVzNLEyeCBInfo *)(&m_sEeyCBDeviceInfo));
VzNL_BeginDetectLaser(m_hDevice);
VzNL_EnableSwingMotor(m_hDevice, VzTrue);
SVzNLVersionInfo sVersionInfo;
VzNL_GetVersion(m_hDevice, &sVersionInfo);
std::cout << "version : " << sVersionInfo.szSDKVersion << std::endl;
// int nnnRet = VzNL_SetEthSendDataLength(m_pHandle, 1024);
// LOG_DEBUG("SenddataLen ret : %d\n", nnnRet);
//启用RGBD
int nRGBRet = VzNL_EnableRGB(m_hDevice, isRGBD ? VzTrue : VzFalse);
std::cout << "Enable RGB " << (isRGBD ? "true" : "false") << " ret : " << nRGBRet << std::endl;
// 填充
VzNL_EnableFillLaserPoint(m_hDevice, VzTrue);
VzNL_SetDeviceStatusNotifyEx(m_hDevice, StatusCallback, this);
return true;
}
// Start scanning
bool StartScanning()
{
std::cout << "\n--- Starting Scan ---" << std::endl;
if (!m_hDevice)
{
std::cout << "Error: Device not opened" << std::endl;
return false;
}
// Clear previous data
m_nScanDataCount = 0;
// Select data type based on scan mode
EVzResultDataType dataType;
dataType = m_isRGBD ? keResultDataType_PointXYZRGBA : keResultDataType_Position;
m_bScanning = true;
// Start automatic detection
int ret = VzNL_StartAutoDetectEx(m_hDevice, dataType, keFlipType_None, ScanDataCallback, this);
if (ret != 0)
{
m_bScanning = false;
std::cout << "Error: Failed to start scanning, error code: " << ret << std::endl;
return false;
}
std::cout << "✓ Scanning started, data type: " << (m_isRGBD ? "RGBD" : "Position") << std::endl;
return true;
}
// Stop scanning
bool StopScanning()
{
std::cout << "\n--- Stopping Scan ---" << std::endl;
if (!m_hDevice)
{
std::cout << "Error: Device not opened" << std::endl;
return false;
}
m_bScanning = false;
int ret = VzNL_StopAutoDetect(m_hDevice);
if (ret != 0)
{
std::cout << "Error: Failed to stop scanning, error code: " << ret << std::endl;
return false;
}
VzNL_EndDetectLaser(m_hDevice);
std::cout << "✓ Scanning stopped" << std::endl;
return true;
}
bool IsScanning()
{
return m_bScanning.load();
}
// Get scan data count
int GetScanDataCount()
{
return m_nScanDataCount.load();
}
// Cleanup resources
void Cleanup()
{
if (m_hDevice)
{
if (m_bScanning)
{
VzNL_StopAutoDetect(m_hDevice);
}
VzNL_CloseDevice(m_hDevice);
m_hDevice = nullptr;
}
// Destroy SDK
VzNL_Destroy();
}
private:
// Status callback function
static void StatusCallback(EVzDeviceWorkStatus eStatus, void* pExtData, unsigned int nDataLength, void* pParam)
{
CameraDemoTest* pThis = static_cast<CameraDemoTest*>(pParam);
if (!pThis) return;
std::cout << "Device status change: ";
switch (eStatus)
{
case keDeviceWorkStatus_Eye_Comming:
std::cout << "Eye connected" << std::endl;
break;
case keDeviceWorkStatus_Eye_Reconnect:
std::cout << "Eye reconnected" << std::endl;
break;
case keDeviceWorkStatus_Working:
std::cout << "Working" << std::endl;
break;
case keDeviceWorkStatus_Offline:
std::cout << "Offline" << std::endl;
break;
case keDeviceWorkStatus_Device_Swing_Finish:
std::cout << "Swing module completed" << std::endl;
break;
case keDeviceWorkStatus_Device_Auto_Stop:
std::cout << "Device auto stopped, total scan data: " << pThis->GetScanDataCount() << std::endl;
pThis->m_bScanning = false;
break;
default:
std::cout << "Unknown status: " << eStatus << std::endl;
break;
}
}
// Scan data callback function
static void ScanDataCallback(EVzResultDataType eDataType, SVzLaserLineData* pLaserLinePoint, void* pParam)
{
CameraDemoTest* pThis = static_cast<CameraDemoTest*>(pParam);
if (!pThis || !pLaserLinePoint) return;
// Increment data count
pThis->m_nScanDataCount++;
}
};
int main(int argc, char* argv[])
{
std::cout << "Camera Demo Test Program (Direct VzNLSDK)" << std::endl;
std::cout << "=========================================" << std::endl;
CameraDemoTest cameraTest;
// Check command line argument for RGBD mode
bool isRGBD = (argc > 1 && std::string(argv[1]) == "rgbd");
std::cout << "Scan mode: " << (isRGBD ? "RGBD" : "Position") << std::endl;
// Initialize camera
if (!cameraTest.InitializeCamera(isRGBD))
{
std::cout << "Failed to initialize camera" << std::endl;
return -1;
}
// Start scanning
if (!cameraTest.StartScanning())
{
std::cout << "Failed to start scanning" << std::endl;
return -1;
}
// Wait for scanning to complete
std::cout << "Scanning in progress..." << std::endl;
while (cameraTest.IsScanning())
{
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
// Stop scanning
cameraTest.StopScanning();
// Display final results
std::cout << "\n=== Final Results ===" << std::endl;
std::cout << "Total scan data received: " << cameraTest.GetScanDataCount() << std::endl;
std::cout << "\nAll tests completed!" << std::endl;
return 0;
}