用Rerun和C++搞定激光SLAM点云可视化:一个读取PCD和TXT路径的完整Demo

张开发
2026/4/15 19:34:29 15 分钟阅读

分享文章

用Rerun和C++搞定激光SLAM点云可视化:一个读取PCD和TXT路径的完整Demo
用Rerun和C实现激光SLAM点云与路径可视化实战指南激光SLAM技术正在机器人导航、自动驾驶等领域快速普及而高质量的可视化工具对于算法调试和效果展示至关重要。Rerun作为新兴的可视化库凭借其简洁的API和强大的3D渲染能力正成为SLAM开发者的新宠。本文将手把手教你如何用C结合Rerun实现PCD点云地图和TXT路径文件的可视化从环境搭建到代码实现提供完整的可运行Demo。1. 环境准备与项目初始化在开始编码前我们需要配置好开发环境。这个Demo需要以下核心组件PCL库用于读取和处理PCD格式的点云文件Rerun C SDK提供可视化功能CMake构建项目推荐使用Ubuntu 20.04或更高版本作为开发环境。首先安装必要的依赖sudo apt-get install libpcl-dev cmake git接下来克隆示例项目并初始化Rerun子模块git clone --recursive https://github.com/your-repo/slam-visualization-demo.git cd slam-visualization-demo mkdir build cd build cmake ..提示如果网络环境导致git clone缓慢可以尝试配置git代理或使用镜像源。2. PCD点云文件读取与处理点云是SLAM系统的核心数据之一通常以PCD格式存储。我们需要使用PCL库读取这些数据并转换为Rerun兼容的格式。2.1 读取PCD文件首先创建一个函数来加载PCD文件#include pcl/io/pcd_io.h #include pcl/point_types.h pcl::PointCloudpcl::PointXYZI::Ptr loadPCD(const std::string filename) { pcl::PointCloudpcl::PointXYZI::Ptr cloud(new pcl::PointCloudpcl::PointXYZI); if (pcl::io::loadPCDFilepcl::PointXYZI(filename, *cloud) -1) { throw std::runtime_error(Couldnt read PCD file: filename); } return cloud; }2.2 点云数据转换Rerun需要特定格式的点数据。以下是转换逻辑#include rerun.hpp std::vectorrerun::Position3D convertToRerunPoints( const pcl::PointCloudpcl::PointXYZI::Ptr cloud) { std::vectorrerun::Position3D points; points.reserve(cloud-size()); for (const auto point : *cloud) { points.emplace_back(point.x, point.y, point.z); } return points; }注意对于大型点云这种逐点转换可能消耗较多内存。实际项目中可以考虑采样或分块处理。3. 路径点文件处理与可视化SLAM系统生成的路径通常以TXT格式存储每行包含一个位姿的坐标信息。3.1 读取路径点文件#include fstream #include sstream std::vectorrerun::Position3D loadPathPoints(const std::string filename) { std::vectorrerun::Position3D points; std::ifstream file(filename); std::string line; while (std::getline(file, line)) { std::istringstream iss(line); float x, y, z; if (!(iss x y z)) { continue; // 跳过格式错误的行 } points.emplace_back(x, y, z); } return points; }3.2 路径可视化技巧为了让路径显示为连续线条我们需要将离散点转换为LineStriprerun::LineStrip3D createPathStrip( const std::vectorrerun::Position3D points) { std::vectorrerun::Position3D linePoints; linePoints.reserve(points.size()); for (const auto point : points) { linePoints.push_back(point); } return rerun::LineStrip3D(linePoints); }4. 完整可视化流程实现现在我们将所有组件整合起来创建完整的可视化流程。4.1 初始化Rerun记录器int main(int argc, char** argv) { auto rec rerun::RecordingStream(slam_visualization); rec.connect().exit_on_failure(); // 可视化点云 auto cloud loadPCD(map.pcd); auto rerunPoints convertToRerunPoints(cloud); rec.log(world/points, rerun::Points3D(rerunPoints) .with_colors({255, 0, 0, 255}) // 红色点云 ); // 可视化路径 auto pathPoints loadPathPoints(path.txt); auto pathStrip createPathStrip(pathPoints); rec.log(world/path, rerun::LineStrips3D({pathStrip}) .with_colors({0, 255, 0, 255}) // 绿色路径 ); return 0; }4.2 运行与查看结果编译并运行程序cd build make -j4 ./slam_visualizer启动Rerun查看器rerun在查看器中你将看到红色点云表示SLAM构建的地图绿色线条表示机器人的运动轨迹5. 高级技巧与性能优化5.1 点云着色策略根据点云强度信息着色可以增强可视化效果std::vectorrerun::Color colorByIntensity( const pcl::PointCloudpcl::PointXYZI::Ptr cloud) { std::vectorrerun::Color colors; colors.reserve(cloud-size()); for (const auto point : *cloud) { uint8_t intensity static_castuint8_t(point.intensity * 255); colors.emplace_back(intensity, intensity, intensity, 255); } return colors; }使用时修改日志调用rec.log(world/points, rerun::Points3D(rerunPoints) .with_colors(colorByIntensity(cloud)) );5.2 大规模点云处理对于大型点云可以考虑以下优化降采样处理pcl::VoxelGridpcl::PointXYZI voxelGrid; voxelGrid.setInputCloud(cloud); voxelGrid.setLeafSize(0.1f, 0.1f, 0.1f); // 10cm体素大小 voxelGrid.filter(*filteredCloud);分块加载与渲染size_t chunkSize 100000; // 每块10万个点 for (size_t i 0; i cloud-size(); i chunkSize) { auto end std::min(i chunkSize, cloud-size()); std::vectorrerun::Position3D chunk( rerunPoints.begin() i, rerunPoints.begin() end ); rec.log(fmt::format(world/points/chunk_{}, i/chunkSize), rerun::Points3D(chunk) ); }6. 常见问题排查在实际开发中你可能会遇到以下问题PCD文件读取失败检查文件路径是否正确确认PCL库版本与PCD文件格式兼容使用pcl::io::loadPCDFile的返回值判断具体错误Rerun连接问题确保Rerun查看器正在运行检查网络连接是否正常尝试重启Rerun服务可视化性能低下减少同时渲染的点数量关闭不必要的可视化组件升级硬件配置路径显示不连续检查TXT文件是否有空行或格式错误确认所有路径点坐标都是有效的浮点数验证LineStrip生成逻辑是否正确在实际项目中我发现最耗时的部分往往是点云数据的预处理。使用PCL的VoxelGrid滤波器进行降采样可以显著提升性能同时保持足够的地图细节。另一个实用技巧是为不同的点云层如地面、建筑物等使用不同颜色这可以通过在PCL中实现简单的点云分割来实现。

更多文章