工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)

news2025/8/2 23:19:39

博主的合并代码

git@github.com:huashu996/VINS-FUSION-ESDFmap.git

一、D435i深度相机配置

1.1 SDK+ROS

参考我之前的博客,步骤和所遇见的问题已经写的很详细了

https://blog.csdn.net/HUASHUDEYANJING/article/details/129323834?spm=1001.2014.3001.5501

1.2 相机标定参数

1、相机内参

通过rostopic的camera/info获取

  • header:标准消息头

seq:序列ID,连续递增的ID号

stamp:两个时间戳

frame_id:与此数据相关联的帧ID

height:图像尺寸,height代表高度,(height*width)相机的分辨率,以像素为单位

width:图像尺寸,width代表宽度,(height*width)相机分辨率,以像素为单位

  • distortion_model:指定了相机畸变模型,对于大多数相机,"plumb_bob"简单的径向和切向畸变模型就足够了

  • D(distortion_parameters):畸变参数也叫失真系数,取决于畸变模型,(k1, k2, t1, t2, k3)

  • K:相机内参矩阵,使用焦距(fx, fy)和主点坐标(cx, cy),单位为像素,内参矩阵可以将相机坐标中的3D点投影到2D像素坐标,数据顺序(fx,cx,fy,cy,1)

  • R:旋转矩阵,将相机坐标系统对准理想的立体图像平面,使两张立体图像中的极线平行,仅对双目相机有效

  • P:投影矩阵,左边3*3矩阵是相机的内参矩阵,将相机坐标中的3D点投影到2D像素坐标,可能与相机内参K不同。对于单目相机Tx = Ty = 0。对于双目相机,Tx和Ty有所不同。

  • binning_x:图像下采样参数,水平方向

  • binning_y:图像下采样参数,竖直方向

  • (width / binning_x) x (height / binning_y)

  • 下采样:binning_x = binning_y > 1。缩小图像,生成对应图像的缩略图,使得图像符合显示区域的大小。

  • roi:感兴趣区域定义,即完整图像上的一个矩形子窗口

2.相机外参标定

https://blog.csdn.net/qq_38364548/article/details/124917067

二、VINS-FUSION环境配置

2.1 重要环境配置如下

ubuntu18.04

ROS

pcl 1.7

opencv3

ceres-solver-1.14.0

整体环境配置还算简单要求不严格,间要说明以下。

  • ROS

sudo apt-get install ros-melodic-cv-bridge ros-melodic-tf ros-melodic-message-filters ros-melodic-image-transport ros-melodic-octomap*
  • Ceres

sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libeigen3-dev libgtest-dev
git clone https://github.com/ceres-solver/ceres-solver.git
cd ceres-solver/
mkdir build
cd build
cmake ..
make
sudo make install
  • 代码安装

cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/VINS-Fusion.git
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash

三、实际测试运行

3.1 D435I launch修改

为了启动IMU,双目摄像头

<launch>
  <arg name="serial_no"           default=""/>
  <arg name="usb_port_id"         default=""/>
  <arg name="device_type"         default=""/>
  <arg name="json_file_path"      default=""/>
  <arg name="camera"              default="camera"/>
  <arg name="tf_prefix"           default="$(arg camera)"/>
  <arg name="external_manager"    default="false"/>
  <arg name="manager"             default="realsense2_camera_manager"/>

  <arg name="fisheye_width"       default="640"/>
  <arg name="fisheye_height"      default="480"/>
  <arg name="enable_fisheye"      default="false"/>

  <arg name="depth_width"         default="640"/>
  <arg name="depth_height"        default="480"/>
  <arg name="enable_depth"        default="true"/>

  <arg name="infra_width"        default="640"/>
  <arg name="infra_height"       default="480"/>
  <arg name="enable_infra1"       default="true"/>
  <arg name="enable_infra2"       default="true"/>

  <arg name="color_width"         default="640"/>
  <arg name="color_height"        default="480"/>
  <arg name="enable_color"        default="true"/>

  <arg name="fisheye_fps"         default="30"/>
  <arg name="depth_fps"           default="30"/>
  <arg name="infra_fps"           default="30"/>
  <arg name="color_fps"           default="30"/>
  <arg name="gyro_fps"            default="200"/>
  <arg name="accel_fps"           default="250"/>
  <arg name="enable_gyro"         default="true"/>
  <arg name="enable_accel"        default="true"/>

  <arg name="enable_pointcloud"         default="false"/>
  <arg name="pointcloud_texture_stream" default="RS2_STREAM_COLOR"/>
  <arg name="pointcloud_texture_index"  default="0"/>

  <arg name="enable_sync"               default="true"/>
  <arg name="align_depth"               default="true"/>

  <arg name="publish_tf"                default="true"/>
  <arg name="tf_publish_rate"           default="0"/>

  <arg name="filters"                   default=""/>
  <arg name="clip_distance"             default="-2"/>
  <arg name="linear_accel_cov"          default="0.01"/>
  <arg name="initial_reset"             default="false"/>
  <arg name="unite_imu_method"          default="linear_interpolation"/>
  <arg name="topic_odom_in"             default="odom_in"/>
  <arg name="calib_odom_file"           default=""/>
  <arg name="publish_odom_tf"           default="true"/>
  <arg name="allow_no_texture_points"   default="false"/>
  <arg name="emitter_enable"           default="false"/>

