第二届“悉灵杯”课题移动机器人感知研究进展
此次分享课题研究进展主要涉及在ros中获取并处理相机发布的深度和彩色图像。本文将讲述如何在ros中完成相机发布数据的订阅,并对数据进行初步的处理

一、课题背景

    基于室内位置的服务已经全方位渗透到人们的生活中,全球的工业界和学术界均在探索高精度、低成本、覆盖范围广的室内定位技术。目前主流的定位技术包括:惯性导航定位、激光定位、视觉定位、超声波定位、蓝牙定位、Wi-Fi定位等。这些方法都各有其优势与局限性。未同时满足精确度、成本、以及实时性且能在未知环境进行定位和导航的需求本课题采用视觉定位方式,以ORB-SLAM3为基础,并用RGB-D相机采集深度图和彩色图,使得移动机器人在运动过程达到一定的精度和鲁棒性,结合移动机器人在室内环境的实际情况,完成室内地图的实时构建。

二、开发环境介绍及目标

1、ubuntu18.04

2、ros-melodic

3、vscode

4、pcl 、opencv、 eigen、...

5、RGB-D感知相机MV-EB435i 

本课题在linux系统中开发通过在ros节点中订阅EB435i相机发布的消息来获取环境信息,由于原始的数据不能直接用于导航所以我们会在程序中对先对该数据进行滤波和坐标变换等操作。

三、订阅相机的数据

    ros::NodeHandle nh("~");

 

    std::string rgb_topic = nh.param<std::string>("rgb", "/camera/rgb/image_color");

    std::string depth_topic = nh.param<std::string>("depth", "/camera/depth/image");

 

    cout << "rgb: " << rgb_topic << endl;

    cout << "depth: " << depth_topic << endl;

 

    message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, rgb_topic, 100);//创建一个消息过滤器的RGB图像订阅者,用于订阅RGB图像的话题。

    message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, depth_topic, 100);//创建一个消息过滤器的深度图像订阅者,用于订阅深度图像的话题。


    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);//定义了一个同步策略类型,用于将RGB和深度图像数据同步。这里使用的是近似时间同步,意味着它会尽量在时间上将两个消息对齐,但允许一定的时间差。

    sync.registerCallback(boost::bind(&ImageGrabber::GrabRGBD,&igb,_1,_2));//注册了一个回调函数,用于处理同步后的RGB和深度图像数据。

四、滤波器

1、体素滤波器

由于通过点云数据中点的数量非常巨大,在对点云地图进行优化的过程中会涉及到大量的运算,过多的冗余数据不仅不会提高运算结果的准确性,还会对x系统的实时性造成很大影响。体素网格滤波器在输入点云数据上创建一个个3D体素网格(将体素网格视为一组空间中的微小3D小空间)。 然后,在每个体素中,所有存在的点将用它们的质心近似,可以达到向下采样同时不破坏点云本身几何结构的功能。

2、统计滤波器

统计滤波器是一种常用于点云处理和计算机视觉中的滤波方法,用于检测和去除点云中的离群点。其原理基于统计学的概念,通过计算每个点周围邻近点的统计信息,来确定哪些点被认为是离群点。将被检测为离群点的点从点云中移除或标记为离群点。统计滤波器的工作原理可以用于去除点云中的噪声,因为噪声通常会导致点在统计上的不规则性,使其成为离群点的候选。这有助于提高点云的质量,使其更适合用于后续的点云地图优化和位姿估计。

PointCloudMapping::PointCloudMapping(double resolution_, double meank_, double thresh_)

    : mabIsUpdating(false)

{

    this->resolution = resolution_;

    this->meank = meank_;

    this->thresh = thresh_;

    std::cout<<resolution<<" "<<meank<<" "<<thresh<<std::endl;

    statistical_filter = new pcl::StatisticalOutlierRemoval<pcl::PointXYZRGBA>(true);

    voxel = new pcl::VoxelGrid<pcl::PointXYZRGBA>();

    statistical_filter->setMeanK(meank);

    statistical_filter->setStddevMulThresh(thresh);

    voxel->setLeafSize(resolution, resolution, resolution);

    globalMap = pcl::PointCloud<pcl::PointXYZRGBA>::Ptr(new pcl::PointCloud<pcl::PointXYZRGBA>);


    viewerThread = make_shared<thread>(bind(&PointCloudMapping::viewer, this));

}


