Airsim雷达相机融合生成彩色点云

这篇具有很好参考价值的文章主要介绍了Airsim雷达相机融合生成彩色点云。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

代码,cmake,launch等都在网盘链接中

链接: https://pan.baidu.com/s/14hWBDnRZC41xkqAk6FirtA 提取码: 1een
--来自百度网盘超级会员v4的分享

1、简介

3D激光雷达和相机的融合指的是将激光雷达获得的3D点,投影到相机图像上,从而给图像每个像素点添加深度信息或者为雷达获取到的3D点添加RGB信息。效果如图:

Airsim雷达相机融合生成彩色点云

Airsim雷达相机融合生成彩色点云

可以知道,要将3D点投影到图像需要知道相机和雷达的坐标系的变换矩阵以及相机的内参

2、雷达相机融合理论介绍

理论简单来说就算一句话:通过雷达相机的变换矩阵将雷达系/世界坐标系的3D点投影到相机

Airsim雷达相机融合生成彩色点云

2.1、Airsim中各个矩阵获取

外参

外参包括旋转和平移,将世界/雷达坐标系下的3D点转换到相机坐标系下

此处主要参考

AirSim相机、IMU内外参分析(VIO、vSLAM)_智能之欣的博客-CSDN博客_airsim 相机

Airsim雷达相机融合生成彩色点云

 该旋转矩阵是相机到世界坐标系的,我们要的是世界坐标系到相机坐标系的。所有应该求该矩阵的转置,如下:

Airsim雷达相机融合生成彩色点云

 平移矩阵可以根据settings中相机处的x,y,z给出

内参

仍参考上文博客

Airsim雷达相机融合生成彩色点云

 其中width,heigth,fov都可以在settings中进行设置

Airsim雷达相机融合生成彩色点云

雷达系/世界系

点云返回是雷达系还是世界系可以通过在settings中雷达参数进行设置

Airsim雷达相机融合生成彩色点云

本文中用的是雷达系,但是不知道雷达与世界坐标系的关系,经过尝试雷达系与世界坐标系各个坐标轴朝向应该算一致的,仅仅是根据结果猜测,不确定是否正确

现在内参外参都知道了,下面可以根据录制数据进行测试了

3、Airsim录制bag数据

录制点云数据的过程可以参考我的另一篇文章,除了settings文件有所不同其他都是相同的

Airsim+Lego-Loam_111111111112454545的博客-CSDN博客

{
  "SeeDocsAt": "https://github.com/Microsoft/AirSim/blob/master/docs/settings.md",
  "SettingsVersion": 1.2,
  "SimMode": "Multirotor",
  "ViewMode": "SpringArmChase",
  "ClockSpeed": 1,
  "Vehicles": {
    "imulink": {
      "VehicleType": "SimpleFlight",
      "DefaultVehicleState": "Armed",
      "EnableCollisionPassthrogh": false,
      "EnableCollisions": true,
      "AllowAPIAlways": true,
      "Sensors": {
        "Imu" : {
          "SensorType": 2,
          "Enabled": true,
          "AngularRandomWalk": 0.3,
          "GyroBiasStabilityTau": 500,
          "GyroBiasStability": 4.6,
          "VelocityRandomWalk": 0.24,
          "AccelBiasStabilityTau": 800,
          "AccelBiasStability": 36
        },        
        "LidarCustom": {
          "SensorType": 6,
          "Range": 50,
          "Enabled": true,
          "NumberOfChannels": 16,
          "PointsPerSecond": 288000,
          "RotationsPerSecond": 10,
          "VerticalFOVUpper": 15,
          "VerticalFOVLower": -15,
          "HorizontalFOVStart": -180,
          "HorizontalFOVEnd": 180,
          "X": 2, "Y": 0, "Z": -1,
          "DrawDebugPoints": false,
          "Pitch":0, "Roll": 0, "Yaw": 0,
          "DataFrame": "SensorLocalFrame"
        }
      },
	"Cameras": {
	"camera_1": {
          "CaptureSettings": [
            {
              "ImageType": 0,
              "Width": 640,
              "Height": 480,
              "FOV_Degrees": 90,
              "TargetGamma": 1.5
            }
          ],
          "X": 2, "Y": 0, "Z": -1,
          "Pitch": 0, "Roll": 0, "Yaw": 0
        }
	}
    }
  },

	"SubWindows": [
	   
	  ]
}

