ORB_SLAM2带回环的稠密建图(包括自己数据集的采集)

news/2024/11/29 6:34:25/

稠密建图

按照下面的网站进行安装

https://github.com/xiaobainixi/ORB-SLAM2_RGBD_DENSE_MAP

遇到的问题

Eigen版本

Eigen库的版本要求为3.1.0。可以在usr/include中安装两个版本的EIgen,使用那个用哪个。具体步骤参考

https://blog.csdn.net/weixin_43828675/article/details/118660322?spm=1001.2014.3001.5501

读取字典时,报错:段错误(核心已存储)

修改build.sh为

echo "Configuring and building Thirdparty/DBoW2 ..."cd Thirdparty/DBoW2
mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8cd ../../g2oecho "Configuring and building Thirdparty/g2o ..."mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8cd ../../../echo "Uncompress vocabulary ..."cd Vocabulary
tar -xf ORBvoc.txt.tar.gz
cd ..echo "Configuring and building ORB_SLAM2 ..."mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8cd ..echo "Converting vocabulary to binary"
./tools/bin_vocabulary

运行

./bin/rgbd_tum ./Vocabulary/ORBvoc.bin Examples/RGB-D/TUM1.yaml /home/dk/桌面/dataset/rgbd_dataset_freiburg1_room /home/dk/桌面/dataset/rgbd_dataset_freiburg1_room/associate.txt

读者需要自行进行修改。
在这里插入图片描述

自己数据集的采集

笔者使用RealSenseD435进行数据集的采集。读取相机ros节点发出的消息,使用CV_bridge转变为opencv类型进行存储

#include<iostream>
#include<algorithm>
#include<fstream>
#include<chrono>
#include<fstream>
#include<string>
#include<sstream>
#include<iomanip>
#include<sys/time.h>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>#include<ros/ros.h>
#include<std_msgs/String.h>
#include<cv_bridge/cv_bridge.h>
#include<message_filters/subscriber.h>
#include<message_filters/time_synchronizer.h>
#include<message_filters/sync_policies/approximate_time.h>using namespace std;
using namespace cv;int counter = 0;
int flag = 0;// txt配置文件
ofstream ofs_color;
ofstream ofs_depth;
ofstream association;   // 颜色和深度图根据时间戳进行对齐后的文件void GrabRGBD(const sensor_msgs::ImageConstPtr &msgRGB, const sensor_msgs::ImageConstPtr &msgD)
{// Copy the ros image message to cv::Mat.cv_bridge::CvImageConstPtr cv_ptrRGB;try{cv_ptrRGB = cv_bridge::toCvShare(msgRGB);}catch (cv_bridge::Exception &e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}cv_bridge::CvImageConstPtr cv_ptrD;try{cv_ptrD = cv_bridge::toCvShare(msgD);}catch (cv_bridge::Exception &e){ROS_ERROR("cv_bridge exception: %s", e.what());return;}imshow("Depth",cv_ptrD->image);imshow("RGB",cv_ptrRGB->image);if (flag < 10){ostringstream ss_color;ss_color << "//media//dk//My Passport//self_dataset//camera_pose//rgb//" << 0 << ".png";ostringstream ss_depth;ss_depth << "//media//dk//My Passport//self_dataset//camera_pose//depth//" << 0 << ".png";imwrite(ss_color.str(), cv_ptrRGB->image);imwrite(ss_depth.str(), cv_ptrD->image);    flag++;counter = 0;}else{ostringstream ss_color;ss_color << "//media//dk//My Passport//self_dataset//camera_pose//rgb//" << to_string(counter) << ".png";ofs_color<<to_string(counter)<<" "<<"rgb/"<<to_string(counter)<<".png"<<endl;ostringstream ss_depth;ss_depth << "//media//dk//My Passport//self_dataset//camera_pose//depth//" << to_string(counter) << ".png";ofs_depth<<to_string(counter)<<" "<<"depth/"<<to_string(counter)<<".png"<<endl;association<<counter<<" "<<"rgb/"<<counter<<".png"<<" "<<counter<<" "<<"depth/"<<counter<<".png"<<endl;imwrite(ss_color.str(), cv_ptrRGB->image);imwrite(ss_depth.str(), cv_ptrD->image);}counter++;waitKey(50);if(waitKey(50) == 'q')return;return;
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ros::init(argc,argv,"RGBD");ros::NodeHandle nh;ofs_color.open("//media//dk//My Passport//self_dataset//camera_pose//rgb.txt",ios::out|ios::trunc);ofs_depth.open("//media//dk//My Passport//self_dataset//camera_pose//depth.txt",ios::out|ios::trunc);association.open("//media//dk//My Passport//self_dataset//camera_pose//associate.txt",ios::out|ios::trunc);// 订阅的话题名称string rgb_topic = "/camera/color/image_raw";string depth_topic =  "/camera/aligned_depth_to_color/image_raw";cout << endl << "------------------------" << endl;cout << "- rgb_topic: " << rgb_topic << endl;cout << "- depth_topic: " << depth_topic << endl;// 用于多传感器消息的同步message_filters::Subscriber <sensor_msgs::Image> rgb_sub(nh, rgb_topic, 1);         // 订阅RGB图像message_filters::Subscriber <sensor_msgs::Image> depth_sub(nh, depth_topic, 1);     // 订阅深度图像typedef message_filters::sync_policies::ApproximateTime <sensor_msgs::Image, sensor_msgs::Image> sync_pol;  // 根据时间戳进行对齐message_filters::Synchronizer <sync_pol> sync(sync_pol(10), rgb_sub, depth_sub);    // 进行信息同步sync.registerCallback(boost::bind(&GrabRGBD, _1, _2));  // 将_1, _2传入函数GrabRGBD中ros::spin();return 0;
}