五、像素坐标系到世界坐标系的转化

1、像素坐标系到相机坐标系的转化

要实现像素坐标系到相机坐标系的转化,首先要知道相机的内参。

    相机的内参数(Intrinsic Parameters)是指描述相机本身内部属性和特性的参数,这些参数对于将相机拍摄的三维世界映射到二维图像上非常重要。相机内参包括以下几个主要参数:fx、fy、Cx、Cy和畸变参数(这里不介绍畸变参数)。

fx为相机焦距与图像x方向的放大倍数的乘积,fy为相机焦距与图像y方向的放大倍数的乘积,CxCy为偏移量(因为图像的坐标原点为图像的左上角)

转换公式为:

2、相机坐标系到世界坐标系的转化

与相机坐标系到世界坐标系的转化相关的是相机的外参。相机的外部参数(Extrinsic Parameters)描述了相机在世界坐标系中的位置和方向。与相机的内部参数不同,外部参数是描述相机在三维世界中的位置和方向的参数。

    相机外参通常包括平移矢量t和旋转矩阵R


void PointCloudMapping::generatePointCloud(KeyFrame *kf) //,Eigen::Isometry3d T

{

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr pPointCloud(new pcl::PointCloud<pcl::PointXYZRGBA>);

    // point cloud is null ptr

    for (int m = 0; m < kf->imDepth.rows; m += 4)//像素坐标转相机坐标

    {

        for (int n = 0; n < kf->imDepth.cols; n += 4)

        {

            float d = kf->imDepth.ptr<float>(m)[n];

            if (d < 0.05 || d > 6)

                continue;

            pcl::PointXYZRGBA p;

            p.z = d;

            p.x = (n - kf->cx) * p.z / kf->fx;

            p.y = (m - kf->cy) * p.z / kf->fy;


            p.b = kf->imLeftRgb.ptr<uchar>(m)[n * 3];

            p.g = kf->imLeftRgb.ptr<uchar>(m)[n * 3 + 1];

            p.r = kf->imLeftRgb.ptr<uchar>(m)[n * 3 + 2];


            pPointCloud->points.push_back(p);

        }

    }

    pPointCloud->height = 1;

    pPointCloud->width = pPointCloud->points.size();

    pPointCloud->is_dense = true;

    kf->mptrPointCloud = pPointCloud;

}


void PointCloudMapping::updatecloud(Map &curMap)

{

    std::unique_lock<std::mutex> lck(updateMutex);

    

    mabIsUpdating = true;

    currentvpKFs = curMap.GetAllKeyFrames();

    // loopbusy = true;

    cout << "开始点云更新" << endl;

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr tmpGlobalMap(new pcl::PointCloud<pcl::PointXYZRGBA>);

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr curPointCloud(new pcl::PointCloud<pcl::PointXYZRGBA>);

    pcl::PointCloud<pcl::PointXYZRGBA>::Ptr tmpGlobalMapFilter(new pcl::PointCloud<pcl::PointXYZRGBA>());

    for (int i = 0; i < currentvpKFs.size(); i++)

    {

        if (!mabIsUpdating)

        {

            std::cout << "中断点云更新" <<std::endl;

            return;

        }

        if (!currentvpKFs[i]->isBad() && currentvpKFs[i]->mptrPointCloud)

        {

            //将相机坐标系下的点云数据转换到世界坐标系下

            pcl::transformPointCloud(

                *(currentvpKFs[i]->mptrPointCloud), *(curPointCloud),

                currentvpKFs[i]->GetPoseInverse().matrix());

            *tmpGlobalMap += *curPointCloud;


            voxel->setInputCloud(tmpGlobalMap);

            voxel->filter(*tmpGlobalMapFilter);

            tmpGlobalMap->swap(*tmpGlobalMapFilter);

        }

    }

    cout << "点云更新完成" << endl;

    {

        std::unique_lock<std::mutex> lck(mMutexGlobalMap);

        globalMap = tmpGlobalMap;

    }

    mabIsUpdating = false;

}

版权声明:本文为V社区用户原创内容,转载时必须标注文章的来源(V社区),文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:v-club@hikrobotics.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
上一篇

第二届“悉灵杯”课题研究-基于RGB_D相机的室内环境建模

下一篇

工业相机硬触发接线及相关SDK开发

