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

稠密建图

按照下面的网站进行安装

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 -j8

cd ../../g2o

echo "Configuring and building Thirdparty/g2o ..."

mkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j8

cd ../../../

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 -j8
 
cd ..

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

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

  • 3
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
引用\[1\]:error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14: could not find expected ':' 。 引用\[2\]:error: error parsing deployment-nginx.yml: error converting YAML to JSON: yaml: line 19: did not find expected key 。 引用\[3\]:\[root@k8s-master ~\]# kubectl apply -f recommended.yaml namespace/kubernetes-dashboard unchanged serviceaccount/kubernetes-dashboard unchanged error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14: could not find expected ':' 。 问题: error converting yaml to json是什么意思? 回答: error converting yaml to json意味着在将YAML文件转换为JSON格式时出现了错误。这可能是由于YAML文件中的语法错误或格式错误导致的。在这种情况下,转换工具无法正确解析YAML文件并将其转换为JSON格式。错误消息中提到的行号和错误信息可以帮助定位问题所在,通常是缺少了一个冒号或者缺少了一个关键字。要解决这个问题,您可以检查YAML文件的语法和格式,确保它符合YAML的规范。 #### 引用[.reference_title] - *1* *3* [【排错】error: error parsing recommended.yaml: error converting YAML to JSON: yaml: line 14:的解决...](https://blog.csdn.net/weixin_54628931/article/details/128482574)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [error parsing deployment-nginx.yml: error converting YAML to JSON: yaml: line 19 问题解决](https://blog.csdn.net/weixin_64124795/article/details/129789799)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值