<!-- rosparam set /camera/stereo_module/emitter_enabled false -->
<rosparam>
  /camera/stereo_module/emitter_enabled: 0
</rosparam>

<rosparam if="$(arg emitter_enable)">
  /camera/stereo_module/emitter_enabled: 1
</rosparam>

  <group ns="$(arg camera)">
    <include file="$(find realsense2_camera)/launch/includes/nodelet.launch.xml">
      <arg name="tf_prefix"                value="$(arg tf_prefix)"/>
      <arg name="external_manager"         value="$(arg external_manager)"/>
      <arg name="manager"                  value="$(arg manager)"/>
      <arg name="serial_no"                value="$(arg serial_no)"/>
      <arg name="usb_port_id"              value="$(arg usb_port_id)"/>
      <arg name="device_type"              value="$(arg device_type)"/>
      <arg name="json_file_path"           value="$(arg json_file_path)"/>

      <arg name="enable_pointcloud"        value="$(arg enable_pointcloud)"/>
      <arg name="pointcloud_texture_stream" value="$(arg pointcloud_texture_stream)"/>
      <arg name="pointcloud_texture_index"  value="$(arg pointcloud_texture_index)"/>
      <arg name="enable_sync"              value="$(arg enable_sync)"/>
      <arg name="align_depth"              value="$(arg align_depth)"/>

      <arg name="fisheye_width"            value="$(arg fisheye_width)"/>
      <arg name="fisheye_height"           value="$(arg fisheye_height)"/>
      <arg name="enable_fisheye"           value="$(arg enable_fisheye)"/>

      <arg name="depth_width"              value="$(arg depth_width)"/>
      <arg name="depth_height"             value="$(arg depth_height)"/>
      <arg name="enable_depth"             value="$(arg enable_depth)"/>

      <arg name="color_width"              value="$(arg color_width)"/>
      <arg name="color_height"             value="$(arg color_height)"/>
      <arg name="enable_color"             value="$(arg enable_color)"/>

      <arg name="infra_width"              value="$(arg infra_width)"/>
      <arg name="infra_height"             value="$(arg infra_height)"/>
      <arg name="enable_infra1"            value="$(arg enable_infra1)"/>
      <arg name="enable_infra2"            value="$(arg enable_infra2)"/>

      <arg name="fisheye_fps"              value="$(arg fisheye_fps)"/>
      <arg name="depth_fps"                value="$(arg depth_fps)"/>
      <arg name="infra_fps"                value="$(arg infra_fps)"/>
      <arg name="color_fps"                value="$(arg color_fps)"/>
      <arg name="gyro_fps"                 value="$(arg gyro_fps)"/>
      <arg name="accel_fps"                value="$(arg accel_fps)"/>
      <arg name="enable_gyro"              value="$(arg enable_gyro)"/>
      <arg name="enable_accel"             value="$(arg enable_accel)"/>

      <arg name="publish_tf"               value="$(arg publish_tf)"/>
      <arg name="tf_publish_rate"          value="$(arg tf_publish_rate)"/>

      <arg name="filters"                  value="$(arg filters)"/>
      <arg name="clip_distance"            value="$(arg clip_distance)"/>
      <arg name="linear_accel_cov"         value="$(arg linear_accel_cov)"/>
      <arg name="initial_reset"            value="$(arg initial_reset)"/>
      <arg name="unite_imu_method"         value="$(arg unite_imu_method)"/>
      <arg name="topic_odom_in"            value="$(arg topic_odom_in)"/>
      <arg name="calib_odom_file"          value="$(arg calib_odom_file)"/>
      <arg name="publish_odom_tf"          value="$(arg publish_odom_tf)"/>
      <arg name="allow_no_texture_points"  value="$(arg allow_no_texture_points)"/>
    </include>
  </group>
