Realsence D455标定并运行Vins-Fusion

2023-05-16

文章目录

    • 一、双目相机标定
      • 1. 标定板准备
        • 1.1 打印标定板
        • 1.2 标定板信息
          • 原始pdf的格子参数是:
          • 调整后的格子参数是:
      • 2. 左右目相机数据准备
        • 2.1 修改rs_camera.launch内容
        • 2.2 关闭结构光
        • 2.3 可视化双目图像
        • 2.4 修改相机播包帧数
        • 2.5 录制数据
      • 3. kalibr 程序标定
      • 4. kalibr 标定结果
    • 二、IMU标定
      • 1. 标定工具准备
        • 1.1 code_utils
          • 问题1 catkin_make时出现libdw.h没有找到
          • 问题2 catkin_make时出现backward.hpp没有找到
        • 1.2 imu_utils
      • 2. 录制数据准备
        • 2.1 编辑IMU的话题
          • 方式:
          • 原因:
          • 最后运行:
        • 2.2 录制数据
      • 3. 正式标定工作
        • 3.1 imu_util 工具包launch文件编写
        • 3.2 imu_util标定程序运行
        • 3.3 播放刚才录制的IMU数据包
        • 3.4 标定结果
    • 三、IMU+双目相机标定
      • 1. 准备yaml文件
        • 1.1 编写chain.yaml
        • 1.2 编写imu.yaml
        • 1.3 april_6x6_A4.yaml
        • 1.4 rs_camera.launch
      • 2. 录制数据
        • 2.1 关闭结构光
        • 2.2 可视化双目图像
        • 2.3 修改相机播包帧数
        • 2.4 录制数据
      • 3. kalibr 程序标定
      • 4. 标定结果
    • 四、修改VINS的yaml文件
      • 1. realsense_stereo_imu_config.yaml
      • 2 left.yaml
      • 3 right.yaml
    • 五、 运行VINS-FUSION
      • 参考

一、双目相机标定

1. 标定板准备

1.1 打印标定板

地址:https://github.com/ethz-asl/kalibr/wiki/downloads
在这里插入图片描述下载,然后直接用A4纸就可以打印出来(有条件去淘宝买一个视觉标定板,标出来的误差会更小)

1.2 标定板信息

原始pdf的格子参数是:

在这里插入图片描述

调整后的格子参数是:

新建april_6x6_A4.yaml文件,内容展示如下:

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.021           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          # 小格子与大格子边长比例
codeOffset: 0            #code offset for the first tag in the aprilboard

千万要自己测量大格子边长,即tagSize

2. 左右目相机数据准备

在这之前需要安装realsence的sdk和ros,参考博客:Intel Realsense D455深度相机的标定及使用(一)——安装librealsense SDK2.0以及realsense-ros

2.1 修改rs_camera.launch内容

(1)打开双目

 <arg name="enable_infra1"       default="true"/>
 <arg name="enable_infra2"       default="true"/>

(2)打开imu的加速度计和陀螺仪

  <arg name="enable_gyro"         default="true"/>
  <arg name="enable_accel"        default="true"/>

并合并为一个topic

<arg name="unite_imu_method"          default="linear_interpolation"/>

(3)传感器同步

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

当然也可以修改图像分辨率(我选择默认了):

  <arg name="infra_width"         default="848"/>
  <arg name="infra_height"        default="480"/>

rs_camera.launch 整体

