·前言
根据之前研究思岚Ax系列雷达和YDLIDAR G4雷达的相关思路....
现在研究各个雷达厂家的c++sdk越来越得心应手了
今天我们拿星秒来学习
(我隐约记得好像可以对标北阳URG)
我们看下官方的参数:
来看看长啥模样
玩过北阳雷达的都知道,是否感jio很眼熟^_^
·下载
下载包:
Pavoview1.2.1.12.rar =>官方调试工具
pavo_ros2.0.5.rar =>官方机器人相关SDK
pavo_sdk2.0.6.rar =>官方c++SDK
开发之前先看sdk内部的Pavo SDK编程指南-V2.0.6.pdf
我们先解读下这篇指南
· SDK编程指南注意事项
(1)需要配置boost1.76.0库,自行百度配置
编译失败,注意下你的运行库MT还是MD,需要保持一致,boost库是static还是shared的
b2 stage --toolset=msvc-14.2 --without-graph --without-graph_parallel --stagedir="F:\boost_1_76_0_mtd_lib\build\lib" link=static runtime-link=static runtime-link=static threading=multi debug release
runtimelink=static ==>MT库
runtimelink=shared ==>MD库
(2)雷达被动上传数据模式,指的是在上位机和雷达能进行网络正常通信的情况下,由上位机根据雷达 IP 打开雷达,直接发送数据请求,从而获取雷达数据。
1.知晓雷达配置界面中的 PavoIP、PavoPort 信息
2.保证雷达与上位机能进行正常网络通信
(3)雷达主动上传数据模式,指的是根据雷达中关于 DestIP 和 DestPort 的配置,设置与雷达相连的网口 IP,由上位机根据配置界面中 DestIP 和 DestPort,打开接受数据的端口,根据雷达 IP 打开雷达,从 而获取雷达主动上传数据。
1. 知晓雷达配置界面中的 PavoIP、PavoPort、DestIP、DestPort 信息
2. 设置与雷达相连的网卡 IP 为配置界面中的 DestIP
3. 根据雷达配置界面中的 DestIP 和 DestPort,设置接受数据的端口
(4)工程需引用sdk源码
./include
./src
(5) 新建静态库(.lib)工程,导入相对应的sdk文件
· 测试代码
int main()
{
pavo_driver* driver = new pavo_driver();
std::string ip;
printf("输入IP(10.10.10.100):");
std::cin >> ip;
int port;
printf("输入端口(2368):");
std::cin >> port;
bool isConnect = false;
bool isOk = false;
try
{
isConnect = driver->pavo_open(ip, port);
isOk = true;
}
catch (pavo_exception& e)
{
printf(e.what());
isOk = false;
}
if (isConnect && isOk) {
std::cout << "雷达连接成功" << std::endl;
device_config(driver);
enable_data(driver, true);
enable_motor(driver, true);
set_motor_speed(driver);
set_ladar_mode(driver, pavo_mode_t::Normal);
while (isConnect) {
int time_out = 100;
std::vector<pavo_response_scan_t> buffer;
if (driver->get_scanned_data(buffer, time_out)) {
size_t count = buffer.size();
for (int pos = 0; pos < (int)count; ++pos) {
std::cout << "角度:" << buffer[pos].angle << "距离:" << buffer[pos].distance << "强度:" << buffer[pos].intensity << std::endl;
}
}
else {
fprintf(stderr, "Failed to get Lidar Data\n");
fflush(stderr);
}
}
}
else {
if (isOk) {
std::string ok_str = get_error_code(driver);
std::cout << ok_str << std::endl;
}
else {
std::cout << "传参错误,连接失败!" << std::endl;
}
}
if (isOk) {
enable_data(driver, false);
enable_motor(driver, false);
driver->pavo_close();
delete driver;
}
std::cout << "ok!" << std::endl;
}
2021年9月7号更新:
使用sdk给出的平面坐标更加方便快捷,不用自己去转笛卡尔坐标了
// 使用平面坐标
std::vector<pavo_response_pcd_t> buffer;
if (lidar_drv->get_scanned_data(buffer)) {
size_t count = buffer.size();
for (int pos = 0; pos < (int)count; ++pos) {
ptr[pos].angle = -buffer[pos].x * 0.002f;
ptr[pos].distant = -buffer[pos].y * 0.002f;
ptr[pos].quality = (unsigned int)buffer[pos].intensity;
}
return count;
}
· C++动态库(.dll)
参照Unity C#调用RPLidar的C++动态库(.dll)文件(2)_欲望如海水,越喝越渴。-CSDN博客
1.新建管理类代码
2.定义 DLL 应用程序的导出函数
dll载入到你的引擎中,愉快的使用吧!