3.1、控制飞机飞行

3.1.1、代码控制

飞机飞行路线可以通过代码设置飞行路线参见我的另一篇博客(来自于宁子安大佬);

3.1.2、键盘控制

AirSim无人机键盘控制_Sabersaber-的博客-CSDN博客_python控制airsim

也可以通过pygame用键盘控制无人机更加方便,但是有一点需要注意:UE4那边的设置,你需要取消勾选非焦点窗口时占用较少计算资源的选项否则当你鼠标出了UE4窗口到键盘控制那个窗口时UE4会变得特别卡;

在编辑->偏好设置->性能->处于背景使用较少CPU

Airsim雷达相机融合生成彩色点云

 4、代码实现

代码主要包括以下几大部分内容

4.1、构造函数

pcl_fusion():it(n)
    {
        subCloud = n.subscribe<sensor_msgs::PointCloud2>("/velodyne_points", 100, &pcl_fusion::getcloud, this); //接收velodyne点云数据,进入回调函数getcloud()
        pubCloud = n.advertise<sensor_msgs::PointCloud2>("/fusion_cloud", 100);  //建立了一个发布器,主题是/adjustd_cloud,方便之后发布加入颜色之后的点云
        image_sub_ = it.subscribe("/airsim_node/imulink/camera_1/Scene", 100, &pcl_fusion::imageCallback,this);
        //image_transport::Publisher img_pub = it.advertise("camera/image", 100);
        R<<0,1,0,
        0,0,1,
        1,0,0;
        K<<320,0,320,
                0,320,240,
                0,0,1;
        t<<0,0,0;
    }

1、初始化订阅点云的变量

2、订阅订阅图像的变量

3、初始化发布融合RGB信息的变量

4、初始化内外参

4.2、订阅图像函数

  void imageCallback(const sensor_msgs::ImageConstPtr& msg){
  try{
        image  = cv_bridge::toCvShare(msg, "bgr8")->image;
        //cv::Mat image  = cv_bridge::toCvShare(msg, "bgr8")->image; //image_raw就是我们得到的图像了

    // cv::circle(image,cv::Point(100,250),5,cv::Scalar(0,0,255),3); //注意先列后行
    for (int row = 0; row < 480; row++ )
    {
      for (int  col= 0; col< 640; col++ )
      {
        image_color[row][col] = (cv::Vec3b)image.at<cv::Vec3b>(row, col);
      }
    }
    // cv::imshow("view", image);
  }
    catch (cv_bridge::Exception& e){
    ROS_ERROR("Could not convert from '%s' to 'bgr8'.", msg->encoding.c_str());
  }
}

主要功能有两个

1、将接收到的ros格式的图像通过cv_bridge转换成cv::Mat

2、将cv::Mat转换成cv::Vec3b(这一步不要应该也行,通过cv::Mat获取RGB信息)

