深度改造ORB-SLAM2:实现彩色点云地图的完整实战手册
在视觉SLAM领域,ORB-SLAM2因其出色的实时性和鲁棒性成为众多开发者的首选框架。然而,其原生版本仅提供稀疏特征点地图,对于需要高精度三维重建的场景显得力不从心。本文将带你从零开始,在Ubuntu 18.04系统中为ORB-SLAM2注入彩色稠密建图能力,打造一个既能实时显示又能保存彩色点云地图的增强版系统。
1. 环境准备与源码工程配置
1.1 系统环境检查清单
在开始前,请确保你的开发环境满足以下基础要求:
- 操作系统:Ubuntu 18.04 LTS(推荐使用原生安装而非虚拟机)
- ROS版本:Melodic(完整桌面版安装)
- 关键依赖版本:
- PCL 1.8(Ubuntu 18.04默认仓库版本)
- OpenCV 3.2.0(ROS Melodic默认版本)
- Eigen 3.3.4
- Pangolin(最新主分支)
验证环境完整性的快速命令:
bash复制# 检查PCL版本
pkg-config --modversion pcl_common
# 检查OpenCV版本
pkg-config --modversion opencv
# 检查Eigen版本
cat /usr/include/eigen3/Eigen/src/Core/util/Macros.h | grep VERSION
1.2 源码获取与工程结构优化
不同于基础ORB-SLAM2,我们需要使用支持点云地图的修改版:
bash复制cd ~/catkin_ws/src
git clone https://github.com/xxx/ORBSLAM2_with_pointcloud_map.git
mv ORBSLAM2_with_pointcloud_map ORB_SLAM2_ColorMap
工程目录结构调整建议:
code复制ORB_SLAM2_ColorMap/
├── Vocabulary/ # ORB词袋文件
├── Thirdparty/ # 第三方依赖
├── Examples/ # 示例代码
├── src/ # 核心源码
│ ├── PointCloudMapping.cc # 点云地图实现
│ └── Tracking.cc # 跟踪线程修改
├── include/ # 头文件
├── build.sh # 编译脚本
└── CMakeLists.txt # 构建配置
提示:建议在
/opt目录下创建符号链接,避免后续ROS路径冲突:bash复制sudo ln -s ~/catkin_ws/src/ORB_SLAM2_ColorMap /opt/ORB_SLAM2_CM
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 关键代码修改与彩色地图实现
2.1 图像数据通道扩展
原始ORB-SLAM2仅处理灰度图像,我们需要扩展RGB通道支持:
- 头文件修改 (
include/Tracking.h):
cpp复制// 在Frame类定义附近添加
public:
cv::Mat mImRGB; // 新增RGB图像成员
cv::Mat mImGray;
cv::Mat mImDepth;
- 图像采集逻辑改造 (
src/Tracking.cc):
cpp复制cv::Mat Tracking::GrabImageRGBD(const cv::Mat &imRGB, const cv::Mat &imD, double timestamp)
{
mImRGB = imRGB.clone(); // 保留彩色图像
cvtColor(imRGB, mImGray, CV_RGB2GRAY);
mImDepth = imD;
// ...其余原有逻辑...
}
2.2 点云生成算法升级
修改PointCloudMapping.cc实现彩色点云生成:
cpp复制PointCloud::Ptr generatePointCloud(KeyFrame* kf, cv::Mat& color, cv::Mat& depth)
{
PointCloud::Ptr cloud(new PointCloud);
for(int v=0; v<depth.rows; v+=3) { // 降采样提高效率
for(int u=0; u<depth.cols; u+=3) {
float d = depth.ptr<float>(v)[u];
if(d < 0.01 || d>5.0) continue;
PointT p;
p.z = d;
p.x = (u - cx) * p.z / fx;
p.y = (v - cy) * p.z / fy;
// 添加RGB颜色信息
p.b = color.ptr<uchar>(v)[u*3];
p.g = color.ptr<uchar>(v)[u*3+1];
p.r = color.ptr<uchar>(v)[u*3+2];
cloud->points.push_back(p);
}
}
return cloud;
}
3. PCL库深度适配与编译优化
3.1 版本兼容性解决方案
Ubuntu 18.04默认的PCL 1.8与部分代码可能存在兼容性问题,推荐以下配置:
cmake复制# 修改CMakeLists.txt中的PCL配置
find_package(PCL 1.8 REQUIRED COMPONENTS common io)
include_directories(
${PCL_INCLUDE_DIRS}
/usr/include/eigen3 # 显式指定Eigen路径
)
常见链接错误处理方案:
| 错误类型 | 解决方案 | 验证命令 |
|---|---|---|
| undefined pcl::io | 添加pcl_io链接库 |
`ldconfig -p |
| boost system缺失 | 显式链接boost_system | dpkg -L libboost-system-dev |
| VTK相关错误 | 安装兼容版本 | sudo apt install libvtk6.3 |
3.2 编译脚本增强
改造build.sh实现自动化依赖检查:
bash复制#!/bin/bash
# 依赖检查函数
check_dependency() {
if ! dpkg -s "$1" >/dev/null 2>&1; then
echo "安装缺失依赖: $1"
sudo apt-get install -y "$1"
fi
}
# 检查基础依赖
check_dependency libboost-all-dev
check_dependency libpcl-dev
check_dependency libeigen3-dev
# 清理历史构建
rm -rf build
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)
4. 实战测试与性能调优
4.1 TUM数据集测试流程
- 数据准备与关联文件生成:
bash复制python associate.py rgb.txt depth.txt > associations.txt
- 启动带彩色点云的SLAM系统:
bash复制./rgbd_tum Vocabulary/ORBvoc.txt \
Examples/RGB-D/TUM1.yaml \
/path/to/rgbd_dataset_freiburg1_desk \
Examples/RGB-D/associations/fr1_desk.txt \
--pointcloud-size 0.01 # 点云降采样参数
关键参数优化建议:
| 参数 | 推荐值 | 作用 |
|---|---|---|
| --pointcloud-size | 0.01-0.05 | 控制点云密度 |
| --octree-resolution | 0.05 | 八叉树压缩精度 |
| --max-keyframes | 100 | 保留的关键帧数量 |
4.2 实时可视化技巧
在PointCloudMapping.cc中添加可视化线程:
cpp复制void PointCloudMapping::viewer()
{
pcl::visualization::CloudViewer viewer("ORB-SLAM2 PointCloud");
while(1) {
if(updateCloud) {
boost::mutex::scoped_lock lock(mtx);
viewer.showCloud(globalMap);
updateCloud = false;
}
usleep(5000);
}
}
4.3 点云地图保存与后处理
扩展保存功能支持多种格式:
cpp复制void saveMap(const std::string& filename)
{
std::string ext = filename.substr(filename.find_last_of(".")+1);
if(ext == "pcd") {
pcl::io::savePCDFileBinary(filename, *globalMap);
}
else if(ext == "ply") {
pcl::PLYWriter writer;
writer.write(filename, *globalMap, true);
}
// 可扩展其他格式...
}
点云后处理命令示例:
bash复制# 统计离群点移除
pcl_outlier_removal input.pcd output.pcd -method statistical -mean_k 50 -std_dev 1.0
# 体素网格降采样
pcl_voxel_grid input.pcd output.pcd -leaf 0.01,0.01,0.01
5. ROS集成与工程化部署
5.1 创建ROS功能包
bash复制catkin_create_pkg orb_slam2_colormap roscpp pcl_conversions
5.2 修改CMakeLists关键配置
cmake复制# 在ORB_SLAM2_ColorMap/Examples/ROS/ORB_SLAM2/CMakeLists.txt中添加:
find_package(catkin REQUIRED COMPONENTS
roscpp
pcl_ros
pcl_conversions
)
include_directories(
${catkin_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
add_executable(rgbd_ros src/ros_rgbd.cc)
target_link_libraries(rgbd_ros
${PROJECT_NAME}
${catkin_LIBRARIES}
${PCL_LIBRARIES}
-lboost_system
)
5.3 启动文件配置示例
创建launch/orb_slam2_rgbd.launch:
xml复制<launch>
<node pkg="orb_slam2_colormap" type="rgbd_ros" name="orb_slam2" output="screen">
<param name="vocabulary_path" value="$(find orb_slam2_colormap)/Vocabulary/ORBvoc.txt"/>
<param name="settings_path" value="$(find orb_slam2_colormap)/Examples/RGB-D/TUM1.yaml"/>
<remap from="/camera/rgb/image_raw" to="/rgb/image_raw"/>
<remap from="/camera/depth_registered/image_raw" to="/depth/image_raw"/>
</node>
<node pkg="rviz" type="rviz" name="rviz" args="-d $(find orb_slam2_colormap)/rviz/colormap.rviz"/>
</launch>
6. 高级功能扩展
6.1 动态点云更新策略
在PointCloudMapping.h中添加智能更新机制:
cpp复制class PointCloudMapping {
private:
pcl::octree::OctreePointCloudSearch<PointT>::Ptr octree;
float resolution = 0.05f;
public:
void updateOctree() {
octree->setInputCloud(globalMap);
octree->addPointsFromInputCloud();
}
void filterRedundantPoints(PointCloud::Ptr newCloud) {
std::vector<int> indices;
for(auto& p : newCloud->points) {
if(!octree->isVoxelOccupiedAtPoint(p)) {
globalMap->points.push_back(p);
}
}
}
};
6.2 多传感器融合接口
扩展支持IMU和RGB-D同步:
cpp复制void Tracking::GrabSensorData(const sensor_msgs::ImageConstPtr& rgb_msg,
const sensor_msgs::ImageConstPtr& depth_msg,
const sensor_msgs::ImuConstPtr& imu_msg)
{
// 图像数据转换
cv_bridge::CvImageConstPtr cv_ptrRGB = cv_bridge::toCvShare(rgb_msg);
cv_bridge::CvImageConstPtr cv_ptrD = cv_bridge::toCvShare(depth_msg);
// IMU数据处理
Vector3f acc(imu_msg->linear_acceleration.x,
imu_msg->linear_acceleration.y,
imu_msg->linear_acceleration.z);
Vector3f gyr(imu_msg->angular_velocity.x,
imu_msg->angular_velocity.y,
imyu_msg->angular_velocity.z);
// 调用跟踪算法
TrackRGBD(cv_ptrRGB->image, cv_ptrD->image, acc, gyr, cv_ptrRGB->header.stamp.toSec());
}
在实际部署中,我们发现将点云分辨率设置为0.03m、关键帧间隔设为0.3m时,能在建图精度和系统性能间取得最佳平衡。对于需要长时间运行的场景,建议启用八叉树压缩功能,可将内存占用降低60%以上。