</launch>

3.2 单目+IMU

修改配置文件VINS-FUSION/src/VINS-Fusion-RGBD/config/realsense/realsense_d435i_config.yaml

主要修改相机的外参矩阵、内参矩阵、topic,不修改也能运行,漂移大。

roslaunch realsense2_camera rs_camera_vins.launch 
roslaunch vins vins_rviz.launch 
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_d435i_config.yaml

3.1 双目+IMU

修改配置文件VINS-FUSION/src/VINS-Fusion-RGBD/config/realsense/realsense_stereo_imu_config.yaml

主要修改两个相机的外参矩阵、内参矩阵、topic。

roslaunch realsense2_camera rs_camera_vins.launch 
roslaunch vins vins_rviz.launch 
rosrun vins vins_node ~/catkin_ws/src/VINS-Fusion/config/realsense_d435i/realsense_stereo_imu_config.yaml

四、ESDF建图

4.1 下载代码编译

cd ~/catkin_ws/src
git clone https://github.com/HKUST-Aerial-Robotics/FIESTA
cd ../
catkin_make
source ~/catkin_ws/devel/setup.bash

4.2 修改代码

  • 1.修改launch

<launch>
    <node pkg="fiesta" type="test_fiesta" name="fiesta" output="screen"
          required="true">

        <param name="resolution" value="0.05"/>
        <param name="update_esdf_every_n_sec" value="0.1"/>

        <!--Hash Table only-->
        <param name="reserved_size" value="1000000"/>

        <!--Array only-->
        <param name="lx" value="-10.0"/>
        <param name="ly" value="-10.0"/>
        <param name="lz" value="-1"/>
        <param name="rx" value="+10.0"/>
        <param name="ry" value="+10.0"/>
        <param name="rz" value="+3"/>

        <!-- raycasting parameters -->
        <param name="min_ray_length" value="0.5"/>
        <param name="max_ray_length" value="5.0"/>
        <!--If hash table is used, make sure the value is 0. In array implementation, 0 means no other thread.-->
        <param name="ray_cast_num_thread" value="0"/>



        <!-- needed when using depth image-->
    <param name="center_x" value="381.91"/>
    <param name="center_y" value="241.553"/>
    <param name="focal_x" value="609.738"/>
    <param name="focal_y" value="608.557"/>

        <!-- probabilistic grid map -->
        <param name="p_hit" value="0.70"/>
        <param name="p_miss" value="0.35"/>
        <param name="p_min" value="0.12"/>
        <param name="p_max" value="0.97"/>
        <param name="p_occ" value="0.80"/>

        <!-- global / local -->
        <param name="global_map" value="true"/>
        <param name="global_update" value="true"/>
        <param name="global_vis" value="true"/>
        <param name="radius_x" value="3.0"/>
        <param name="radius_y" value="3.0"/>
        <param name="radius_z" value="1.5"/>

        <!--depth_filter -->
        <param name="use_depth_filter" value="true"/>
        <param name="depth_filter_tolerance" value="0.1"/>
        <param name="depth_filter_max_dist" value="10.0"/>
        <param name="depth_filter_min_dist" value="0.1"/>
        <!--unit: pixel-->
        <param name="depth_filter_margin" value="0"/>

        <!-- visulization -->
        <!--0 for no visulize-->
        <param name="visualize_every_n_updates" value="10"/>
        <param name="slice_vis_max_dist" value="2.0"/>
        <!-- relative to the lz if array is used, relative to the origin if hash table is used -->
        <param name="slice_vis_level" value="1.6"/>
        <param name="vis_lower_bound" value="0"/>
        <param name="vis_upper_bound" value="+10"/>

        <!-- subsribe source -->
        <remap from="~depth" to="/camera/depth/image_rect_raw"/>
        <remap from="~transform" to="/vins_estimator/camera_pose"/>
    </node>

    <node name="rvizvisualisation" pkg="rviz" type="rviz" output="log" args="-d $(find fiesta)/demo.rviz" />
</launch>

2.修改主函数

FIESTA-master/src/FIESTA/test/test_fiesta.cpp,默认是点云输入格式。