然后在rgb和depth文件夹中删除0.png即可。
在这里插入图片描述
在这里插入图片描述
运行数据集

./bin/rgbd_tum Vocabulary/ORBvoc.bin Examples/RGB-D/RealSenseD435i.yaml /media/dk/My\ Passport/self_dataset/camera_pose /media/dk/My\ Passport/self_dataset/camera_pose/associate.txt

读者需要修改为自己保存的数据集的位置
在这里插入图片描述
半径滤波后
在这里插入图片描述


http://www.ppmy.cn/news/609395.html

相关文章

大数据Spark(十五):Spark Core的RDD常用算子

文章目录 常用算子 基本算子 分区操作函数算子

Java 内部类为什么不能用静态变量和静态方法(非静态内部类为什么不能有静态成员变量和静态方法)

内部类中不能使用静态的变量和静态的方法,这句话今天刚听到的时候感觉没毛病,但是,内部类中也不一定不能使用静态的变量,我们可以通过添加final 的方法的来使用,内部类中静态的方法是不能使用的 看下面的代码 提示错误了,具体提示如下 内部类不能有静态声明 我们添加final 这样…

【Android】实现雷达扫描效果,使用自定义View来绘制雷达扫描动画

要在Android上实现雷达扫描效果&#xff0c;你可以使用自定义View来绘制雷达扫描动画。以下是一个简单的示例代码&#xff1a; 创建一个名为RadarView的自定义View类&#xff0c;继承自View&#xff1a; import android.content.Context; import android.graphics.Canvas; im…

深度学习数据集定义与加载

深度学习数据集定义与加载 深度学习模型在训练时需要大量的数据来完成模型调优&#xff0c;这个过程均是数字的计算&#xff0c;无法直接使用原始图片和文本等来完成计算。因此与需要对原始的各种数据文件进行处理&#xff0c;转换成深度学习模型可以使用的数据类型。 一、框架…

为什么静态方法无法直接调用非静态成员变量和方法

静态方法无法直接调用非静态成员变量和方法 看到这句话,要想到形容的是这样的如下 静态方法里面无法调用非静态变量 下面在写一个对比非静态的方法和静态方法调用变量对比 问题原因 静态变量和静态的方法是属于类,不属于对象,调用的时候不需要实例化(当然如果你非要实例化之后…

latex用法总结

画彩色直线 $\textcolor[rgb]{1,0,0}{\rule[1.5pt]{0.5cm}{0.2em}}$表格和图在同一行 \begin{figure*}\begin{minipage}{0.63\linewidth}\includegraphics[width1.0\hsize]{HPatches_curve.pdf}\end{minipage}\hfill\begin{minipage}{0.34\linewidth}\tiny\renewcommand\arra…

大数据Spark(十六):Spark Core的RDD算子练习

文章目录 RDD算子练习 map 算子 filter 算子 flatMap 算子

适定、超定和欠定方程的概念

矩阵的每一行代表一个方程&#xff0c;m行代表m个线性联立方程。 n列代表n个变量。如果m是独立方程数&#xff0c;根据m<n、mn、m>n确定方程是 ‘欠定’、‘适定’ 还是 ‘超定’。 超定方程组&#xff1a;方程个数大于未知量个数的方程组。 对于方程组Ray&#xff0c;R为…