4.3、点云订阅函数(融合)

  //点云回调函数
  void getcloud(const sensor_msgs::PointCloud2ConstPtr& laserCloudMsg){
    pcl::PointCloud<pcl::PointXYZRGB>::Ptr  fusion_pcl_ptr (new pcl::PointCloud<pcl::PointXYZRGB>);   //放在这里是因为,每次都需要重新初始化,舍弃了原有但没用的两个通道intensity、ring
    //pcl::PointCloud<PointXYZIR>::Ptr   raw_pcl_ptr (new pcl::PointCloud<PointXYZIR>);   //VLP-16的点云消息包含xyz和intensity、ring的,这里没有加ring不知道为啥也可以,需要的话要自己定义一个点类型PointXYZIR
    pcl::PointCloud<pcl::PointXYZ>::Ptr   raw_pcl_ptr (new pcl::PointCloud<pcl::PointXYZ>);  
    pcl::fromROSMsg(*laserCloudMsg, *raw_pcl_ptr);  //把msg消息指针转化为点云指正

    //另一种做法
    Eigen::Vector3f c_tmp;
    Eigen::Vector3f p_result;
    for (int i = 0; i <  raw_pcl_ptr->points.size(); i++)
    {
      c_tmp<<raw_pcl_ptr->points[i].x, raw_pcl_ptr->points[i].y, raw_pcl_ptr->points[i].z;
    
      p_result = K * (R* c_tmp+t);  //坐标转换
      cv::Point pt;
      pt.x =  (int)((p_result[0] / p_result[2])) ;
      pt.y =  (int)((p_result[1] / p_result[2])) ;
      // std::cout<<  pt << std::endl;

      if ( pt.x >=0 &&pt.x <  640 && pt.y>=0 && pt.y<480 && raw_pcl_ptr->points[i].x>0) //&& raw_pcl_ptr->points[i].x>0去掉图像后方的点云
      {
        // PointXYZRGBIR  p;
        pcl::PointXYZRGB p;
        p.x=raw_pcl_ptr->points[i].x;
        p.y=raw_pcl_ptr->points[i].y;
        p.z=raw_pcl_ptr->points[i].z;
        
        //点云颜色由图像上对应点确定
        p.b = image_color[pt.y][pt.x][0];
        p.g = image_color[pt.y][pt.x][1];
        p.r = image_color[pt.y][pt.x][2];
        //将点云画在图像上
        // std::cout<<pt.y<<"   "<<pt.x<<std::endl;
        // cv::Point center(pt.y,pt.x);
        // cv::Scalar colorCircle1(0, 0, 255);
        // cv::circle(image_copy, center, 0.1, colorCircle1, 0.1 );
        //若点云类型为XYZRGBIR则需要添加IR信息
        //p.label = (rand() % (10+1));  //设置10个标签,标签随机
        //p.intensity = raw_pcl_ptr->points[i].intensity;  //继承之前点云的intensity
        //p.ring = raw_pcl_ptr->points[i].ring;  //继承之前点云的ring

        fusion_pcl_ptr->points.push_back(p);
      }
    }
    //发布画了点云的图像
    // sensor_msgs::ImagePtr msg2 = cv_bridge::CvImage(std_msgs::Header(), "bgr8", image_copy).toImageMsg();
    // img_pub.publish(msg2);

    fusion_pcl_ptr->width = 1;
    fusion_pcl_ptr->height = fusion_pcl_ptr->points.size();
    // std::cout<<  fusion_pcl_ptr->points.size() << std::endl;
    pcl::toROSMsg( *fusion_pcl_ptr, fusion_msg);  //将点云转化为消息才能发布
    fusion_msg.header.frame_id = "world_enu";//帧id改成和velodyne一样的
    pubCloud.publish( fusion_msg); //发布调整之后的点云数据,主题为/adjustd_cloud
  }

主要功能有

1、创建XYZRGB类型点云集和用于储存融合好的点云

2、将接收到的ros类型的点云转换成pcl::pointxyz类型

3、点云投影到相机

4、融合储存

5、将pcl点云转换成ros格式并发布

5、运行效果

launch

首先可以创建一个简单的launch文件用于启动,避免每次都添加新节点

<launch>
    <node pkg="selfslam" type="fucon2" name="fucon2" output="screen" />
       <arg name="rviz" default="true" />
    <group if="$(arg rviz)">
        <node launch-prefix="nice" pkg="rviz" type="rviz" name="rviz" args="-d $(find selfslam)/rviz_cfg/aloam_velodyne.rviz" />
    </group>
</launch>

运行

打开一个终端
cd ~/work/study/ros/my_slam(这是我的目录避免忘记,记录一下)
roscore
打开另一个终端
catkin_make
source devel/setup.bash
roslaunch selfslam xxx(selfslam是我自己的功能包的名称你都需要换成你自己的)

再打开一个终端
cd ~/work/study/ros
rosbag play xxxx.bag (换成你自己的)
rosbag play yuantu+nengyong.bag (这是我的)

结果

如果觉得自己的自己的点云在rviz里是反着的且调不过来可以通过这个按钮调节反转z轴

Airsim雷达相机融合生成彩色点云

Airsim雷达相机融合生成彩色点云文章来源地址https://www.toymoban.com/news/detail-483096.html