评论请先登录 登录
全部评论 0
Lv.0
0
关注
0
粉丝
1
创作
1
获赞
所属专题
  • 使用3D相机MV-EB435i基于OpenCV的客流检测与异常识别的实现
  • 悉灵杯”课题研究进展(一)通过海康RGB-D相机获取带RGB信息的点云
  • “悉灵杯”课题研究-基于RGB_D相机的物品位置计算
  • “悉灵杯”课题研究-对RGB_D相机采集的三维点云处理
  • “悉灵杯”课题研究-RGB_D相机SDK集成及Open3d点云基本处理
  • “悉灵杯”课题研究-集成RGB_D相机SDK的Open3d点云可视化
  • “悉灵杯”课题研究-集成RGB_D相机SDK的Open3d点云功能UI项目开发(项目demo)
  • “悉灵杯”课题研究-RGB_D相机SDK三维点云存储
  • “悉灵杯”课题研究-OpenNI集成及示例代码开发
  • 悉灵杯”课题研究-MV-EB435i立体相机基于opencv图像处理使用yolov5的物体识别
  • “悉灵杯”课题研究-基于opecv的集成RGB_D相机SDK的基础小样物品颜色检测及人脸识别
  • OpenCV中利用knn进行数字(0-9)识别--RGB-D相机采集
  • “悉灵杯”课题研究-基于MV-EB435i的落差边缘检测算法开发记录
  • 悉灵杯”课题研究-LabVIEW集成及示例代码开发
  • “悉灵杯”课题研究-MV-EB435i立体相机集成Apriltags发布相机位姿
  • “悉灵杯”课题研究-MV-EB435i立体相机图像处理UI界面开发
  • “悉灵杯”课题研究-基于ROS1的RGB-D相机SDK集成及示例代码开发
  • 第二届“悉灵杯”课题移动机器人感知研究进展
  • “悉灵杯”课题研究—手眼标定方案
  • 第二届“悉灵杯”课题研究-基于RGB_D相机的室内环境建模
  • 悉灵杯”课题研究进展(二)-基于三维模型/场景点云的虚拟仿真数据生成
  • 悉灵杯”课题研究进展(一)-实例分割网络模型搭建与实验场景介绍
  • “悉灵杯”课题研究报告-基于RGB-D相机的2D和3D抓取定位方案研究
  • “悉灵杯”课题研究-基于点云配准算法GICP的3D抓取方案研究
  • “悉灵杯”课题研究-基于YOLO和GGCNN的物品平面抓取方案研究
  • 动态手势控制音频播放器-成果物
  • 第二届“悉灵杯”课题研究报告-动态手势控制音频播放器设计
  • 动态手势控制音频播放器(五)动态手势控制音频播放器exe
  • 动态手势控制音频播放器(四)动态手势识别系统的设计
  • 动态手势控制音频播放器(三)音频播放器设计
  • 动态手势控制音频播放器(二)动态手势识别系统的设计
  • 动态手势控制音频播放器(一)总体方案设计
  • 悉灵杯”课题研究进展(四)RGB-D相机引导机械臂分拣物料
  • 悉灵杯”课题研究进展(三)RGB-D相机引导机械臂分拣物料
  • 悉灵杯”课题研究进展(二)RGB-D相机引导机械臂分拣物料
  • ”悉灵杯”课题研究报告-基于RGB-D相机的机械臂物料分拣系统研究
  • 悉灵杯”课题研究报告-基于深度学习方法和虚拟仿真数据的机械臂引导方案
  • 第二届“悉灵杯”课题研究机械臂引导研究报告
  • 第二届“悉灵杯”课题研究机械臂引导研究进展(二)
  • 第二届“悉灵杯”课题研究机械臂引导研究进展(一)
相关阅读
  • VM4.4更新亮点
    2024-04-12 浏览 0
  • 第二届启智杯—光伏电池片质检视觉方案设计
    2024-04-15 浏览 0
  • 第二届启智杯-锂电外壳外观检测3D视觉方案设计
    2024-04-15 浏览 0
  • 第二届启智杯-无监督异常检测算法
    2024-04-16 浏览 0
  • 双车联动调试案例-华工中试基地
    2024-04-28 浏览 0

请升级浏览器版本

您正在使用的浏览器版本过低,请升级最新版本以获得更好的体验。

推荐使用以下浏览器