gazebo中vins-fusion在仿真小车上的部署

 软件要求:Ubuntu 20.04  ros的noetic版本,我是在虚拟机vitrualbox上运行的

   这几天在学ROS,跟着赵虚左老师过了一遍之后,感觉还是有很多不懂的地方,xtdrone上仿真跟着文档走了一遍,好像没学到什么东西,所以我决定想办法自己搭建一个仿真平台,至少实现定位和路径规划的功能。 

   定位的话,这里我想用vins-fusion来做,奈何网上的资料太少了,完全不知道该从何下手,经过几天的查找资料,我目前算是解决了这个问题。

VINS-Fusion的安装

   这里跟着这个教程走就行vins-fusion环境配置、安装与测试-CSDN博客,最后在数据集上测试通过代表安装完成,vins-fusion可以在自己的工作空间下面安装。

Gazebo的搭建

   这里我们跟着赵虚左老师的视频【Autolabor初级教程】ROS机器人入门_哔哩哔哩_bilibili,最后会得到一个类似这样的机器人

 

我们将原camera的位置往左移一点,然后在注释掉原carema,在原camera的位置加上IMU,它会发布名称叫imu/data的消息

<robot name="my_sensors" xmlns:xacro="http://wiki.ros.org/xacro"><gazebo reference="camera"><material>Gazebo/Bule</material><gravity>true</gravity><sensor name="imu_sensor" type="imu"><always_on>true</always_on><update_rate>100</update_rate><visualize>true</visualize><topic>__default_topic__</topic><plugin filename="libgazebo_ros_imu_sensor.so" name="imu_plugin"><topicName>imu/data</topicName><bodyName>imu_base</bodyName><updateRateHZ>100.0</updateRateHZ><gaussianNoise>0.01</gaussianNoise><xyzOffset>0 0 0</xyzOffset>     <rpyOffset>0 0 0</rpyOffset><frameName>imu_base</frameName>        </plugin><pose>0 0 0 0 0 0</pose></sensor></gazebo>
</robot>

由于vins-fusion除了imu还需要双目相机,所以图上那个比较大的方块就是我加上的双目相机,代码如下:

<?xml version="1.0"?>
<!-- 摄像头相关的 xacro 文件 -->
<robot xmlns:xacro="http://wiki.ros.org/xacro"> <!-- 摄像头属性 --><xacro:property name="camera_length" value="0.025" /> <!-- 摄像头长度(x) --><xacro:property name="camera_width" value="0.04" /> <!-- 摄像头宽度(y) --><xacro:property name="camera_height" value="0.04" /> <!-- 摄像头高度(z) --><xacro:property name="camera_x" value="0.06" /> <!-- 摄像头安装的x坐标 --><xacro:property name="camera_y" value="0.06" /> <!-- 摄像头安装的y坐标 --><xacro:property name="camera_z" value="${base_link_length / 2 + camera_height / 2}" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2  --><xacro:property name="camera_m" value="0.01" /> <!-- 摄像头质量 --><!-- 摄像头关节以及link --><link name="double_camera"><visual><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /><material name="black" /></visual><collision><geometry><box size="${camera_length} ${camera_width} ${camera_height}" /></geometry><origin xyz="0.0 0.0 0.0" rpy="0.0 0.0 0.0" /></collision><xacro:Box_inertial_matrix m="${camera_m}" l="${camera_length}" w="${camera_width}" h="${camera_height}" /></link><joint name="double_camera2base_link" type="fixed"><parent link="base_link" /><child link="double_camera" /><origin xyz="${camera_x} ${camera_y} ${camera_z}" /></joint><!-- camera left joints and links --><joint name="left_joint" type="fixed"><origin xyz="0 0 0" rpy="0 0 0" /><parent link="double_camera" /><child link="stereo_left_frame" /></joint><link name="stereo_left_frame"/><joint name="left_optical_joint" type="fixed"><origin xyz="0 0 0" rpy="${-pi/2} 0 ${-pi/2}" /><parent link="stereo_left_frame" /><child link="stereo_left_optical_frame" /></joint><link name="stereo_left_optical_frame"/><!-- camera right joints and links --><joint name="right_joint" type="fixed"><origin xyz="0 -0.07 0" rpy="0 0 0" /><parent link="double_camera" /><child link="stereo_right_frame" /></joint><link name="stereo_right_frame"/><joint name="right_optical_joint" type="fixed"><origin xyz="0 0 0" rpy="${-pi/2} 0 ${-pi/2}" /><parent link="stereo_right_frame" /><child link="stereo_right_optical_frame" /></joint><link name="stereo_right_optical_frame"/><!-- stereo camera --> <gazebo reference="double_camera"><sensor type="multicamera" name="stereocamera"><material>Gazebo/Blue</material><always_on>true</always_on><update_rate>30</update_rate><visualize>1</visualize><camera name="left"><pose>0 0 0 0 0 0</pose><horizontal_fov>1.047</horizontal_fov><image><width>640</width><height>360</height><!-- format>L_UINT8</format --><format>R8G8B8</format></image><clip><near>0.1</near><far>100</far></clip></camera><camera name="right"><pose>0 -0.07 0 0 0 0</pose><horizontal_fov>1.047</horizontal_fov><image><width>640</width><height>360</height><!-- format>L_UINT8</format --><format>R8G8B8</format></image><clip><near>0.1</near><far>100</far></clip></camera><plugin name="stereo_camera_controller" filename="libgazebo_ros_multicamera.so"><cameraName>stereocamera</cameraName><alwaysOn>true</alwaysOn><updateRate>30</updateRate><cameraName>stereocamera</cameraName><imageTopicName>image_raw</imageTopicName><cameraInfoTopicName>camera_info</cameraInfoTopicName><frameName>camera_link_optical</frameName><baseline>0.07</baseline><distortion_k1>0.0</distortion_k1><distortion_k2>0.0</distortion_k2><distortion_k3>0.0</distortion_k3><distortion_t1>0.0</distortion_t1><distortion_t2>0.0</distortion_t2></plugin></sensor></gazebo>
</robot>

