本文档分析并尝试理解现有 点云生成代码 的逻辑与步骤,并在每一版本后提出可优化的点与反思。

2024.10.22


1. 逻辑梳理

调用core_cloud.cpp文件的scan_cloud函数,该函数通过:

  1. 调用eki→Write()函数控制机械臂运动;

  2. 调用eki→Getposition()函数记录拍摄图像时相机的姿态;

  3. 调用camera→GetImage()函数拍摄多张图像;

  4. 调用point_cloud.cpp文件中的getCloud函数,得到最终的点云。其中具体操作为:

    1. 循环遍历获取拍摄得到的图像与拍摄位姿;
    2. 调用point_cloud.cpp文件的get_2d_points()函数获取得到一个线条std::vector<LinePoint2D<float>> pointSet;
    3. point_cloud.cpp文件的get_3d_points()函数将2D线段转变为3D点云;
    4. 将一条点云的3D点拼接到总点云上。

    根据您提供的信息,我可以为您总结一个点云生成的流程图如下:

    graph TD
        A[开始] --> B[调用scan_cloud函数]
        B --> C[1.控制机械臂运动]
        B --> D[2.记录相机姿态]
        B --> E[3.拍摄多张图像]
        B --> F[4.0 调用getCloud函数]
        F --> G[4.1 循环遍历图像和姿态]
        G --> H[4.2 获取2D点集]
        H --> I[4.3 转换为3D点云]
        I --> J[4.4 拼接到总点云]
        J --> K[结束]
    
        C -->|eki→Write| B
        D -->|eki→Getposition| B
        E -->|camera→GetImage| B
        H -->|get_2d_points| I
        I -->|get_3d_points| J
    

2. 可优化事项

2.1 Get2dCloud可以进一步优化

get_2d_points 中使用更高效的算法来提取特征点,例如利用图像金字塔或其他加速特征检测方法。

2.2 由于应用环境特性,可将捕捉图像进行预处理

将图像上下部分置0,因为激光图像上下部分为噪音

2.3 考虑并行处理

使用多线程或并行处理库(如 OpenMP 或 TBB)来同时处理多个图像和点云转换,减少处理时间。

2.4 拍照的逻辑有问题