#include "Fiesta.h"

int main(int argc, char **argv) {
  ros::init(argc, argv, "FIESTA");
  ros::NodeHandle node("~");
  //fiesta::Fiesta<sensor_msgs::PointCloud2::ConstPtr, geometry_msgs::TransformStamped::ConstPtr> esdf_map(node);fiesta::Fiesta<sensor_msgs::Image::ConstPtr, nav_msgs::Odometry::ConstPtr> esdf_map(node);
  fiesta::Fiesta<sensor_msgs::Image::ConstPtr, nav_msgs::Odometry::ConstPtr> esdf_map(node);

  ros::spin();
  return 0;
}

4.3 运行

roslaunch fiesta D435i.launch

运行效果图

双目

单目

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/394357.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

解决新版QGIS找不到Georeferencer插件

目录1. 问题分析1.1 去 Raster 找&#xff0c;没找到1.2 去插件搜&#xff0c;未搜到1.3 插件库里也搜不到2. 解决办法在 QGIS 3.30中&#xff0c;按常规办法&#xff0c;找不到 Georeferencer插件&#xff0c;它并没有被安装&#xff0c;在库中也找不到它&#xff0c; 请问问题…

sheng的学习笔记Eureka Ribbon

Eureka-注册中心Eureka简介官方网址&#xff1a;https://spring.io/projects/spring-cloud-netflixEureka介绍Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现(请对比Zookeeper)。Zooleeper nacos.Eureka 采用了 C-S 的设计架构。Eureka Server 作为服…

【项目实战】IDEA中 90%的人都不后知后觉的小技巧汇总

一、 IDEA中如何设置左侧导航条跟代码保持同步&#xff1f; https://blog.csdn.net/Arry_Coding/article/details/102389149 二、IDEA中如何将Services调出并将启动类显示在Services中&#xff1f; https://blog.csdn.net/qq_38343402/article/details/106325154 三、IDEA中…

工业企业用电损耗和降损措施研究

来自用电设备和供配电系统的电能损耗。而供配电系统的电能损耗,包括企业变配电设备、控制设备企业在不断降低生产成本,追求经济效益的情况下,进一步降低供配电系统中的电能损耗,使电气设摘要:电网电能损耗是一个涉及面很广的综合性问题,主要包括管理损耗和技术损耗两部分…

频谱分析仪的工作原理

频谱分析仪架构犹如时域用途的示波器&#xff0c;外观如图 1.2 所示&#xff0c;面板上布建许多功能控制按键&#xff0c;作为系统功能之调整与控制&#xff0c;系统主要的功能是在频域里显示输入信号的频谱特性。频谱分析仪依信号处理方式的不同&#xff0c;一般有两种类型&am…

硬件设计 之摄像头分类(IR摄像头、mono摄像头、RGB摄像头、RGB-D摄像头、鱼眼摄像头)

总结一下在机器人上常用的几种摄像头&#xff0c;最近在组装机器人时&#xff0c;傻傻分不清摄像头的种类。由于本人知识有限&#xff0c;以下资料都是在网上搜索而来&#xff0c;按照摄像头的分类整理一下&#xff0c;供大家参考&#xff1a; 1.IR摄像头&#xff1a; IRinfr…

window.print() 前端实现网页打印详解

目录 前言 一、print()方法 二、打印样式 2.1使用打印样式表 2.2使用媒介查询 2.3内联样式使用media属性 2.4在css中使用import引入打印样式表 三、打印指定区域部分内容 3.1方法一 3.2方法二 3.3方法三 四、强制插入分页 4.1page-break-before&#xff08;指定元素前…

一条SQL查询语句是如何执行的?

平时我们使用数据库&#xff0c;看到的通常都是一个整体。比如&#xff0c;你有个最简单的表&#xff0c;表里只有一个ID字段&#xff0c;在执行下面这个查询语句时&#xff1a; mysql> select * from T where ID10&#xff1b; 我们看到的只是输入一条语句&#xff0c;返…

HTML5学习笔记(2.0)

响应式布局 优点&#xff1a;兼容不同设备分辨率&#xff0c;解决多设备显示兼容问题。 缺点&#xff1a;兼容设备工作量大&#xff0c;效率低下&#xff1b;代码冗余&#xff0c;加载时间长&#xff1b;一定程度上改变原网站的布局&#xff0c;会出现视觉混淆。 用法&#x…