OK,现在我们已经安装好了IMU和双目相机。

VINS-Fusion参数更改

在/VINS-Fusion/config/vi_car/vi_car.yaml(因为我们用的是小车,无人机去改config里面另外的文件),我们需要修改它的imu和image的topic,从这个

imu_topic: "/imu0"
image0_topic: "/cam0/image_raw"
image1_topic: "/cam1/image_raw"
output_path: "/home/tong/output/"

改成你自己的topic

imu_topic: "/imu/data"
image0_topic: "/stereocamera/right/image_raw"
image1_topic: "/stereocamera/left/image_raw"
output_path: "/home/tong/output/"

OK,现在启动VINS-Fusion(记得rosrun你刚才修改的vi_car文件)

roslaunch vins vins_rviz.launch
rosrun vins vins_node ~/你自己的workspace/src/VINS-Fusion/config/vi_car/vi_car.yaml

可以看到目前是已经跑通的状态,但是现在移动小车就会发现,轨迹很不准确,这是因为相机的内参和外参还没改 。

相机的内参和外参更改

在我们刚才修改的vi_car.yaml文件中,我们会找到这个:

cam0_calib: "cam0_mei.yaml"
cam1_calib: "cam1_mei.yaml"

说明我们要修改这两个文件,这两个文件正好就在vi_car.yaml的目录下。

打开仿真环境,使用rostopic list

可以看到有这些

通过 /stereocamera/left/camera_info 和 /stereocamera/right/camera_info 话题查看相机内参, 由于是仿真环境, 所以左右目外参理论上是一样的 

 通过这个内参更改那两个文件,这是这个文件的含义:

