# reconstruction **Repository Path**: fcckingflier/reconstruction ## Basic Information - **Project Name**: reconstruction - **Description**: No description available - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2020-12-29 - **Last Updated**: 2023-01-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 三维重建(输入:RGBD图片 输出:网格模型) ## 简介 3D环境中的几何与语义理解在自动机器人和情境感知增强现实中有着非常重要的作用。在自动机器人与人的交互中,人经常会给出带有语义信息的命令,例如“把桌子上的咖啡杯给我”。这个时候需要机器人理解场景中的桌子,咖啡杯,人的语义信息,同时也要知道咖啡杯的几何信息以便抓取。而神经网络由于其在视觉领域的优异表现,在这几年中越来越多的文章都会使用神经网络来解决问题。 本项目采用神经网络来检测二维平面语义信息,重建出三维的语义信息。 ## 总体设计 ![输入图片说明](./Files/图片1.png "屏幕截图.png") 1. **相机位姿追踪**:使用ORBSLAM2做初始位姿追踪获得初步结果,ICP算法获得重建用的精细位姿。 2. **全局模型整合**:根据位姿将获得的RGBD数据投影到全局模型中,将当前帧的信息整合到全局模型中,模型推理完后同样将语义分割结果传至全局模型整合算法更新模型的语义信息。 3. **模型推理**:根据构建好的模型输入数据进行模型推理。 4. **光线追踪**:获得全局模型后使用光线追踪算法可以获得当前视角下的点云和每个点对应的法线信息和语义,可以渲染出当前视角模型供用户查看。 5. **网格构造**:在结束录制以后,程序调用构造网格算法,渲染出全局模型的网格图供用户查看最终重建效果。 ## 模型结构 ![输入图片说明](./Files/deconvnet.jpg "deconvnet网络结构图.jpg") ## 原始模型 由于网上开源的模型代码无法转换为omg模型,该模型为自己实现的版本,在SceneNet数据集上训练得到,模型训练代码和推理代码在model文件夹中。 ## 图像预处理 该模型算法需要BGR格式,输入图像分辨率为224x224,并对颜色通道进行减均值。本应用图像预处理时opencv和AIPP分工处理: opencv: 1. imread读取图像数据为BGR 2. 图像缩放为:224x224 3. 输出图像数据类型为:Uint8 AIPP: 1. 颜色通道减均值 2. 图像数据类型转换:Uint8->FP32 ## 案例性能 单次处理时长 (关键帧,带重建):2 - 4 s 单次处理时长 (普通帧,只跟踪):150 ms 单次推理时长(推理):45 ms SceneNetRGBD数据集上测试rmse: 3 - 5 cm ## 案例结果图 ![输入图片说明](./Files/semanticResult.png "语义结果图.jpg") ![输入图片说明](./Files/mesh.png "网格结果图.jpg") ## 编译过程 首先在板子上编译安装orbslam2,本项目需要使用orbslam2作为前端。板上orbslam2的源码与编译过程可参考 https://gitee.com/vikizhang/samples/tree/dev/c++/contrib/VSLAM_based_smart_car_platform 然后获取本项目源码包(git 或者 通过zip下载) **git clone https://gitee.com/fcckingflier/samples/tree/master** 接下来先编译模型推理部分获得libdeconvnet.so文件,并将其放在工程根目录下 **cd deconv-inc && mkdir build** **cd build** **cmake .. && make -j7** **cp libdeconvnet.so ../** 之后开始编译重建工程 **cd .. && mkdir build** **cmake .. && make -j7** ## 运行过程 本项目需要运行两个进程:orbslam进程和重建进程,两个进程通过文件进行通信。所以运行前需要创建好通信文件夹 **cd ~ && mkdir data** **cd data && mkdir rgb** **mkdir depth && mkdir pose && mkdir result** 本项目涉及到三个设备,三个设备通过ros连接。物理层面上,atlas、树莓派小车和主机之间的通信可以通过主机端的usb网口和无线网口实现: 主机通过usb网口连接atlas,通过wifi连接树莓派小车,然后在主机端设置从usb网口到无线网口的路由转发,实现三个设备之间的通信。 实现通信以后,首先在atlas端开启orbslam2的ros版本 **rosrun ORB_SLAM2 RGBD ../Vocabulary/ORBvoc.txt ./my_camera.yaml** 然后另起一个端口,运行重建进程 **Apps/InfiniTam/InfiniTam ../my_camera.yaml ~/data/** 在主机端开启rviz就可以看到轨迹、rgb和depth信息,重建进程运行结束后,会在atlas端的~/data/result/目录生成mesh.obj,可以自行拷贝通过meshlab查看重建网格。