JavaScript高级程序设计读书分享之10章——函数

JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 定义函数 定义函数有两种方式&#xff1a;函数声明和函数表达式大致看这两种方式没有什么区别&#xff0c;事实上&#xff0c;JavaScript 引擎在加载数据时对它们是区别对待的。JavaScript 引擎在任何代…

我的网站需要什么SSL证书?

如果您希望您的网站看起来合法可信&#xff0c;则需要SSL证书。如果您要在线销售商品或允许用户在您的公司中创建帐户&#xff0c;则特别需要此功能。SSL证书有助于保护您的信息以及客户的信息。根据Backlinko在2016年完成的研究&#xff0c;使用SSL证书甚至可以提高您的搜索引…

33 JSON操作

目录 一、介绍 二、JSON的特点 三、JSON语法 1、json中的数据类型 四、JSON文件的定义 五、读取JSON文件 1、读取json文件的两种方式 &#xff08;1&#xff09;read、write &#xff08;2&#xff09;json.load 2、使用json.load读取json文件的步骤 3、练习读取json文件 六、练…

【自然语言处理】从词袋模型到Transformer家族的变迁之路

从词袋模型到Transformer家族的变迁之路模型名称年份描述Bag of Words1954即 BOW 模型&#xff0c;计算文档中每个单词出现的次数&#xff0c;并将它们用作特征。TF-IDF1972对 BOW 进行修正&#xff0c;使得稀有词得分高&#xff0c;常见词得分低。Word2Vec2013每个词都映射到一…

qt下ffmpeg录制mp4经验分享,支持音视频(h264、h265,AAC,G711 aLaw, G711muLaw)

前言 MP4&#xff0c;是最常见的国际通用格式&#xff0c;在常见的播放软件中都可以使用和播放&#xff0c;磁盘空间占地小&#xff0c;画质一般清晰&#xff0c;它本身是支持h264、AAC的编码格式&#xff0c;对于其他编码的话&#xff0c;需要进行额外处理。本文提供了ffmpeg录…

2023最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据

电商日常运营很容易理解&#xff0c;就是店铺商品维护&#xff0c;上下架&#xff0c;评价维护&#xff0c;库存数量&#xff0c;协助美工完成制作详情页。店铺DSR&#xff0c;好评率&#xff0c;提升客服服务等等&#xff0c;这些基础而且每天都必须做循环做的工作。借助电商A…

Webpack前端资源加载/打包工具

文章目录一、Webpack1、什么是Webpack2、Webpack安装2.1全局安装2.2安装后查看版本号3、创建项目3.1初始化项目3.2创建src文件夹3.3 src下创建common.js3.4 src下创建utils.js3.5 src下创建main.js4、JS打包4.1创建配置文件4.2执行编译命令4.3创建入口页面4.4测试5、CSS打包5.1…

Spring框架核心功能手写实现

文章目录概要Spring启动以及扫描流程实现基础环境搭建扫描逻辑实现bean创建的简单实现依赖注入实现BeanNameAware回调实现初始化机制模拟实现BeanPostProcessor模拟实现AOP模拟实现概要 手写Spring启动以及扫描流程手写getBean流程手写Bean生命周期流程手写依赖注入流程手写Be…

【项目实战】Nginx配置Https证书

一、背景说明 Nginx配置https证书是常规操作&#xff0c;Nginx支持crtkey或者pem证书格式 二、具体步骤 2.1 上传证书文件 进入Nginx配置文件夹的目录&#xff0c;将这两个证书文件上传至服务器的某个路径中 &#xff08;记住这个路径&#xff09; 2.2 新建配置 然后&am…

Linux 安装npm yarn pnpm 命令

下载安装包 node 下载地址解压压缩包 tar -Jxf node-v19.7.0-linux-x64.tar.xz -C /root/app echo "export PATH$PATH:/app/node-v16.9.0-linux-x64" >> /etc/profile source /etc/profile ln -sf /app/node-v16.9.0-linux-x64/bin/npm /usr/local/bin/ ln -…

SBOM应该是软件供应链中的安全主食

当谈到软件材料清单(SBOM)时&#xff0c;通常的类比是食品包装上的成分列表&#xff0c;它让消费者知道他们将要吃的薯片中有什么。 美国机构有90天时间创建所有软件的清单 同样&#xff0c;SBOM是一个软件中组件的清单&#xff0c;在应用程序是来自多个来源的代码的集合的时…