[硬件]Urg_viewer数据读取
1.个人资源索引2.SLAM学习笔记(1)基本概念3.SLAM学习笔记(2)SLAM算法4.[ROS]2 尝试编译OrbSLAM5.[ROS]1 小乌龟6.SLAM最近的工作7.SLAM学习笔记(3)相关概念8.[SLAM]2D激光线特征提取9.[SLAM] GMapping SLAM源码阅读(草稿)10.[QGLViewer]First Demo11.SLAM数据集12.[SLAM]2D激光扫描匹配方法13.[g2o]一个备忘14.[ROS] slam_gmapping15.[ROS]3 Linux编程练习16.Linux学习和ROS安装(1)17.小豆包的学习之旅:机器人定位18.小豆包的学习之旅:传感器观测模型19.Kinect2.0相机标定20.小豆包的学习之旅:里程计运动模型21.小豆包的学习之旅:入门篇22.Kinect2.0点云数据获取23.[硬件]Robot运动控制
24.[硬件]Urg_viewer数据读取
25.[硬件]三维点云数据获取26.Kinect2.0获取数据27.ndt histogram_direction28.rplidar & hector slam without odometry29.rplidar测试30.[原创]NDT方法在SLAM中的应用31.[SLAM]Karto SLAM算法学习(草稿)32.ROS学习备忘33.[ROS]激光驱动安装34.OrbSLAM2采集点云数据35.Cartographer源码阅读(8):imu_tracker36.[硬件]点云数据采集237.Cartographer源码阅读(9):图优化的前端——闭环检测38.Cartographer源码阅读(7):轨迹推算和位姿推算的原理39.Ethzasl MSF源码阅读(3):MSF_Core和PoseMeasurement40.Ethzasl MSF源码阅读(2):百川汇海41.Ethzasl MSF源码阅读(1):程序入口和主题订阅42.Cartographer源码阅读(6):LocalTrajectoryBuilder和PoseExtrapolator43.Cartographer源码阅读(5):PoseGraph位姿图44.Cartographer源码阅读(4):Node和MapBuilder对象245.Cartographer源码阅读(3):程序逻辑结构46.Cartographer源码阅读(2):Node和MapBuilder对象47.Cartographer源码阅读(1):程序入口48.实时Cartographer测试(1) - rplidar49.Cartographer安装50.ROS安装(2)51.[ROS]一些传感器数据读取融合问题的思考52.小豆包的学习之旅:占用概率栅格地图和cost-map53.小豆包的学习之旅:开发记录54.[概述]移动机器人自主探索55.MRPT编译首先,数据读取部分开启了两个后台线程,一个负责串口的连接和测试;一个负责数据的接收。
几个基本概念:
- 建立连接和关闭连接。
- 开始记录和停止记录。
- 保存CSV文件。
1.查找COM端口,Urg_driver::find_ports调用Serial::find_ports()方法。

1 std::vector<std::string> Serial::find_ports(void) 2 { 3 //4D36E978-E325-11CE-BFC1-08002BE10318 4 GUID GUID_DEVINTERFACE_COM_DEVICE = { 5 0x4D36E978L, 0xE325, 0x11CE, 6 {0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18 } 7 }; 8 9 HDEVINFO hdi = SetupDiGetClassDevs(&GUID_DEVINTERFACE_COM_DEVICE, 0, 0, 10 DIGCF_PRESENT | DIGCF_INTERFACEDEVICE); 11 12 vector<string> found_ports; 13 if (hdi == INVALID_HANDLE_VALUE) { 14 return found_ports; 15 } 16 17 SP_DEVINFO_DATA sDevInfo; 18 sDevInfo.cbSize = sizeof(SP_DEVINFO_DATA); 19 for (int i = 0; SetupDiEnumDeviceInfo(hdi, i, &sDevInfo); ++i){ 20 enum { 21 BufferSize = 256, 22 ComNameLengthMax = 7, 23 }; 24 char buffer[BufferSize + 1]; 25 DWORD dwRegType; 26 DWORD dwSize; 27 28 SetupDiGetDeviceRegistryPropertyA(hdi, &sDevInfo, SPDRP_FRIENDLYNAME, 29 &dwRegType, (BYTE*)buffer, BufferSize, 30 &dwSize); 31 int n = (int)strlen(buffer); 32 if (n < ComNameLengthMax) { 33 continue; 34 } 35 36 char* p = strrchr(buffer, ')'); 37 if (p) { 38 *p = '\0'; 39 } 40 41 p = strstr(&buffer[n - ComNameLengthMax], "COM"); 42 if (! p) { 43 continue; 44 } 45 46 found_ports.push_back(p); 47 } 48 SetupDiDestroyDeviceInfoList(hdi); 49 50 return found_ports; 51 }
2.关于记录Record和停止记录的逻辑:
开启记录是将接收线程start,停止采集是加锁之后设置一个状态变量,让接收线程退出。等待接收线程退出后,关闭URG连接,保存记录的文件。

1 //开始记录数据 2 bool start_recording(void) 3 { 4 QString save_timing = QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"); 5 recording_file_ = "received_" + save_timing + ".txt"; 6 7 original_connection_ = urg_.connection(); 8 //打开记录器 9 if (!receive_recorder_.open(original_connection_,recording_file_.toStdString().c_str())) 10 { 11 error_message_ = receive_recorder_.what(); 12 return false; 13 } 14 //打开URG 15 if (!urg_.open(&receive_recorder_)) { 16 return false; 17 } 18 19 receive_thread_.set_mode(Receive_thread::Recording); 20 21 start_receiving();//开始接收数据 22 23 return true; 24 } 25 //停止记录数据 26 void stop_recording(void) 27 { 28 stop_measurement(); 29 urg_.close(); 30 receive_recorder_.close(); 31 32 delete original_connection_; 33 original_connection_ = NULL; 34 35 recorder_widget_.stop_recording(); 36 receive_thread_.set_mode(Receive_thread::Normal); 37 }
3.需要思考和解决的问题:
- 点击开始采集数据,建立文件,停止采集保存文件。
- 保存行列号,形成Organized有序点云,这个要优先实现,保证后面的数据校正!
- 负责连接的线程是一直运行的吗?如何与负责数据接收的线程产生通讯和交互?(分析:连接线程的Run函数执行完毕,应该线程就退出了,因此没有与数据接收线程进行交互,接收线程自己会在中途断开激光的情况下报错。)
- Win7下运行能够发现端口号,但是同样的代码在Win10下发现不了端口号?
作者:太一吾鱼水
文章未经说明均属原创,学习笔记可能有大段的引用,一般会注明参考文献。
欢迎大家留言交流,转载请注明出处。
合集:
SLAM
分类:
Robot & SLAM
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2014-03-14 [.Net]System.OutOfMemoryException异常
2012-03-14 PetShop项目学习笔记(二)