#######################################################################
#                      Calibration Parameters                         #
#######################################################################
# These are fixed during camera calibration. Their values will be the #
# same in all messages until the camera is recalibrated. Note that    #
# self-calibrating systems may "recalibrate" frequently.              #
#                                                                     #
# The internal parameters can be used to warp a raw (distorted) image #
# to:                                                                 #
#   1. An undistorted image (requires D and K)                        #
#   2. A rectified image (requires D, K, R)                           #
# The projection matrix P projects 3D points into the rectified image.#
######################################################################## The image dimensions with which the camera was calibrated. Normally
# this will be the full camera resolution in pixels.# 高 ,单位:像素
uint32 height
# 宽 ,单位:像素
uint32 width# The distortion parameters, size depending on the distortion model.
# For "plumb_bob", the 5 parameters are: (k1, k2, t1, t2, k3).
# 畸变参数
float64[] D# Intrinsic camera matrix for the raw (distorted) images.
# 未做去畸变处理图像的内参
#     [fx  0 cx]
# K = [ 0 fy cy]
#     [ 0  0  1]
# Projects 3D points in the camera coordinate frame to 2D pixel
# coordinates using the focal lengths (fx, fy) and principal point
# (cx, cy).
float64[9]  K # 3x3 row-major matrix# Rectification matrix (stereo cameras only)
# 仅用于立体相机,通常是多目相机
# 用于极线对齐
# A rotation matrix aligning the camera coordinate system to the ideal
# stereo image plane so that epipolar lines in both stereo images are
# parallel.
float64[9]  R # 3x3 row-major matrix# Projection/camera matrix
# 投影矩阵:去畸变,修正后世界坐标系下的三维坐标点投影到像素坐标系下的二维点
#     [fx'  0  cx' Tx]
# P = [ 0  fy' cy' Ty]
#     [ 0   0   1   0]
# By convention, this matrix specifies the intrinsic (camera) matrix
#  of the processed (rectified) image. That is, the left 3x3 portion
#  is the normal camera intrinsic matrix for the rectified image.
# It projects 3D points in the camera coordinate frame to 2D pixel
#  coordinates using the focal lengths (fx', fy') and principal point
#  (cx', cy') - these may differ from the values in K.
# 单目相机,tx=ty=0
# For monocular cameras, Tx = Ty = 0. Normally, monocular cameras will
#  also have R = the identity and P[1:3,1:3] = K.
# 双目相机
# For a stereo pair, the fourth column [Tx Ty 0]' is related to the
#  position of the optical center of the second camera in the first
#  camera's frame. We assume Tz = 0 so both cameras are in the same
#  stereo image plane. The first camera always has Tx = Ty = 0. For
#  the right (second) camera of a horizontal stereo pair, Ty = 0 and
#  Tx = -fx' * B, where B is the baseline between the cameras.
# Given a 3D point [X Y Z]', the projection (x, y) of the point onto
#  the rectified image is given by:
#  [u v w]' = P * [X Y Z 1]'
#         x = u / w
#         y = v / w
#  This holds for both images of a stereo pair.
float64[12] P # 3x4 row-major matrix

外参的通过ROS的TF坐标变换来获取,打开rviz,添加tf,如图所示

通过以下命令查看左, 右目相机与IMU的外参

 这里我参考gazebo仿真跑VINS-Fusion双目视觉惯性SLAM_gazebo双目相机xzcro-CSDN博客,之所以用camera,是因为我当时把imu放到原camera的位置了,我也没改名字,外参的话,Translation的偏移量,下面第一个Q是四元数,可以搜一下如何使用四元数得到相机的外参矩阵,在vi_car中修改,这样的话,我们的VINS-Fusion算是彻底跑通了。

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

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

相关文章

java解决常见递归问题

最基本的&#xff0c;斐波那契数列&#xff0c;阶乘&#xff08;0&#xff0c;1的阶乘均为1&#xff09; 返回字母“x”第一次出现的位置 使用递归编写一个函数&#xff0c;读取一个字符串&#xff0c;返回字母“x”第一次出现的位置。例如&#xff0c;字符串 "abcdefgh…

Nature Climate Change 高引文章 | 朴世龙院士团队等揭示全球变绿及其驱动因子

植被是生物圈的关键组成部分&#xff0c;对调节地球气候和提供生态系统服务具有重要作用。陆地植被生长对全球变化非常敏感。工业革命以来&#xff0c;大气二氧化碳浓度升高、气候变暖、氮沉降增加和土地利用变化等因子&#xff0c;通过复杂的生物物理化学过程&#xff0c;对陆…

Android开发——Fragment

Demo fragment_blank.xml <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_pare…

如何从零开始创建React应用:简易指南

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

经典目标检测YOLOV1模型的训练及验证

1、前期准备 准备好目录结构、数据集和关于YOLOv1的基础认知 1.1 创建目录结构 自己创建项目目录结构&#xff0c;结构目录如下&#xff1a; network CNN Backbone 存放位置 weights 权重存放的位置 test_images 测试用的图…

Tomcat命令行窗口、IDEA中Tomcat控制台 中文乱码问题解决方案

Tomcat出现中文乱码问题 打开Tomcat文件夹下的conf/logging.properties文件&#xff0c;将下图位置中的编码由UTF-8全部替换成GBK 然后重启Tomcat服务器&#xff0c;问题解决 Intellij IDEA启动Tomcat服务器控制台出现中文乱码 解决方案非常简单&#xff0c;按照下图设置控制…

【MySQL】表的增删改查

目录 前言&#xff1a; 新增&#xff08;Create&#xff09;&#xff1a; 查询&#xff08;Retrieve&#xff09;&#xff1a; 别名&#xff1a; 去重&#xff1a;DISTINCT 排序&#xff1a;ORDER BY &#xff1a; 条件查询&#xff1a;WHERE &#xff1a; 分页查询&am…

c++实数排序

例&#xff1a;数的三次方跟 描述&#xff1a;给定一个浮点数n&#xff0c;求它的三次方根。 输入描述&#xff1a;一个浮点数 输出描述&#xff1a;问题的解 保留6位小数 #include<bits/stdc.h> using namespace std; double n,eps1e-8; bool check (double x){retu…

