·介绍
雷达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 检查 选择否