gazebo仿真跑VINS-Fusion双目视觉惯性SLAM

目录

实验环境: NIVIDIA Jetson TX2 (Ubuntu 20.04 arm架构)

下载仿真环境源码

参考的这篇博客gazebo中给机器人添加16线激光雷达跑LIO-SAM.
下载github源码并创建工作空间对源码进行编译: https://github.com/linzs-online/robot_gazebo.git
源码文件内容
由于我是双目+IMU, 因此需要删掉LIO-SAM, pcd2pgm, scout_slam_nav, velodyne_simulator这四个功能包. realsense_ros_gazebo是realsense深度相机的仿真功能包, 需要自己基于这里面的相机仿真文件编写一个双目相机仿真文件, 后面会介绍, scout_gazebo包里面就主要是机器人仿真模型和IMU的仿真包.

创建自己的仿真环境

这里可以选择使用源码里提供的仿真环境, 也可以自己创建一个适合自己的仿真环境添加到launch文件里. 由于源码里仿真环境的环境纹理太单调了, 于是我自己随便搭建了一个仿真环境.
仿真环境搭建方法: 终端启动gazebo, 在Insert里直接插入自己需要的模型就可以, 然后保存为world文件, 并放在源码功能包的world文件夹下.
自己搭建的仿真环境
最后在scout_gazebo.launch文件里修改导入的仿真环境文件夹路径
仿真launch文件

编写双目相机xacro仿真文件

这里我是综合参考: gazebo中仿真双目相机(stereo camera)和scout_gazebo功能包里urdf文件夹里的camera.xacro文件以及ealsense_ros_gazebo仿真功能包里的depthcam.xacro来编写的自己的双面相机xacro仿真文件. 内容如下

<?xml version="1.0"?>
<!-- 摄像头相关的 xacro 文件 -->
<robot xmlns:xacro="http://wiki.ros.org/xacro"> 
    <!-- 摄像头属性 -->
    <xacro:property name="camera_length" value="0.05" /> <!-- 摄像头长度(x) -->
    <xacro:property name="camera_width" value="0.08" /> <!-- 摄像头宽度(y) -->
    <xacro:property name="camera_height" value="0.08" /> <!-- 摄像头高度(z) -->
    <xacro:property name="camera_x" value="0.4" /> <!-- 摄像头安装的x坐标 -->
    <xacro:property name="camera_y" value="0.0" /> <!-- 摄像头安装的y坐标 -->
    <xacro:property name="camera_z" value="${base_z_size / 2 + camera_height / 2}" /> <!-- 摄像头安装的z坐标:底盘高度 / 2 + 摄像头高度 / 2  -->
    <xacro:property name="camera_m" value="0.01" /> <!-- 摄像头质量 -->

    <!-- 摄像头关节以及link -->
    <link name="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="camera2base_link" type="fixed">
        <parent link="base_link" />
        <child link="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="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="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="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>

将编写的stereo_camera_my.xacro文件放在urdf文件夹下
双目相机仿真文件
然后在base.xacro文件里导入双目相机仿真文件, 并删除激光雷达模块
导入双目相机仿真模块
这里有个问题: 我的双目相机启动后输出的话题频率一直是维持在25HZ左右, 达不到我仿真文件里写的的30HZ, 而且即使我修改了仿真文件里的相机频率, 话题输出数据的频率依旧是25左右, 好像就跟我仿真文件里的频率没有关系一样, 不知道是不是仿真文件里设置频率的地方有问题. 要是有人看到了知道怎么解决这个问题的话麻烦留言帮忙解决一下, 感谢!

启动仿真

编译好功能包后通过一下命令启动仿真环境

roslaunch scout_gazebo scout_gazebo.launch

启动仿真环境后查看当前输出的话题
仿真环境下话题

获取相机内参

通过 /stereocamera/left/camera_info 和 /stereocamera/right/camera_info 话题查看相机内参, 由于是仿真环境, 所以左右目外参理论上是一样的
相机内参
然后根据该参编写SLAM需要的内参文件即可

获取双目与IMU的外参

外参的通过ROS的TF坐标变换来获取
启动rviz可视化界面, Add-TF
TF坐标变换
通过以下命令查看左, 右目相机与IMU的外参
相机与IMU外参
其中imu_base即imu的坐标系, stereo_left_optical_framestereo_right_optical_frame是左右目相机的相机坐标系, 而stereo_left_frame 和 stereo_right_frame 是左右目相机的安装坐标系, 相机坐标系和相机的安装坐标系是存在一个旋转关系的, 因此需要的是相机坐标系与IMU坐标系的外参, 而不是相机安装坐标系与IMU坐标系的外参.

录制rosbag包并测试VINS-Fusion算法

录制了一下四个话题的数据
bag包数据
其中/odom话题是机器人自身在仿真环境中的里程计数据, 我这里用这个数据来做为机器人的真实轨迹, 用来与VINS-Fusion的轨迹做对比. 下面是轨迹对比图, 效果非常好, 仿真环境下的定位精度很高了.
仿真实验轨迹对比
我录的数据路径总长度71m, evo_rpe的相对位姿误差在毫米级, 简直不可思议
rpe仿真RPE

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
px4是一款开放源代码的飞行控制软件,它广泛应用于无人机的飞行控制系统中。而gazebo是一款用于机器人模拟和仿真的强大工具。基于gazebo的视觉导航仿真是指利用gazebo仿真环境和px4飞行控制系统进行无人机的视觉导航仿真。 在学习px4的过程中,基于gazebo的视觉导航仿真是一个重要的学习内容。这种仿真方式可以提供一个虚拟的环境,使得我们可以在计算机上进行无人机的飞行控制和导航算法的开发与测试。 学习基于gazebo的视觉导航仿真,首先需要了解gazebo的基本原理和使用方法。gazebo可以模拟真实的物理环境,包括地形、天气等因素,同时还能够与px4飞行控制系统进行集成。学习者需要掌握gazebo的安装和配置,以及如何创建无人机模型和仿真场景。 其次,学习者还需要了解px4飞行控制系统在视觉导航方面的应用。px4可以利用无人机搭载的摄像头获取图像信息,并通过计算机视觉算法进行视觉导航。学习者需要学习如何配置无人机的视觉传感器,并利用px4的导航算法实现视觉导航功能。 在学习过程中,可以通过模拟不同的仿真场景,如室内、室外、复杂地形等,来测试和优化视觉导航算法。学习者可以通过观察仿真结果,调整算法参数和改进算法,提高无人机的导航精度和鲁棒性。 总体而言,基于gazebo的视觉导航仿真是学习px4的重要环节之一。通过这种仿真方式,可以帮助学习者深入了解px4飞行控制系统和视觉导航算法的原理和应用,提升无人机的导航能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值