到了这里,关于Airsim雷达相机融合生成彩色点云的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 多传感器融合 | CenterFusion:毫米波雷达和相机后融合3D检测算法

    点击下方 卡片 ,关注“ 自动驾驶之心 ”公众号 ADAS巨卷干货,即可获取 今天自动驾驶之心很荣幸邀请到寒风分享RV后融合算法CenterFusion,如果您有相关工作需要分享,请在文末联系我们! 点击进入→ 自动驾驶之心【多传感器融合】技术交流群 后台回复 【多传感器融合综述

    2024年01月19日
    浏览(49)
  • BEVCar:用于BEV地图和目标分割的相机-雷达融合

    BEVCar: Camera-Radar Fusion for BEV Map and Object Segmentation 鸟瞰视角下的语义场景分割对于移动机器人的规划和决策至关重要。虽然最近的仅依靠视觉的方法在性能方面取得了显著进展,但它们通常在恶劣的光照条件下(如雨天或夜间)表现不佳。虽然主动传感器提供了解决这一挑战的

    2024年04月24日
    浏览(34)
  • matlab Lidar Camara Calibrator使用方法及雷达点云对相机的标定

    标定数据导入matlab lidar camara calibrator 插件,点击图示中的 Import 后选择Import Data如图所示: 依次选择导入图像和点云数据如下后点击“ 确定 ”: Matlab会自动导入数据并计算相机内参,然后开始进行相机和点云数据的处理,并进行自动标定,但自动标定结果一般较差,会提示

    2024年02月05日
    浏览(42)
  • 【佳佳怪文献分享】MVFusion: 利用语义对齐的多视角 3D 物体检测雷达和相机融合

    标题:MVFusion: Multi-View 3D Object Detection with Semantic-aligned Radar and Camera Fusion 作者:Zizhang Wu , Guilian Chen , Yuanzhu Gan , Lei Wang , Jian Pu 来源:2023 IEEE International Conference on Robotics and Automation (ICRA 2023) 这是佳佳怪分享的第2篇文章 多视角雷达-摄像头融合三维物体检测为自动驾驶提供了更

    2024年02月12日
    浏览(57)
  • ​CVPR2023 | MSMDFusion: 激光雷达-相机融合的3D多模态检测新思路(Nuscenes SOTA!)...

    点击下方 卡片 ,关注“ 自动驾驶之心 ”公众号 ADAS巨卷干货,即可获取 点击进入→ 自动驾驶之心【3D目标检测】技术交流群 后台回复 【3D检测综述】 获取最新基于点云/BEV/图像的3D检测综述! 融合激光雷达和相机信息对于在自动驾驶系统中实现准确可靠的3D目标检测至关重

    2023年04月21日
    浏览(50)
  • 雷达视觉融合算法RODNet数据处理代码解读

    论文RODNet:A Real-Time Radar Object Detection Network Cross-Supervised by Camera-Radar Fused Object 3D 原论文地址:https://arxiv.org/abs/2102.05150 代码地址:https://github.com/yizhou-wang/RODNet 摘要 在目标检测中,雷达虽然在恶劣天气下有精准采集信号的优势,但缺乏语义信息,若对采集的雷达信号进行手

    2024年02月11日
    浏览(36)
  • 使用扩展卡尔曼滤波(EKF)融合激光雷达和雷达数据(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 大多数自

    2024年02月09日
    浏览(52)
  • 激光雷达与相机外参标定(附open3d python代码)

    现在的激光雷达与相机的标定程序基本都是Ubuntu框架下面的,并且都是C++代码,需要安装的依赖也比较复杂,于是自己写了一个python版本的标定程序,依赖非常简单,Windows系统也可以运行。并且代码简单一个文件搞定,符合python简单易行的风格。 先上最后标定后的效果图​

    2024年02月11日
    浏览(43)
  • 自动驾驶感知——激光雷达基本概念|激光雷达点云|激光雷达的标定

    激光探测及测距系统(Light Detection and Ranging,LiDAR) 激光雷达是一种通过发射激光束探测目标的位置、速度等特征量 的雷达系统 激光波段位于0.5μm-10μm,以光电探测器为接收器件,以光学望远镜为天线。 特点 • 角分辨率、距离分辨率高 • 抗干扰能力强 • 三维坐标、反射率

    2024年02月02日
    浏览(41)
  • 高翔ORB-SLAM2稠密建图编译(添加实时彩色点云地图+保存点云地图)

    本文写于2022年5月18日。 Ubuntu18.04 + ROS melodic ORBSLAM2_with_pointcloud_map 是基于 ORB_SLAM2 改动的, ORB_SLAM2 编译前一些库的安装以及编译时的报错参考此篇博客 ORBSLAM2_with_pointcloud_map源码地址 将源码下载到 ~/catkin_ws/src 目录下面 如果没有安装 Ros Melodic ,参考Ubuntu18.04安装Ros Melodic 以及

    2024年01月23日
    浏览(73)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包