激光雷达c++SDK整合说明

·介绍

雷达c++SDK合集

·软件架构

1.  LidarMuster 为dll输出工程

2.  yd-lidar-sdk 集成ydlidar的sdk工程

3.  rp-lidar-sdk 集成rplidar的sdk工程

4. ConsoleTest 导出函数测试工程

5. pavo-lidar-sdk(8月20号继承完)

5. 后续有新雷达sdk科技继续集成.

每个雷达管理类继承ISerialManager

重写基类的onConnect、onDisconnect、startScan、grabData4个方法

onConnect:放入雷达的连接、雷达初始化、开启电机等逻辑

onDisconnect:放入停止电机、停止数据传输、释放雷达资源等逻辑

startScan:开启扫描逻辑

grabData:抓取数据逻辑

ExportLidarFunc为函数导出类

用工厂模式创建Manager

static inline ISerialManager* CreateFactory(LidarMode type) {
	switch (type)
	{
	case LidarMode::YDLidar:
		return new YDLidarManager();
	case LidarMode::RPLidar:
		return new RPLidarManager();
	case LidarMode::Pavo:
		return new PavoLidarManager();
	}
	return nullptr;
}

为了识别多个雷达同时调用,在最上层封装了一个结构体,后续方便在DLL使用中寻找对象

struct SerialData
{
	LidarMode type;

	int code;

	ISerialManager* mgr;

	bool operator== (const SerialData& other) const
	{
		return type == other.type && mgr == other.mgr;
	}
};

static std::vector<SerialData*> s_lidarMgr;

导出函数

// 外部调用创建对象并连接,并添加到容器中
_DLLEXPORT SerialData* OnConnect(LidarMode type, const char* opt_com_path, int opt_com_baudrate, int scan_mode)

// 传入创建的对象,关闭雷达、对象从容器中移除
_DLLEXPORT bool OnDisconnect(SerialData* data)

// 传入创建的对象,开启扫描
_DLLEXPORT bool StartScan(SerialData* data)

// 传入创建的对象、返回的数据对象,开启扫描
_DLLEXPORT int GrabData(SerialData* data, LidarData* lidar_s)

// 获取容器长度
_DLLEXPORT int GetVectorSize()

// 释放所有连接的设备
_DLLEXPORT int ReleaseDevices()

·使用Unity测试LidarMuster.dll

 连接雷达并开启扫描

        IntPtr SerialPtr = LidarUtility.OnConnect((int)m_LidarMode, m_COM, m_Baudrate, m_ScanMode);
        if (SerialPtr == IntPtr.Zero)
        {
            Debug.Log("SerialPtr.isError");
            return;
        }
        LidarUtility.SerialData serialData = LidarUtility.ConvertSerialData(SerialPtr);
        Debug.Log("SerialData.code:" + serialData.code);
        if (serialData.code == 0)
        {
            m_OnScan = LidarUtility.StartScan(SerialPtr);
        }

 抓取数据

        public static int GetData(IntPtr mgr, ref LidarData[] data)
        {
            GCHandle handler = GCHandle.Alloc(data, GCHandleType.Pinned);
            IntPtr structPtr = handler.AddrOfPinnedObject();
            int count = LidarUtility.GrabData(mgr, structPtr);
            handler.Free();
            return count;
        }

 最后2个雷达显示的效果图

 ·结语

 整合的过程中遇到了各种问题,还好都是链接的小问题。

最常见的就是:

error LNK2001: 无法解析的外部符号 "public: __cdecl

error C2065:未声明的标识符错误

'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

就是开发的时候要注意的是:

1.LNK2001 静态库和动态库的编译环境要一致,要么全是debug要么全是release

2.C2065  把报错的头文件放到stdAfx.h/pch.h中,加载时序的问题

3.保持C/C++->代码生成->运行库 的一致性

4.SDL 检查 选择否

​​​​​​​

猜你喜欢

转载自blog.csdn.net/flj135792468/article/details/119799856