<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="output"              default="screen"/>
  <arg name="respawn"              default="false"/>

  <arg name="fisheye_width"       default="-1"/>
  <arg name="fisheye_height"      default="-1"/>
  <arg name="enable_fisheye"      default="false"/>

  <arg name="depth_width"         default="-1"/>
  <arg name="depth_height"        default="-1"/>
  <arg name="enable_depth"        default="true"/>

  <arg name="confidence_width"    default="-1"/>
  <arg name="confidence_height"   default="-1"/>
  <arg name="enable_confidence"   default="true"/>
  <arg name="confidence_fps"      default="-1"/>

  <arg name="infra_width"         default="848"/>
  <arg name="infra_height"        default="480"/>
  <arg name="enable_infra"        default="false"/>
  <arg name="enable_infra1"       default="true"/>
  <arg name="enable_infra2"       default="true"/>
  <arg name="infra_rgb"           default="false"/>

  <arg name="color_width"         default="-1"/>
  <arg name="color_height"        default="-1"/>
  <arg name="enable_color"        default="true"/>

  <arg name="fisheye_fps"         default="-1"/>
  <arg name="depth_fps"           default="-1"/>
  <arg name="infra_fps"           default="30"/>
  <arg name="color_fps"           default="-1"/>
  <arg name="gyro_fps"            default="-1"/>
  <arg name="accel_fps"           default="-1"/>
  <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="allow_no_texture_points"   default="false"/>
  <arg name="ordered_pc"                default="false"/>

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

  <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="reconnect_timeout"         default="6.0"/>
  <arg name="wait_for_device_timeout"   default="-1.0"/>
  <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="stereo_module/exposure/1"  default="7500"/>
  <arg name="stereo_module/gain/1"      default="16"/>
  <arg name="stereo_module/exposure/2"  default="1"/>
  <arg name="stereo_module/gain/2"      default="16"/>
  
  

  <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="output"                   value="$(arg output)"/>
      <arg name="respawn"                  value="$(arg respawn)"/>
      <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="confidence_width"         value="$(arg confidence_width)"/>
      <arg name="confidence_height"        value="$(arg confidence_height)"/>
      <arg name="enable_confidence"        value="$(arg enable_confidence)"/>
      <arg name="confidence_fps"           value="$(arg confidence_fps)"/>

      <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_infra"             value="$(arg enable_infra)"/>
      <arg name="enable_infra1"            value="$(arg enable_infra1)"/>
      <arg name="enable_infra2"            value="$(arg enable_infra2)"/>
      <arg name="infra_rgb"                value="$(arg infra_rgb)"/>

      <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="reconnect_timeout"        value="$(arg reconnect_timeout)"/>
      <arg name="wait_for_device_timeout"  value="$(arg wait_for_device_timeout)"/>
      <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="stereo_module/exposure/1" value="$(arg stereo_module/exposure/1)"/>
      <arg name="stereo_module/gain/1"     value="$(arg stereo_module/gain/1)"/>
      <arg name="stereo_module/exposure/2" value="$(arg stereo_module/exposure/2)"/>
      <arg name="stereo_module/gain/2"     value="$(arg stereo_module/gain/2)"/>

      <arg name="allow_no_texture_points"  value="$(arg allow_no_texture_points)"/>
      <arg name="ordered_pc"               value="$(arg ordered_pc)"/>
      
    </include>
  </group>
</launch>

2.2 关闭结构光

默认开始IR结构光时,双目图像会有很多点,这些点可能对标定有影响,所以使用时需要关闭结构光。
终端1:

source /home/lessle6/Packages/RealsenseRos_ws/devel/setup.bash
roslaunch /home/lessle6/Packages/RealsenseRos_ws/src/realsense-ros/realsense2_camera/launch/rs_camera.launch

再打开一个终端2:

rosrun rqt_reconfigure rqt_reconfigure

打开后将camera->stereo_module中的emitter_enabled设置为off(0) ,展示如下:
在这里插入图片描述

2.3 可视化双目图像

新打开终端,运行rviz

rviz

修改Fiexd Fram 为camera_link
在这里插入图片描述

之后在里面add rgb和双目对应的topic,/camera/color/image_raw、/camera/infra1/image_rect_raw、/camera/infra2/image_rect_raw展示如下:
在这里插入图片描述之后固定标定版,尝试移动标定板,同时要确保标定板一直在三个图像当中。录制过程参考https://www.youtube.com/watch?v=puNXsnrYWTY&app=desktop
需要科学上网观看
总结下来就是偏航角左右摆动3次,俯仰角摆动3次,滚转角摆动3次,上下移动3次,左右移动3次,前后移动3次,然后自由移动一段时间,摆动幅度要大一点,让视角变化大一点,但是移动要缓慢一点,同时要保证标定板在3个相机视野内部,整个标定时间要在90s以上更好。

2.4 修改相机播包帧数

修改相机帧数(官方推荐是4Hz,尽管实际频率不完全准确,但是不影响结果)
kalibr在处理标定数据的时候要求频率不能太高,一般为4Hz,我们可以使用如下命令来更改topic的频率,实际上是将原来的topic以新的频率转成新的topic,实际测试infra1才是对应左目相机。

rosrun topic_tools throttle messages /camera/color/image_raw 4.0 /color
rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 4.0 /infra_left
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 4.0 /infra_right

2.5 录制数据

rosbag record -O multicameras_calibration /infra_left /infra_right /color

multicameras_calibration.bag为录制数据

3. kalibr 程序标定

这里需要安装kalibr

source /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/devel/setup.bash

cd  /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace

rosrun kalibr kalibr_calibrate_cameras \
--target /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/april_6x6_A4.yaml \
--bag  /home/lessle6/multicameras_calibration.bag \
--models pinhole-radtan pinhole-radtan pinhole-radtan \
--topics /infra_left /infra_right /color \
--bag-from-to 3 202 --show-extraction --approx-sync 0.04