【新手入门必看】从零开始学指针

我使用VS CODEMSYS2的编译环境进行学习&#xff0c;想使用VS CODE进行C/C代码编写的小伙伴参考这篇文章进行环境配置VS Code 配置 C/C 编程运行环境&#xff08;保姆级教程&#xff09; 一、指针的引入 指针地址 #include <stdio.h>int main() {int a 10;printf(&quo…

Git的操作和使用

一、基本操作 1、创建git本地仓库 &#xff08;1&#xff09;创建目录&#xff1a;mkdir gitcode &#xff08;2&#xff09;进入目录&#xff1a;cd gitcode/ &#xff08;3&#xff09;查询目录内容&#xff1a;ls &#xff08;4&#xff09;在当前目录下创建git本地仓库…

java算法day3

移除链表元素设计链表翻转链表两两交换链表中的结点 移除链表元素 ps&#xff1a;有时候感觉到底要不要写特判&#xff0c;你想到了就写&#xff01;因为一般特判有一劳永逸的作用。 解法有两种&#xff0c;一种是不用虚拟头结点&#xff0c;另一种就是用虚拟头结点。 这里我…

React-基础语法学习

1、教程&#xff1a;井字棋游戏 本教程将引导你逐步实现一个简单的井字棋游戏&#xff0c;并且不需要你对 React 有任何了解。在此过程中你会学习到一些编写 React 程序的基本知识&#xff0c;完全理解它们可以让你对 React 有比较深入的理解。 1.1、教程分成以下几个部分&am…

3D感知生成对抗网络的高斯溅射解码器

Gaussian Splatting Decoder for 3D-aware Generative Adversarial Networks 3D感知生成对抗网络的高斯溅射解码器 Florian Barthel1, 2  Arian Beckmann1  Wieland Morgenstern1  Anna Hilsmann1  Peter Eisert1,2 Florian Barthel 1, 2 阿里安贝克曼Wieland晨星Anna Hils…

【Godot4自学手册】第三十九节利用shader(着色器)给游戏添加一层雾气效果

今天&#xff0c;主要是利用shader给游戏给地宫场景添加一层雾气效果&#xff0c;增加一下气氛&#xff0c;先看一下效果&#xff1a; 一、新建ParallaxBackground根节点 新建场景&#xff0c;根节点选择ParallaxBackground&#xff0c;命名为Fog&#xff0c;然后将该场景保…

不要小看在线文档编辑工具,它才是提高工作效率的法宝

在数字化的今天&#xff0c;工作方式正变得越来越灵活&#xff0c;远程办公和团队协作已成日常。这个时候&#xff0c;传统的文档处理方式已经无法满足快速发展的业务需求。在线文档编辑工具&#xff0c;正逐渐成为提高团队工作效率的秘密武器。它能够让团队成员无论身处何地&a…

从预训练损失的角度,理解语言模型的涌现能力

原文&#xff1a;Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力&#xff0c;挑战了以往以模型大小或训练计算量为标准的观念。通过实验&#xff0c;作者发现预训练损失是预测下游任…

【剪映专业版】15绿幕抠图:应用技巧、注意事项

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 1.绿幕抠图 背景为绿色的素材&#xff08;其他颜色也可以扣取&#xff0c;只是绿色背景更普遍、抠图效果更好&#xff09; 选择色度抠图&#xff0c;通过取色器选取背景颜色&#xff0c;调整强度实现抠图 剪映的色度抠…

“我舍不得”用英语怎么说?柯桥日常英语口语培训

“我舍不得”用英语怎么说&#xff1f; “舍不得”的英文表达是&#xff1a;Cant bear to 不忍心&#xff0c;不舍得 例句&#xff1a; Time flies. I cant bear to leave you. 时间过的好快啊&#xff0c;我真舍不得离开你。 I cant bear to see you cry. 我真舍不得你…

《QT实用小工具·三十四》Qt/QML使用WebEngine展示的百度ECharts图表Demo

1、概述 源码放在文章末尾 该项目实现了百度ECharts图表的样式&#xff0c;效果demo如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QtWebEngine>int main(int argc, ch…

小成本搏大流量:微信/支付宝小程序搜索排名优化

随着移动互联网的快速发展&#xff0c;小程序已成为企业和个人开发者重要的流量入口和业务承载平台。而小程序搜索排名则是影响小程序曝光量、用户获取及业务转化的关键因素。小柚在本文和大家探讨如何制定有效的优化方案&#xff0c;提升小程序在搜索结果中的排名。 首先跟我…