工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)
博主的合并代码
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
运行效果图
双目

单目

相关文章:

工程(十一)——NUC11+D435i+VINS-FUSION+ESDF建图(github代码)
博主的合并代码gitgithub.com:huashu996/VINS-FUSION-ESDFmap.git一、D435i深度相机配置1.1 SDKROS参考我之前的博客,步骤和所遇见的问题已经写的很详细了https://blog.csdn.net/HUASHUDEYANJING/article/details/129323834?spm1001.2014.3001.55011.2 相机标定参数…...

第十四届蓝桥杯三月真题刷题训练——第 4 天
目录 题目 1 :九数算式_dfs回溯(全排列) 题目描述 运行限制 代码: 题目2:完全平方数 问题描述 输入格式 输出格式 样例输入 1 样例输出 1 样例输入 2 样例输出 2 评测用例规模与约定 运行限制 代码: 题目 1 &am…...

Hadoop 运行环境搭建(开发重点)
文章目录Hadoop 运行环境搭建(开发重点)一、安装JDK二、安装配置 Hadoop1、安装 hadoop2、hadoop 目录结构3、设置免密登录4、完全分布式模式(开发重点)1)分发jdk2)集群配置(1) 集群部署规划(2) 配置文件说…...

在社交媒体上行之有效的个人IP趋势
如果您认为无论是获得一份工作、建立一家企业还是推动个人职业发展,社交媒体都是帮助您实现目标的可靠工具,那么个人IP就是推动这一工具前进的燃料。个人IP反映了您是谁,您在所处领域的专业程度,以及您与他人的区别。社交媒体将有…...
Java网络编程
网络编程 什么是网络编程? 可以让设备中的程序与网络上其他设备中的程序进行数据交互(实现网络通信) Java.net. 包下提供了网络编程的解决方案* 基本的通信架构 基本的通信架构有两种方式:CS架构(Client客户端/Se…...
PTA:L1-001 Hello World、L1-002 打印沙漏、L1-003 个位数统计(C++)
目录 L1-001 Hello World 问题描述: 实现代码: L1-002 打印沙漏 问题描述: 实现代码: 原理思路: L1-003 个位数统计 题目描述: 实现代码: 原理思路: 过于简单的就不再写题…...

构造HTTP请求
使用formform使用如下:<body><!-- 表单标签,允许用户和服务器之间交互数据 --><form action"https://www.sogou.com" method"get"><!-- 要求提交的数据以键值对的结构来组织 --><input type"text" name"stduent…...
转速/线速度/角速度计算FC
工业应用中很多设备控制离不开转速、线速度的计算,这篇博客给大家汇总整理。张力控制的开环闭环方法中也离不开转速和线速度的计算,详细内容请参看下面的文章链接: PLC张力控制(开环闭环算法分析)_plc的收卷张力控制系统_RXXW_Dor的博客-CSDN博客里工业控制张力控制无处不…...

学习笔记:Java并发编程(补)ThreadLocal
【尚硅谷】学习视频:https://www.bilibili.com/video/BV1ar4y1x727【黑马程序员】学习视频:https://www.bilibili.com/video/BV15b4y117RJ 参考书籍 《实战 JAVA 高并发程序设计》 葛一鸣 著《深入理解 JAVA 虚拟机 | JVM 高级特性与最佳实践》 周志明 著…...

HashMap底层实现原理及面试题
文章目录1. 常见的数据结构有三种结构1.1 各自数据结构的特点2. HashMap2.1 概述2.2 底层结构2.2.1 HashMa实现原理:2.2.1.1 map.put(k,v)实现原理2.2.1.2 map.get(k)实现原理2.2.1.3 resize源码2.2.2 HashMap常用的变量2.2.3 HashMap构造函数2.3 JDK1.8之前存在的问…...
【STM32】进阶(二):DMA+ADC实现模拟量检测
1、简述 DMA:Direct Memory Access,直接内存访问 ADC:Analog to Digital Converter,模数转换器,模拟信号转换成数字信号的电路(采样-量化-编码) 参考博客: STM32DMA功能详解 STM32…...

Lab2_Simple Shell_2020
Lab2: 实验目的:给xv6添加新的系统调用 并理解系统调用是如何工作的,并理解xv6内核的一些内部特征 实验准备: 阅读xv6的第2章以及第4章的4.3,4.3小节熟悉下面的源码 用户态相关的代码:user/user.h和user/usys.pl内核态相关的代…...

2023最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据
电商日常运营很容易理解,就是店铺商品维护,上下架,评价维护,库存数量,协助美工完成制作详情页。店铺DSR,好评率,提升客服服务等等,这些基础而且每天都必须做循环做的工作。借助电商A…...
MySQL 的索引类型
1. 按照功能划分 按照功能来划分,索引主要有四种: 普通索引唯一性索引主键索引全文索引 普通索引就是最最基础的索引,这种索引没有任何的约束作用,它存在的主要意义就是提高查询效率。 普通索引创建方式如下: CREATE…...

< Linux > 进程信号
目录 1、信号入门 生活角度的信号 技术应用角度的信号 前台进程 && 后台进程 信号概念 用kill -l命令察看系统定义的信号列表 信号处理的方式 2、信号产生前 用户层产生信号的方式 3、产生信号 3.1、通过终端按键产生信号 3.2、核心转储core dump 3.3、调用系统函数…...

Pyspark基础入门7_RDD的内核调度
Pyspark 注:大家觉得博客好的话,别忘了点赞收藏呀,本人每周都会更新关于人工智能和大数据相关的内容,内容多为原创,Python Java Scala SQL 代码,CV NLP 推荐系统等,Spark Flink Kafka Hbase Hi…...

C/C++每日一练(20230307)
目录 1. 国名排序 ★★ 2. 重复的DNA序列 ★★★ 3. 买卖股票的最佳时机 III ★★★ 🌟 每日一练刷题专栏 C/C 每日一练 专栏 Python 每日一练 专栏 1. 国名排序 小李在准备明天的广交会,明天有来自世界各国的客房跟他们谈生意,…...

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

tcsh常用配置
查看当前的shell类型 在 Linux 的世界中,有着许多 shell 程序。常见的有: Bourne shell (sh) C shell (csh) TC shell (tcsh) Korn shell (ksh) Bourne Again shell (bash) 其中,最常用的就是bash和tcsh,本次文章介绍tcsh的…...

YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py
前言 前面简单介绍了YOLOv5的项目目录结构(直通车:YOLOv5源码逐行超详细注释与解读(1)——项目目录结构解析),对项目整体有了大致了解。 今天要学习的是detect.py。通常这个文件是用来预测一张图片或者一…...

国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...

VASP软件在第一性原理计算中的应用-测试GO
VASP软件在第一性原理计算中的应用 VASP是由维也纳大学Hafner小组开发的一款功能强大的第一性原理计算软件,广泛应用于材料科学、凝聚态物理、化学和纳米技术等领域。 VASP的核心功能与应用 1. 电子结构计算 VASP最突出的功能是进行高精度的电子结构计算ÿ…...

【字节拥抱开源】字节团队开源视频模型 ContentV: 有限算力下的视频生成模型高效训练
本项目提出了ContentV框架,通过三项关键创新高效加速基于DiT的视频生成模型训练: 极简架构设计,最大化复用预训练图像生成模型进行视频合成系统化的多阶段训练策略,利用流匹配技术提升效率经济高效的人类反馈强化学习框架&#x…...
PostgreSQL 对 IPv6 的支持情况
PostgreSQL 对 IPv6 的支持情况 PostgreSQL 全面支持 IPv6 网络协议,包括连接、存储和操作 IPv6 地址。以下是详细说明: 一、网络连接支持 1. 监听 IPv6 连接 在 postgresql.conf 中配置: listen_addresses 0.0.0.0,:: # 监听所有IPv4…...