参数解释:

  • –target /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/april_6x6_A4.yaml
    是标定板的配置文件,注意如果选择棋格盘,注意targetCols和targetRows表示的是内侧角点的数量,不是格子数量。

  • –bag /home/lessle6/multicameras_calibration.bag \ 是录制的数据包

  • models pinhole-radtan pinhole-radtan pinhole-radtan表示三个摄像头的相机模型和畸变模型(解释参考https://github.com/ethz-asl/kalibr/wiki/supported-models,根据需要选取,其中VINS使用的畸变模型是radtan)

  • —topics /infra_left /infra_right /color表示三个摄像头对应的拍摄的数据话题

  • –bag-from-to 3 202表示处理bag中3-202秒的数据。

  • –show-extraction表示显示检测特征点的过程,这些参数可以相应的调整。
    可以使用rosbag info 来参看录制的包的信息

报错1:
Cameras are not connected through mutual observations, please check the dataset. Maybe adjust the approx. sync. tolerance.
应该是两个相机时间不同步导致的,需要调整参数:–approx-sync

参考链接:https://github.com/shanmo/Kalibr-camera-calibration/tree/master/stereo%20camera%20calibration/preliminary%20test

调整后:

rosrun kalibr kalibr_calibrate_cameras \
--target /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/april_6x6_A4.yaml \
--bag /home/lessle6/multicameras_calibration.bag \
--models pinhole-radtan pinhole-radtan pinhole-radtan \
--topics /infra_left /infra_right /color \
--bag-from-to 3 202 --show-extraction --approx-sync 0.1

报错2:
Initialization of focal length failed. You can enable manual input by setting ‘KALIBR_MANUAL_FOCAL_LENGTH_INIT’.
[ERROR] [1668944382.174500]: initialization of focal length for cam with topic /color failed

解决:
如果提示不能得到初始焦距的时候,可以设置:export KALIBR_MANUAL_FOCAL_LENGTH_INIT=1(终端输入)。然后运行程序,当程序运行失败的时候,它会提示要你手动输入一个焦距,Initialization of focal length failed. Provide manual initialization: 这时你手动输入比如 400,给比较大的值,也能收敛。

如果只标定单目:
录制

 rosbag record -O mono_calibration /infra_left 

标定:


source /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/devel/setup.bash

cd  /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace

rosrun kalibr kalibr_calibrate_cameras \
--target /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/april_6x6_A4.yaml \
--bag  /home/lessle6/mono_calibration.bag \
--models pinhole-radtan \
--topics /infra_left \
--show-extraction 

注意: \前要有空格

4. kalibr 标定结果

如下三个文件:
在这里插入图片描述

二、IMU标定

1. 标定工具准备

code_utils和imu_utils都是imu标定需要用到的,用于标定imu噪声密度以及随机游走系数。
imu_utils依赖code_utils,所以先编译code_utils。

1.1 code_utils

mkdir -p /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/src
cd /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/src
catkin_init_workspace
cd ..
catkin_make
source  /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/devel/setup.bash
注意“/home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws”是我的绝对ROS空间地址。

下面下载编译code_utils:
cd /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/src
git clone git@github.com:gaowenliang/code_utils.git
cd ..
catkin_make
问题1 catkin_make时出现libdw.h没有找到
sudo apt-get install libdw-dev
问题2 catkin_make时出现backward.hpp没有找到
解决方法:将sumpixel_test.cpp中# include "backward.hpp"改为:#include “code_utils/backward.hpp

1.2 imu_utils

cd  /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/src
git clone git@github.com:gaowenliang/imu_utils.git
cd ..
catkin_make

2. 录制数据准备

2.1 编辑IMU的话题

方式:
找到realsense-ros包,进入
/home/lessle6/Packages/RealsenseRos_ws/src/realsense-ros/realsense2_camera/launch(路径仅供参考),
复制一份rs_camera.launch,在rs_camera.launch里面修改:
<arg name="unite_imu_method"          default=""/>

修改为:

<arg name="unite_imu_method"          default="linear_interpolation"/>
原因:
将accel和gyro的数据合并得到imu话题,如果不这样做发布的topic中只要加速计和陀螺仪分开的topic,
没有合并的camera/imu topic。
最后运行:
source /home/lessle6/Packages/RealsenseRos_ws/devel/setup.bash
roslaunch /home/lessle6/Packages/RealsenseRos_ws/src/realsense-ros/realsense2_camera/launch/rs_camera.launch

这样就可以播放对应格式的IMU。

2.2 录制数据

rosbag record -O imu_calibration /camera/imu

在这里插入图片描述realsense静止放置,录制一个小时(自定)。
其中imu_calibration是bag包的名字,可以更改,录的包在当前终端目录下,/camera/imu是发布的IMU topic,可以通过以下命令查看。

rostopic list

3. 正式标定工作

3.1 imu_util 工具包launch文件编写

# 进入文件夹
cd /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/src/imu_utils/launch 

# 创建文件
touch d455_imu_calibration.launch

# 编辑文件
gedit d455_imu_calibration.launch

文件内容:

<launch>

    <node pkg="imu_utils" type="imu_an" name="imu_an" output="screen">
    	<!--TOPIC名称和上面一致-->
        <param name="imu_topic" type="string" value= "/camera/imu"/>
        <!--imu_name 无所谓-->
        <param name="imu_name" type="string" value= "d455"/>
        <!--标定结果存放路径-->
        <param name="data_save_path" type="string" value= "$(find imu_utils)/data/"/>
        <!--数据录制时间-min-->
        <param name="max_time_min" type="int" value= "50"/>
        <!--采样频率,即是IMU频率,采样频率可以使用rostopic hz /camera/imu查看,设置为200,为后面的rosbag play播放频率-->
        <param name="max_cluster" type="int" value= "200"/>
    </node>
    
</launch>

3.2 imu_util标定程序运行

source /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/devel/setup.bash

roslaunch  /home/lessle6/Project/1Ahahahgraduation/IMU/imu_calib_ws/src/imu_utils/launch/d455_imu_calibration.launch

3.3 播放刚才录制的IMU数据包

cd 存放imu_calibration.bag的路径
rosbag play -r 200 imu_calibration.bag

3.4 标定结果

标定结束后在imu_catkin_ws/src/imu_utils/data中生成许多文件,其中d455_imu_param.yaml就是我们想要的结果,展示如下:

%YAML:1.0
---
type: IMU
name: d455
Gyr:
   unit: " rad/s"
   avg-axis:
      gyr_n: 1.8351398172861977e-03
      gyr_w: 1.3154828587252936e-05
   x-axis:
      gyr_n: 1.8848941703928685e-03
      gyr_w: 1.7010312342829289e-05
   y-axis:
      gyr_n: 2.3497663951613673e-03
      gyr_w: 1.2699656085618862e-05
   z-axis:
      gyr_n: 1.2707588863043573e-03
      gyr_w: 9.7545173333106557e-06
Acc:
   unit: " m/s^2"
   avg-axis:
      acc_n: 1.7574789006499388e-02
      acc_w: 5.3103238396236881e-04
   x-axis:
      acc_n: 1.1838936933010856e-02
      acc_w: 4.1400494167342325e-04
   y-axis:
      acc_n: 1.9827984613668935e-02
      acc_w: 6.3400755296148608e-04
   z-axis:
      acc_n: 2.1057445472818376e-02
      acc_w: 5.4508465725219715e-04

三、IMU+双目相机标定

1. 准备yaml文件

格式参考Kalibr官方教程: https://github.com/ethz-asl/kalibr/wiki/yaml-formats

1.1 编写chain.yaml

参考一、双目相机标定标定结果multicameras_calibration-camchain.yaml,编写chain.yaml:

cam0:
  camera_model: pinhole
  distortion_coeffs: [0.007017020579074508, 0.013075992589794715, -0.0037765402744058983, -0.0005132729806830811]
  distortion_model: radtan
  intrinsics: [437.44398421645786, 437.72233141976125, 430.95314113824475, 231.60352693067642]
  resolution: [848, 480]
  rostopic: /infra_left
cam1:
  T_cn_cnm1:
  - [0.9999952197233123, 0.002108064461866742, -0.0022619891120047486, -0.09575399583929174]
  - [-0.0021145367376279966, 0.9999936666664111, -0.002862754171397105, 0.0005322182496990349]
  - [0.0022559399157413514, 0.002867523545717535, 0.9999933439997514, -0.0035089144049743597]
  - [0.0, 0.0, 0.0, 1.0]
  camera_model: pinhole
  distortion_coeffs: [0.018914793505132418, -0.0026985776594766744, -0.0025567868843695152, 0.00645205341789554]
  distortion_model: radtan
  intrinsics: [432.2163360247922, 431.7881804665646, 433.3636493084969, 232.14028787830168]
  resolution: [848, 480]
  rostopic: /infra_right

T_cn_cnm1:表示的是左目相机到右目相机的旋转和平移,具体的参数可以参考前面标定得到的结果

1.2 编写imu.yaml

参考二、IMU标定标定结果d455_imu_param.yaml,编写imu.yaml:

#Accelerometers
accelerometer_noise_density: 1.7574789006499388e-02  #Noise density (continuous-time)
accelerometer_random_walk:   5.3103238396236881e-04  #Bias random walk

#Gyroscopes
gyroscope_noise_density:     1.8351398172861977e-03   #Noise density (continuous-time)
gyroscope_random_walk:       1.3154828587252936e-05  #Bias random walk

rostopic:                    /imu      #the IMU ROS topic
update_rate:                 200.0      #Hz (for discretization of the values above)

1.3 april_6x6_A4.yaml

第一节写过的:

target_type: 'aprilgrid' #gridtype
tagCols: 6               #number of apriltags
tagRows: 6               #number of apriltags
tagSize: 0.021           #size of apriltag, edge to edge [m]
tagSpacing: 0.3          # 小格子与大格子边长比例
codeOffset: 0            #code offset for the first tag in the aprilboard

1.4 rs_camera.launch

复制realsense-ros包中rs_camera.launch,更改内容为:
(1) imu和双目数据时间对齐

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

(2)合并加速计和陀螺仪的topic

2. 录制数据

2.1 关闭结构光

首先关闭IR:
默认开始IR结构光时,双目图像会有很多点,这些点可能对标定有影响,所以使用时需要关闭结构光。
终端1:

source /home/lessle6/Packages/RealsenseRos_ws/devel/setup.bash
roslaunch /home/lessle6/Packages/RealsenseRos_ws/src/realsense-ros/realsense2_camera/launch/rs_camera.launch

再打开一个终端2:

rosrun rqt_reconfigure rqt_reconfigure

打开后将camera->stereo_module中的emitter_enabled设置为off(0) 。

2.2 可视化双目图像

新打开终端,运行rviz

rviz

修改Fiexd Fram 为camera_link
在这里插入图片描述

之后在里面add rgb和双目对应的topic,/camera/color/image_raw、/camera/infra1/image_rect_raw、/camera/infra2/image_rect_raw展示如下:
在这里插入图片描述录制过程参考https://www.youtube.com/watch?v=puNXsnrYWTY&app=desktop,同样注意双目图像在整个过程要包含整个标定板,同时运动不能太快,这样会造成图像过于模糊,在前后左右上下方向来回移动,录制大概90s以上。

2.3 修改相机播包帧数

调整imu和双目topic的发布频率以及以新的topic名发布它们,其中双目图像的发布频率改为20Hz,imu发布频率改为200Hz

rosrun topic_tools throttle messages /camera/infra1/image_rect_raw 20.0 /infra_left
rosrun topic_tools throttle messages /camera/infra2/image_rect_raw 20.0 /infra_right
rosrun topic_tools throttle messages /camera/imu 200.0 /imu

2.4 录制数据

rosbag record -O imu_stereo.bag /infra_left /infra_right /imu

imu_stereo.bag为录制数据

3. kalibr 程序标定

source /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/devel/setup.bash

cd  /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace

rosrun kalibr kalibr_calibrate_imu_camera \
--bag  /home/lessle6/imu_stereo.bag \
--cam /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/chain.yaml \
--imu /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/imu.yaml \
--target /home/lessle6/Project/1Ahahahgraduation/Calib/kalibr_workspace/data/april_6x6_A4.yaml \
--bag-from-to 2 146 \
--show-extraction

4. 标定结果

在这里插入图片描述

四、修改VINS的yaml文件

1. realsense_stereo_imu_config.yaml

%YAML:1.0

#common parameters
#support: 1 imu 1 cam; 1 imu 2 cam: 2 cam; 
imu: 1         
num_of_cam: 2  

imu_topic: "/camera/imu"
image0_topic: "/camera/infra1/image_rect_raw"
image1_topic: "/camera/infra2/image_rect_raw"
output_path: "/home/zj/output/"

cam0_calib: "left.yaml"
cam1_calib: "right.yaml"
image_width: 848
image_height: 480
   

# Extrinsic parameter between IMU and Camera.
estimate_extrinsic: 1   # 0  Have an accurate extrinsic parameters. We will trust the following imu^R_cam, imu^T_cam, don't change it.
                        # 1  Have an initial guess about extrinsic parameters. We will optimize around your initial guess.
#相机到imu的变换矩阵
body_T_cam0: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [ 0.99981999,  0.00163688 , 0.0189025 , -0.00089318,
 -0.00146025 , 0.99995518 ,-0.00935466  ,0.00021664,
 -0.01891696,  0.00932537 , 0.99977757  ,0.00065183,
  0.        ,  0.      ,    0.     ,     1.         ]


body_T_cam1: !!opencv-matrix
   rows: 4
   cols: 4
   dt: d
   data: [0.99977591, -0.0005314 ,  0.0211626,   0.0949139 ,
 0.00066889 , 0.99997871, -0.00649049, -0.00027429,
 -0.0211587 ,  0.00650319 , 0.99975498 , 0.0021304 ,
 0.   ,       0.       ,   0.      ,    1.    ]


#Multiple thread support
multiple_thread: 1

#feature traker paprameters
max_cnt: 150            # max feature number in feature tracking
min_dist: 30            # min distance between two features 
freq: 10                # frequence (Hz) of publish tracking result. At least 10Hz for good estimation. If set 0, the frequence will be same as raw image 
F_threshold: 1.0        # ransac threshold (pixel)
show_track: 0           # publish tracking image as topic
flow_back: 1            # perform forward and backward optical flow to improve feature tracking accuracy

#optimization parameters
max_solver_time: 0.04  # max solver itration time (ms), to guarantee real time
max_num_iterations: 8   # max solver itrations, to guarantee real time
keyframe_parallax: 10.0 # keyframe selection threshold (pixel)

#imu parameters       The more accurate parameters you provide, the better performance
acc_n: 1.7574789006499388e-02        # accelerometer measurement noise standard deviation. #0.2   0.04
gyr_n: 1.8351398172861977e-03      # gyroscope measurement noise standard deviation.     #0.05  0.004
acc_w: 5.3103238396236881e-04      # accelerometer bias random work noise standard deviation.  #0.002
gyr_w: 1.3154828587252936e-05    # gyroscope bias random work noise standard deviation.     #4.0e-5
g_norm: 9.78921469         # gravity magnitude

#unsynchronization parameters
estimate_td: 1                      # online estimate time offset between camera and imu
td:0           # initial value of time offset. unit: s. readed image clock + td = real image clock (IMU clock)

#loop closure parameters
load_previous_pose_graph: 0        # load and reuse previous pose graph; load from 'pose_graph_save_path'
pose_graph_save_path: "/home/zj/output/pose_graph/" # save and load path
save_image: 0                   # save image in pose graph for visualization prupose; you can close this function by setting 0 

2 left.yaml

%YAML:1.0
---
model_type: PINHOLE
camera_name: camera
image_width: 848
image_height: 480
distortion_parameters:
   k1: 0.007017020579074508
   k2: 0.013075992589794715
   p1: -0.0037765402744058983
   p2: -0.0005132729806830811
projection_parameters:
   fx: 437.44398421645786
   fy: 437.72233141976125
   cx: 430.95314113824475
   cy: 231.60352693067642

3 right.yaml

%YAML:1.0
---
model_type: PINHOLE
camera_name: camera
image_width: 848
image_height: 480
distortion_parameters:
   k1: 0.018914793505132418
   k2: -0.0026985776594766744
   p1: -0.0025567868843695152
   p2: 0.00645205341789554
projection_parameters:
   fx: 432.2163360247922
   fy: 431.7881804665646
   cx: 433.3636493084969
   cy: 232.14028787830168

五、 运行VINS-FUSION

启动vins

source /home/lessle6/Project/Vins-Fusion-ws/devel/setup.bash

rosrun loop_fusion loop_fusion_node /home/lessle6/Project/Vins-Fusion-ws/src/VINS-Fusion/config/realsense-d455/realsense_stereo_imu_config.yaml
rosrun vins vins_node /home/lessle6/Project/Vins-Fusion-ws/src/VINS-Fusion/config/realsense-d455/realsense_stereo_imu_config.yaml

启动rviz

source /home/lessle6/Project/Vins-Fusion-ws/devel/setup.bash
cd  /home/lessle6/Project/Vins-Fusion-ws
roslaunch vins vins_rviz.launch

启动相机

source /home/lessle6/Packages/RealsenseRos_ws/devel/setup.bash
roslaunch /home/lessle6/Packages/RealsenseRos_ws/src/realsense-ros/realsense2_camera/launch/rs_camera.launch

参考

https://blog.csdn.net/xiaoxiaoyikesu/article/details/105646064

https://blog.csdn.net/qq_40186909/article/details/113104595?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166312286216782391821994%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=166312286216782391821994&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~pc_rank_v39-2-113104595-null-null.142%5Ev47%5Epc_rank_34_2,201%5Ev3%5Econtrol_2&utm_term=realsense%20%E7%9A%84%20D%20%E7%9F%A9%E9%98%B5&spm=1018.2226.3001.4187

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Realsence D455标定并运行Vins-Fusion 的相关文章

  • Keil使用ST-Link下载程序总是 Internal command error 解决方法

    Keil下载程序 xff0c 死活都是Internal command error xff0c 让人几近崩溃 网上选择 Pre Reset办法 按住复位键这些都没用 此处解决办法 xff1a ST Link与板子不仅需要连接 GND SCK
  • 拉普拉斯变换解微分方程

    使用拉普拉斯变换解一阶 二阶微分方程 一 核心内容 拉氏变换对 时域s域 e a t
  • 采样频率变化时,滤波器的性能会变差吗?

    一 问题来源 飞控需要采集加速度计与陀螺仪数据进行低通滤波 xff0c 一般以1kHz频率采集 xff0c 即采样频率为1kHz 使用二阶巴特沃兹低通滤波器进行滤波 xff0c 截至频率可设置为20Hz 滤波器的输入参数一般是采样频率 截至
  • Carsim2019与Simulink (Matlab2018b)联合仿真成功(超详细)

    首先 xff0c 想吐槽一下 xff0c 一些教程和英文帮助文档一样 xff0c 逐个介绍界面按钮 xff0c 人都被转晕了也进入不了主题 终于 xff0c 看了UP主自动驾驶废材的 xff1a 从零开始搭建carsim与simulink联
  • 基于xr871机器人故事机设计原理和方法 图灵后台

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • GPS速度测量

    GPS使用M8N xff0c 放在地上一两分钟 xff0c 举起来 xff0c 放下 xff0c 举高走一走 xff0c 放下 可见 xff0c GPS可以测量NED系下各周速度 但是 z 轴速度收敛慢 xff0c 不是很准确 也可能GPS
  • GPS经纬度转距离

    function span class token punctuation span pN span class token punctuation span pE span class token punctuation span spa
  • STM32 移植Mavlink,Keil报错

    STM32 移植Mavlink xff0c Keil报一大堆错误 span class token keyword static span span class token keyword void span span class toke
  • Linux之串口接收响应试验

    问题来源 仪表作为从机时 xff0c 需要分析仪表的响应速度 但发现采用linux或windows开发时发现串口响应较慢 在网上没有查到相关的资料 xff0c 于是在手上的linux产品上进行试验 xff08 iMAX6Q xff09 试验
  • 用TCP模拟网页服务器开发记录

    一 所需要撑握的技术 xff1a 1 TCP 下的socket应用 2 多线程动态创建 xff0c 实现多个客户端的同时访问 3 了解html的语法结构和javaScript的开发 4 了解http数据包格式 包括json get post
  • 安装docker

    安装docker 参考网站 xff1a https docs docker com install linux docker ce ubuntu sudo apt get update sudo apt get install apt tr
  • 自动化控制行业常见面试问题分析

    一 系统建模 xff0c 二 经典控制与现代控制 xff0c 三 自动检测 xff0c 四 过程控制 xff0c 五 计算机控制 xff0c 六 微机原理 xff0c 七 电子技术综合 xff0c 八 电机控制 xff0c 九 专业英语名词
  • glibc 下载及编译

    glibc下载站点 http ftp gnu org pub gnu glibc 下载点 http www gnu org software libc bugs html 官网 uclibc下载站点 https downloads ucli
  • 树莓派镜像制作

    前言 本文主要讲诉如何制作一个树莓派的启动镜像 xff08 本人使用的是4b 43 xff09 镜像下载 镜像下载64bit xz文件大小在756M xff0c 解压后镜像3 95个G 上面的镜像下载比较慢 xff0c 可以使用国内的镜像源
  • 推荐算法评价指标(ACC、查全率、查准率、F1-Score、ROC、AUC,P-R)

    文章目录 混淆矩阵二级指标三级指标F1 ScoreROC AUC PR曲线 推荐系统的评价指标很多 xff0c 今天介绍 xff1a 准确率 ACC 查准率 P精确率 查全率 R召回率 F1 score AUC值 xff0c ROC曲线 P
  • 规划xr871实现儿童故事机的基本功能

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • Maven项目中pom文件的parent标签报错如何解决 (eclipse中创建springboot项目时,pom中的parent标签报错)

    原因 xff1a maven的settings文件不能从连网下载依赖jar包 解决办法 xff1a 在Maven修改settings文件内容 etting配置镜像仓库 span class token tag span class toke
  • Android中Paint字体的灵活使用

    在Android开发中 xff0c Paint是一个非常重要的绘图工具 xff0c 可以用于在控制台应用程序或Java GUI应用程序中绘制各种形状和图案 其中 xff0c Paint setText 方法是用于设置Paint绘制的文本内容
  • 像素类型

    不同的图像有不同的像素类型 xff0c 不过对于不同的像素类型 xff0c 需要在模板参数传入不同的值 首先像素的数据类型包括CV 32U xff0c CV 32S xff0c CV 32F xff0c CV 8U xff0c CV 8UC
  • 20220806 美团笔试五道编程题(附AK题解)

    恭喜发现宝藏 xff01 微信搜索公众号 TechGuide 回复公司名 xff0c 解锁更多新鲜好文和互联网大厂的笔经面经 作者 64 TechGuide 全网同名 点赞再看 xff0c 养成习惯 xff0c 您动动手指对原创作者意义非凡

随机推荐

  • Ubuntu入门(二) 用户权限 文件权限 磁盘管理 连接文件

    目录 1 用户权限管理1 1 用户系统1 2 创建用户和用户组命令1 3 权限管理1 4 权限管理命令 2 磁盘管理2 1 磁盘管理基本概念2 2 磁盘管理命令 3 连接文件3 1 硬连接3 2 符号连接 xff08 软连接 xff09 1
  • git clone指定分支代码

    全克隆 xff1a span class token function git span clone span class token operator lt span url span class token operator gt sp
  • Kali Linux 镜像 各个版本之间的区别

    按处理器架构来划分的话 xff0c 有 64 bit 32 bit armhf armel等版本 加light的是轻量版 e17 Mate LXDE等是不同的桌面环境 Kali Linux 2016 2 支持GNOME KDE Mate L
  • ubuntu16.04下px4环境搭建与固件编译

    px4官网提供了一个批处理方式搭建px4开发环境 xff0c 十分好用 xff0c 按照官网步骤 1 sudo usermod span class hljs a span G dialout span class hljs variabl
  • Top-down与Bottom-up

    简析 顾名思义 xff0c top down是由上至下 xff0c 而bottom up由下至上的意思 其实 xff0c 就我对本行业的理解 xff0c top 61 目的 objective xff0c bottom 61 方法细节 ac
  • MATLAB GPU加速

    以前使用matlab 的时候 xff0c 很多人都用过里面的并行工具箱 xff0c 用的最多的应该就是parfor 实际上 xff0c matlab里面已经有不少工具箱里面都有了支持GPU加速的函数 使用matlab 43 GPU加速的前提
  • 论如何最低成本进入 智能家居、人工智能、安卓主板 的领域

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • 为什么说枚举单例模式是最安全的?

    单例模式有很多种 xff0c 如 xff1a 饿汉式 线程安全 xff0c 但是浪费资源 xff1b 懒汉式 懒汉式又分为 xff0c 同步锁单例模式 性能较差 xff1b 双重判断同步锁单例模式 静态内部类单例模式 以上单例模式大多数都是
  • Qt - 信号与槽的连接方式

    信号与槽的连接方式主要有以下5种方式 xff1a 先看代码 xff1a ifndef MYOBJECT H define MYOBJECT H include lt QObject gt class MyObject public QObj
  • vslam流程框架介绍

    平常扫地机产品上经常听说使用了vslam技术 xff0c 那么这个vslam到底是什么呢 xff0c 我们下面一起来看看 vslam是什么 xff1f VSLAM 即 Visual Simultaneous Localization and
  • linux出现oom分析流程

    背景 linux内核有个机制叫OOM killer Out Of Memory killer xff0c 当系统需要申请内存却申请不到时 xff0c OOM killer会检查当前进程中占用内存最大者 xff0c 将其杀掉 xff0c 腾出
  • 浅入浅出linux中断子系统

    浅入浅出linux中断子系统 xff0c 如需深入 xff0c 直接跳转重要参考章节 什么是中断 xff1f 当CPU被某些信号触发 xff0c CPU暂停当前工作 xff0c 转而处理信号的事件 xff0c 简单的称它为中断 xff0c
  • ROS2交叉编译操作

    ROS2移植过程 在移植ROS2之前 先确认需要移植的版本以及其对应的依赖 这些信息可以在 ROS 2 Releases and Target Platforms 中有介绍 可依据自身需要使用的平台 参考该链接进行选择 下面以ROS2 Hu
  • gstreamer学习笔记---pad定义、连接、流动

    pad相当于element的接口 xff0c 各个element就是通过pad连接进行传输数据 xff0c 同时pad会通过caps限制特定的数据类型通过 xff0c 只有当两个pad的caps数据类型一致时才可以建立连接 那么pad在el
  • gstreamer学习笔记---gst-omx

    一 openMAX理解1 gst omx是基于openMAX开发的插件 xff0c 所以在介绍gst omx之前 xff0c 我们先了解一下openMAX openMAX xff1a open media acceleration xff0
  • csi mipi信号解析

    1 传输模式 LP xff08 Low Power xff09 模式 xff1a 用于传输控制信号 xff0c 最高速率 10 MHz HS xff08 High Speed xff09 模式 xff1a 用于高速传输数据 xff0c 速率
  • 程序调试方法

    记录初衷 xff1a 遇到问题 xff0c 按照一套方法 xff0c 把问题化解 xff0c 逐渐的内化为心法 xff0c 形成经验 xff0c 这就是成长的过程 就好比吃的猪肉 xff0c 经过消化 分解 吸收后变成了自己肉 程序分为三种
  • 博客八:基于xr871实现wifi音响产品

    原创 xff1a http blog csdn net kylin fire zeng xff0c 欢迎转载分享 xff0c 共同进步 xff0c 但请注明出处啊 xff0c 尊重他人成果
  • 用 Docker 部署一个 Python 应用

    Flask项目 这里为了演示的方便 xff0c 我们就写一个简单的Flask项目 xff0c 代码如下 from flask import Flask app 61 Flask name 64 app route 39 39 def ind
  • Realsence D455标定并运行Vins-Fusion

    文章目录 一 双目相机标定1 标定板准备1 1 打印标定板1 2 标定板信息原始pdf的格子参数是 xff1a 调整后的格子参数是 xff1a 2 左右目相机数据准备2 1 修改rs camera launch内容2 2 关闭结构光2 3