使用kaliber与imu_utils进行IMU、相机+IMU联合标定

目录

1 标定工具编译

1.1 IMU标定工具 imu_utils

1.2 相机标定工具 kaliber

2 标定数据录制

3 开始标定

3.1 IMU标定

3.2 相机标定

3.3 相机+IMU联合标定

4 将参数填入ORBSLAM的文件中


1 标定工具编译

1.1 IMU标定工具 imu_utils

        标定IMU我们使用imu_utils软件进行标定:

        首先我们安装标定软件的依赖项:Eigen、Ceres

        通过命令行安装Eigen3.3.4即可

sudo apt-get install libdw-dev
sudo apt-get install libeigen3-dev

        安装Ceres1.14.0的依赖项:

sudo apt-get install liblapack-dev libblas-dev libeigen3-dev libgflags-dev libgoogle-glog-dev
sudo apt-get install liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev

       安装Ceres1.14.0

wget -O ~/Downloads/ceres.zip https://github.com/ceres-solver/ceres-solver/archive/1.14.0.zip
cd ~/Downloads/ && unzip ceres.zip -d ~/Downloads/
cd ~/Downloads/ceres-solver-1.14.0
mkdir ceres-bin && cd ceres-bin
cmake ..
sudo make install -j4

        这些安装之后,我们开始安装imu_utils。

        首先为我们要先在ROS环境下编译code_utils,否则会报错:

cd ..catkin_imu/src
git clone https://github.com/gaowenliang/code_utils 
cd ..
catkin_make 

        运行这个步骤会报错,找不到backward.hpp这个头文件:

        解决方案:

        把src/code_utils/CMakeList.txt中,添加路径:include_directories(“include/code_utils”)

        如下图:

        安装imu_utils:

cd ..catkin_imu/src
git clone https://github.com/gaowenliang/imu_utils
cd ..
catkin_make #编译imu_utils

        这样就编译成功了:

1.2 相机标定工具 kaliber

        标定IMU+相机与相机的标定我们使用kaliber软件进行标定:

        先进行依赖安装:

sudo apt install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev
sudo apt install ros-noetic-vision-opencv ros-noetic-image-transport-plugins ros-noetic-cmake-modules
sudo apt install python-software-properties software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython 
sudo apt install libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev 
sudo apt install build-essential python-dev libxml2 libxml2-dev zlib1g-dev bison flex libigraph0-dev texlive-binaries
sudo pip install -i https://pypi.tuna.tsinghua.edu.cn/simple python-igraph
sudo pip install python-igraph --upgrade
sudo apt-get install python-setuptools python-rosinstall ipython libeigen3-dev libboost-all-dev doxygen libopencv-dev ros-melodic-vision-opencv ros-melodic-image-transport-plugins ros-melodic-cmake-modules python-software-properties software-properties-common libpoco-dev python-matplotlib python-scipy python-git python-pip ipython libtbb-dev libblas-dev liblapack-dev python-catkin-tools libv4l-dev

        编译:

kaliber下载网站icon-default.png?t=N7T8https://gitcode.net/mirrors/ethz-asl/kalibr        从上述网址下载Kaliber,正常编译即可。不会出什么问题。

2 标定数据录制

        IMU数据:

        IMU静置2小时,周围不要有振动,录制完成后利用下面的脚本转化成rosbag的格式。

        这里是一个可以使用的转化脚本:将文本的IMU信息转化为了sensor_msgs/Imu的信息

"""
Function: convert rawdata into rosbag
Author: Yiheng Zhao
Date: 2023.10.11
"""
import math
import os
import cv2
import numpy as np
from vp_config import ROOT_PATH
from utility import ReadQapData, fix_filenameimport rospy
import rosbag
from sensor_msgs.msg import Imu, Image
from cv_bridge import CvBridge
import openpyxl
import timeif __name__ == "__main__":############################# rosbag config###########################save_path = os.path.join(ROOT_PATH, "imu.bag")bag = rosbag.Bag(save_path, 'w')############################# main function############################# read dataworkbook = openpyxl.load_workbook(r'D:\projectslam\off_data_zhuan_ros\raw_data\20231010_180949.xlsx')sheet = workbook.active## begin frame by frame processi = 0for row in sheet.iter_rows(values_only=True):#create new messageimu_msg = Imu()imu_msg.header.frame_id = "base_link"imu_msg.header.seq = itimestamp = time.time()formatted_timestamp = "{:.9f}".format(timestamp)secs = int(formatted_timestamp.split('.')[0])nsecs = int(formatted_timestamp.split('.')[1])imu_msg.header.stamp.secs = secsimu_msg.header.stamp.nsecs = nsecsimu_msg.linear_acceleration.x = float(row[9])imu_msg.linear_acceleration.y = float(row[10])imu_msg.linear_acceleration.z = float(row[11])print("acceleration x is %f" % imu_msg.linear_acceleration.x)print("acceleration y is %f" % imu_msg.linear_acceleration.y)print("acceleration z is %f" % imu_msg.linear_acceleration.z)imu_msg.angular_velocity.x = ( float(row[6])/ 180.0 * 3.1415926)imu_msg.angular_velocity.y = ( float(row[7])/ 180.0 * 3.1415926)imu_msg.angular_velocity.z = ( float(row[8])/ 180.0 * 3.1415926)print("angular x is %f" % imu_msg.angular_velocity.x)print("angular y is %f" % imu_msg.angular_velocity.y)print("angular z is %f" % imu_msg.angular_velocity.z)bag.write(topic="/imu/data_raw", msg=imu_msg)i += 1time.sleep(0.033)bag.close()

        我们得到了一个仅含IMU数据的bag。

        相机数据录制:

        缓慢移动相机,且相机和IMU之间不要发生相对运动,将相机左右移动、上下移动、旋转移动充分激励IMU,录制三分钟左右即可。

        我们得到一个bag,包含IMU和相机数据:

        下面这个脚本是合并IMU、相机图像数据的脚本:

"""
Function: convert rawdata into rosbag
Author: Yiheng Zhao
Date: 2023.10.11
"""
import math
import os
import cv2
import numpy as np
from vp_config import ROOT_PATH
from utility import ReadQapData, fix_filenameimport rospy
import rosbag
from sensor_msgs.msg import Imu, Image
from cv_bridge import CvBridge
import openpyxl
import timeif __name__ == "__main__":############################# rosbag config###########################save_path = os.path.join(ROOT_PATH, "imu_cam.bag")bag = rosbag.Bag(save_path, 'w')############################# main function############################# read data image# 指定存储图片的目录路径image_directory = r'D:\projectslam\off_data_zhuan_ros\qap_out_data\image'# 初始化一个空列表来存储图片路径image_paths = []# 遍历目录下的所有文件for root, dirs, files in os.walk(image_directory):for file in files:# 检查文件扩展名是否为图片格式(例如,这里假设是以.jpg、.png、.jpeg为扩展名的图片)if file.lower().endswith(('.jpg', '.png', '.jpeg')):# 使用os.path.join()将目录和文件名组合成完整的文件路径image_path = os.path.join(root, file)# 将图片路径添加到列表中image_paths.append(image_path)print(image_paths)## read data  imuworkbook = openpyxl.load_workbook(r'D:\projectslam\off_data_zhuan_ros\qap_out_data\imu.xlsx')sheet = workbook.active## begin frame by frame processi = 0for row in sheet.iter_rows(values_only=True):# create new messageimu_msg = Imu()imu_msg.header.frame_id = "base_link"imu_msg.header.seq = itimestamp = time.time()formatted_timestamp = "{:.9f}".format(timestamp)secs = int(formatted_timestamp.split('.')[0])nsecs = int(formatted_timestamp.split('.')[1])imu_msg.header.stamp.secs = secsimu_msg.header.stamp.nsecs = nsecsimu_msg.linear_acceleration.x = float(row[9])imu_msg.linear_acceleration.y = float(row[10])imu_msg.linear_acceleration.z = float(row[11])print("acceleration x is %f" % imu_msg.linear_acceleration.x)print("acceleration y is %f" % imu_msg.linear_acceleration.y)print("acceleration z is %f" % imu_msg.linear_acceleration.z)imu_msg.angular_velocity.x = (float(row[6]) / 180.0 * 3.1415926)imu_msg.angular_velocity.y = (float(row[7]) / 180.0 * 3.1415926)imu_msg.angular_velocity.z = (float(row[8]) / 180.0 * 3.1415926)print("angular x is %f" % imu_msg.angular_velocity.x)print("angular y is %f" % imu_msg.angular_velocity.y)print("angular z is %f" % imu_msg.angular_velocity.z)# 图像 msgimage = cv2.imread(image_paths[i])my_bridge = CvBridge()img_msg = my_bridge.cv2_to_imgmsg(cvim=image)img_msg.header.frame_id = "base_link"img_msg.header.seq = iimg_msg.header.stamp.secs = secsimg_msg.header.stamp.nsecs = nsecsbag.write(topic="/image/data_raw", msg=img_msg)bag.write(topic="/imu/data_raw", msg=imu_msg)i += 1time.sleep(0.033)bag.close()

        下面开始标定。

3 开始标定

3.1 IMU标定

        对于6轴的IMU,我们修改这个文件:

        /bag/catkin_imu/src/imu_utils/launch/tum.launch

        修改内容如下:

        修改我们IMU的录制时间IMU话题

<launch><node pkg="imu_utils" type="imu_an" name="imu_an" output="screen"><param name="imu_topic" type="string" value= "/imu/data_raw"/><param name="imu_name" type="string" value= "custom_imu_nrxdwcs"/><param name="data_save_path" type="string" value= "$(find imu_utils)/imu666/"/><param name="max_time_min" type="int" value= "90"/><param name="max_cluster" type="int" value= "50"/></node></launch>

        修改imu_topic为我们包的IMU录制话题:

        修改imu_name为我们IMU的名字:这里我随便起得名,和客户名字有关系.....

        修改max_time_min为我们IMU录制的时间:我这里是从09:55 - 11:30,我选择取前90分钟的数据。

        修改max_cluster为采样频率,由于我录制不够2小时,因此修改采样频率为50HZ(增大了采样频率)。

        修改data_save_path为我们标定完成的路径,即标定文件存放的位置。

        下面开始标定:

        打开标定IMU的ROS节点:

liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:~/Downloads$ cd /bag/catkin_imu/
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/bag/catkin_imu$ source devel/setup.bash 
liuhongwei@liuhongwei-Legion-Y9000P-IRX8H:/bag/catkin_imu$ roslaunch imu_utils tum.launch 

        打开节点后,我们以200倍速度播包。

 rosbag play imu.bag -r 200

        播包完毕后,我们IMU标定就完成了。

        标定文件存储在我们指定的路径中。

        第一个文件就是我们需要的IMU参数。

3.2 相机标定

        我们先需要下载标定版,这里我推荐带编码信息的棋盘格标定板:

标定版下载链接icon-default.png?t=N7T8https://doc-08-5c-docs.googleusercontent.com/docs/securesc/2nlhb7mn3rh7ilhvic8i1i0lcg6lvbo5/kcic7lcag2vqbkks6cg7sa20rnhoqc5r/1696916775000/08341388560495021951/08634034057607032407/1DqKWgePodCpAKJCd_Bz-hfiEQOSnn_k0?e=download&ax=AA75yW7BQ9IbcKRqN7F30tCa7QeNZmYUtrGfL0rCKL3H-BPWurSVMZ8SlMyN7l7mcABbUuU4t6LKNh1GUv6oaKYdz8fhFhpvrys81_Tr-LK6b6VaHTYZrKdK1Xl-7jalz-zRTbOGJI0B_pxlK-zYjlJ5qptj6eJa12S-A520-9oO-QwEJa2FTA10ED_NooTkPqK2nYqfulra1G-7X7By1KB5iB1aK6goViNqPnnFNBWaSyNKb2GBEDPdMgTphe8yFZ9OSGtrzNW9zdbAdM-Ohm-JP34_llYMgTzRxwqKX9ltC34xf4bCU83vDIOfrjqZHos9XkPmWahZuxtJxZGuRDWIBKhOb1P8y6qOVpvRP-hNZB4z8uPyiQ-Qu8q5xqGH1oT6kuQONiCAm1kDI0c0wp4lBi0DMV_5HHBnOrS7x26nTrsWYFAsqdjcx0awomsAlDtSVMc4zZ8pQJDeoV7Qa19VAC-9BidANzgAca2TyLven2FHj3ogrAz-2nlHDOK6OHT3Rzjdd9I5UNRg3ZQUP5g8SEXUo3qHDM0u1n1PKoaZKoRlFaYTYyZKMTqnhOBiBuyjqNB8LRCIteoBC335dRHdjRSzwlOD79bLwQGjXw_ItlDo_6YUV1ZM8nep9kzzcLNP34d_MUMNp6rSBHyfug5jobqcdtHmcWFgJuf2b0u6H2UWHP-0WRmjbHWfdbDQKK8vEmgRlndGnk6gxL8HqL_PQYO0yJ6ddagbHBztZZCZbXSl_KUPYDVd212u-vsoc6BsgYoj200XU7vQE3AfekgV0RLJNzeL0RCIT7ghfHQIBNXFmfTq8Y4byyh5-wnlqTvHi5WgCsF6x9_2sC6FVdZtvOxmpBlufS_eT9FaWu-cNk30Kor_OnQUv8RMLO9mcJbtzw&uuid=51452ed9-1b64-4adc-88d9-65bedb46fdfc&authuser=0&nonce=5kor9vi5br1lg&user=08634034057607032407&hash=7qn0q7b6strcok04upeb271oq7qcpf6c        我们需要制作参数文档,参数文档的数学信息如下:

原始pdf的格子参数是:
6*6的格子
大格子边长:5.5cm
小格子边长:1.65cm
小格子与大格子边长比例:0.3调整后的格子参数是:
大格子边长:2.2cm
小格子边长:0.66cm
小格子与大格子边长比例:0.3

        然后如果你是打印成了A4纸的形式,可以参考我的参数文档: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.285714285714   #ratio of space between tags to tagSize
codeOffset: 0            #code offset for the first tag in the aprilboard

        现在我们进行针孔相机的标定:

rosrun kalibr kalibr_calibrate_cameras --target '/bag/catkin_kaliber/src/Kalibr/a4.yaml' --bag /home/liuhongwei/Desktop/imu_cam.bag --models pinhole-radtan --topics /image/data_raw --bag-from-to 10 100 --show-extraction 

        然后就开始了标定工作:

        解释一下具体的参数:

        --target:标定版的参数,就是我们刚才写的那个

        --bag:包的路径

        --models:针孔相机模型选这个

        --topics:图像信息的话题

        --bag-from-to:选取10-100s的图像进行标定,这个可以按照自己需求改,一般都是前几秒比较模糊就不要了

        --show-extraction:展示图形化界面

        标定完成后,会输出几个文件:

        这个就是我们相机的内参了。

        标定时可能会遇到这个问题,这是因为相机焦距太大了,我们需要设置个初始值:

Initialization of focal length failed. You can enable manual input by setting ‘KALIBR_MANUAL_FOCAL_LENGTH_INIT’.

        遇到这种情况,我们先终端中设置变量 KALIBR_MANUAL_FOCAL_LENGTH_INIT = 1 然后程序运行时手动给相机设置初始焦距。

3.3 相机+IMU联合标定

        这个我们事先制作几个文件:

        1.imu的配置信息,我们取名为imu.yaml,这个就是我们把我们之前标定的IMU信息写入这个文件就行:

rostopic: /imu/data_raw
update_rate: 30.0 #Hzaccelerometer_noise_density: 1.7640241083260223e-03
accelerometer_random_walk: 4.6133140085614272e-05
gyroscope_noise_density: 1.2287169549703986e-05
gyroscope_random_walk: 8.1951127134973680e-07

        图像的话题还有IMU的频率不要忘记修改。

        2.相机的内参标定信息:

        这个是3.2节中生成的文件imu_cam-camchain.yaml:

cam0:cam_overlaps: []camera_model: pinholedistortion_coeffs: [-0.34038923175502456, 0.06977055299360228, 0.015293838790916657, -0.010372561499554008]distortion_model: radtanintrinsics: [1685.169877633105, 1656.9322836449144, 997.1304121813936, 474.3184148435317]resolution: [1920, 1080]rostopic: /image/data_raw

        3.标定版文件,就是3.2中我们自己写的

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.285714285714   #ratio of space between tags to tagSize
codeOffset: 0            #code offset for the first tag in the aprilboard

        执行下面代码进行标定:

rosrun kalibr kalibr_calibrate_imu_camera --bag '/home/liuhongwei/Desktop/imu_cam.bag' --target '/bag/catkin_kaliber/src/Kalibr/a4.yaml'  --cam '/bag/catkin_kaliber/src/Kalibr/imu_cam-camchain.yaml'  --imu '/bag/catkin_kaliber/src/Kalibr/imu.yaml' --show-extraction

        参数列表含义如下:

        --bag:数据包路径

        --target:标定版文件路径(A4.yaml)

        --cam:相机内参文件路径(mu_cam-camchain.yaml)

        --imu:IMU标定文件路径(imu.yaml)

        --show-extraction:显示标定过程

        执行如下:

        标定结束:

        结束后生成标定文件imu_cam-results-imucam.txt:

        标定完毕。

4 将参数填入ORBSLAM的文件中

        根据上述我们的标定结果,我们的yaml文件为:

%YAML:1.0#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------
File.version: "1.0"Camera.type: "PinHole"# Camera calibration and distortion parameters (OpenCV) 
Camera1.fx: 1685.16987763
Camera1.fy: 1656.93228364
Camera1.cx: 997.13041218
Camera1.cy: 474.31841484Camera1.k1: -0.34038923175502456
Camera1.k2: 0.06977055299360228
Camera1.p1: 0.015293838790916657
Camera1.p2: -0.010372561499554008# Camera resolution
Camera.width: 1920
Camera.height: 1080Camera.newWidth: 600
Camera.newHeight: 350# Camera frames per second 
Camera.fps: 30# Color order of the images (0: BGR, 1: RGB. It is ignored if images are grayscale)
Camera.RGB: 1# Transformation from camera to body-frame (imu)
IMU.T_b_c1: !!opencv-matrixrows: 4cols: 4dt: fdata: [0.94880513, 0.12309341, 0.27236458, 0.00027046,0.12309341, 0.98136615, 0.14754149, -0.00012572,-0.29088973, -0.10646184, 0.95081494, 0.00034056,0.0, 0.0, 0.0, 1.0]# IMU noise
IMU.NoiseGyro: 1.2287169549703986e-05 #1.6968e-04
IMU.NoiseAcc: 1.7640241083260223e-03 #2.0e-3
IMU.GyroWalk: 8.1951127134973680e-07
IMU.AccWalk: 4.6133140085614272e-05 # 3e-03
IMU.Frequency: 30.0#--------------------------------------------------------------------------------------------
# ORB Parameters
#--------------------------------------------------------------------------------------------# ORB Extractor: Number of features per image
ORBextractor.nFeatures: 1000 # 1000# ORB Extractor: Scale factor between levels in the scale pyramid 	
ORBextractor.scaleFactor: 1.2# ORB Extractor: Number of levels in the scale pyramid	
ORBextractor.nLevels: 8# ORB Extractor: Fast threshold
# Image is divided in a grid. At each cell FAST are extracted imposing a minimum response.
# Firstly we impose iniThFAST. If no corners are detected we impose a lower value minThFAST
# You can lower these values if your images have low contrast			
ORBextractor.iniThFAST: 20
ORBextractor.minThFAST: 7#--------------------------------------------------------------------------------------------
# Viewer Parameters
#--------------------------------------------------------------------------------------------
Viewer.KeyFrameSize: 0.05
Viewer.KeyFrameLineWidth: 1.0
Viewer.GraphLineWidth: 0.9
Viewer.PointSize: 2.0
Viewer.CameraSize: 0.08
Viewer.CameraLineWidth: 3.0
Viewer.ViewpointX: 0.0
Viewer.ViewpointY: -0.7
Viewer.ViewpointZ: -3.5 # -1.8
Viewer.ViewpointF: 500.0

5 Euroc单目+IMU数据集制作及跑通

        用这个脚本进行拆包:

# -*- coding: utf-8 -*-import rosbag
import csv
from sensor_msgs.msg import Imu
import os
import roslib
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
import shutildef CreateDIR():folder_name = 'bag_tum'subfolders = ['left', 'right' , 'rgb' , 'depth']if not os.path.exists(folder_name):os.makedirs(folder_name)# 在主文件夹下创建子文件夹for subfolder in subfolders:subfolder_path = os.path.join(folder_name, subfolder)if not os.path.exists(subfolder_path):os.makedirs(subfolder_path)def CreateIMUCSV(umpackbag):csvfile = open('imudata.csv', 'w')csvwriter = csv.writer(csvfile)csvwriter.writerow(['timestamp [ns]', 'w_RS_S_x [rad s^-1]', 'w_RS_S_y [rad s^-1]', 'w_RS_S_z [rad s^-1]', 'a_RS_S_x [rad m s^-2]', 'a_RS_S_y [rad m s^-2]', 'a_RS_S_z [rad m s^-2]'])for topic, msg, t in umpackbag.read_messages(topics=['/imu/data_raw']):timestamp = msg.header.stamp.to_nsec()ax = msg.linear_acceleration.xay = msg.linear_acceleration.yaz = msg.linear_acceleration.zwx = msg.angular_velocity.xwy = msg.angular_velocity.ywz = msg.angular_velocity.zcsvwriter.writerow([timestamp, wx, wy, wz, ax, ay, az])#umpackbag.close()csvfile.close()def TransIMUdatatotxt():csv_file = './imudata.csv'txt_file = './imudata.txt'with open(csv_file, 'r') as file:reader = csv.reader(file)with open(txt_file, 'w') as output_file:writer = csv.writer(output_file, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)for i, row in enumerate(reader):if i == 0:writer.writerow(['#' + cell for cell in row])  # 添加#号else:writer.writerow(row)# Save RGBD image and Save its timestamp
def Savergb(umpackbag):path = './bag_tum/rgb/'bridge = CvBridge()image_names = []txt_file = './rgbtimestamp.txt'with rosbag.Bag(bagname, 'r') as bag:for topic, msg, t in umpackbag.read_messages():if topic == "/image/data_raw":try:cv_image = bridge.imgmsg_to_cv2(msg)except CvBridgeError as e:print(e)continue#timestr = "%.9f" % msg.header.stamp.to_sec()timestr = "%.6f" % msg.header.stamp.to_sec()#timestr = "%.1f" % msg.header.stamp.to_sec()image_name = timestr#image_name = timestr.replace('.', '')  # Remove periods from the timestampcv2.imwrite(path + image_name + '.png', cv_image)  # Save as PNG formatimage_names.append(image_name)  # Add image name to the listwith open(txt_file, 'w') as f:#f.write('\n'.join(["{} rgb/{}.png".format(t, t) for t in image_names]))f.write('\n'.join(image_names))# Script Menu
# Make a folder name bag_tum include three sunfolder : left right rgb , in folder their image in it
# in python main.py folder , create imudata.scv and imudata.txt ,aim for KITTI or TUM dataset
# in python main.py folder , create timestamp.txt for image timestamp
# in python main.py folder , create timestamp.txt for image timestamp
if __name__ == '__main__':bagname = 'imu_cam.bag'umpackbag = rosbag.Bag(bagname)CreateDIR()CreateIMUCSV(umpackbag)TransIMUdatatotxt()Savergb(umpackbag)

        执行脚本后,得到如下文件 + timestamp.txt文件夹:

        我们开始制作数据集:建立一个01文件夹

        将timestamp.txt文件夹放在这里,再创建一个mav0的文件夹。

        在mav0文件夹里面创建cam0和imu0文件夹:

        cam0里面创建data文件夹,存放图像数据,这里的图像就是bag_tum/rgb目录下的图像:

        imu0里面存放的是data.csv和data.txt存放IMU数据。

        至此,我们数据集制作完毕,向程序输入参数:

        ORB词典位置、标定参数文件位置、01文件夹位置以及时间戳的位置。

        此外,还需要改一个地方:

mono_inertial_euroc.cc文件的86行改为:

        string pathImu = pathSeq + "/mav0/imu0/data.txt";

        这样就可以跑啦!

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

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

相关文章

如何使用前端包管理器(如npm、Yarn)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

Linux CentOS8安装gitlab_ce步骤

1 下载安装包 wget --content-disposition https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/8/gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm/download.rpm2 安装gitlab yum install policycoreutils-python-utilsrpm -Uvh gitlab-ce-15.0.2-ce.0.el8.x86_64.rpm3 更新配…

Stm32_标准库_12_串口_发送数据

波特率&#xff1a;约定的传输速率&#xff0c;1000bps,1s发1000位 引脚 结构 数据帧的传输特点 代码&#xff1a; #include "stm32f10x.h" // Device header #include "Delay.h" #include "OLED.h"GPIO_InitTypeDef GPIO_InitStruct; USART…

2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年建筑电工(建筑特殊工种)证考试题库及建筑电工(建筑特殊工种)试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#xff09;特种作业人员操作证考试大纲和&#xff08;质检局&#xff09;特种设备作业人…

【算法-动态规划】两个字符串的删除操作-力扣 583

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Idea创建springboot工程的时候,发现pom文件没有带<parent>标签

今天创建springboot工程&#xff0c;加载maven的时候报错&#xff1a; 这个问题以前遇到过&#xff0c;这是因为 mysql-connector-j 没有带版本号的原因&#xff0c;但是springboot的依赖的版本号不是都统一交给spring-boot-starter-parent管理了吗&#xff0c;为什么还会报错&…

Redis 集群 Redis 事务 Redis 流水线 Redis 发布订阅 Redis Lua脚本操作

Redis 集群 & Redis 事务 & Redis 流水线 & Redis 发布订阅 Redis 集群linux安装redis主从配置查看当前实例主从信息 Redis Sentinelsentinel Redis Cluster Redis 事务Redis 流水线Redis 发布订阅Redis Lua脚本操作 Redis 集群 linux安装redis 下载安装包&#…

五子棋(C语言实现)

目录 构思 1、主程序 2、初始化 3、游戏菜单 4、打印棋盘 6、玩家下棋 7、判断输赢 8、功能整合 人机下棋 完整版&#xff1a; game.h game.c text.c 测试功能代码 构思 五子棋不必多介绍了&#xff0c;大家小时候都玩过哈。 我们要通过程序实现这个小游戏&…

C++算法:最短回文串

题目 给定一个字符串 s&#xff0c;你可以通过在字符串前面添加字符将其转换为回文串。找到并返回可以用这种方式转换的最短回文串。 示例 1&#xff1a; 输入&#xff1a;s “aacecaaa” 输出&#xff1a;“aaacecaaa” 示例 2&#xff1a; 输入&#xff1a;s “abcd” 输…

Django框架集成Celery异步-【2】:django集成celery,拿来即用,可用操作django的orm等功能

一、项目结构和依赖 study_celery | --user |-- models.py |--views.py |--urls.py |--celery_task |--__init__.py |--async_task.py |-- celery.py | --check_task.py | --config.py | --scheduler_task.py | --study_celery | --settings.py | --manage.py 依赖&#xff1a…

ChatGPT

chatgpt使用地址 https://mycaht.top/#/chat 申请内测免费key https://github.com/chatanywhere/GPT_API_free 设置 接口地址设置改成 https://api.chatanywhere.com.cnAPI Key设置成申请出来的免费key 开始聊天

关于网络协议的若干问题(五)

1、DH 算法会因为传输随机数被破解吗&#xff1f; 答&#xff1a;DH 算法的交换材料要分公钥部分和私钥部分&#xff0c;公钥部分和其他非对称加密一样&#xff0c;都是可以传输的&#xff0c;所以对于安全性是没有影响的&#xff0c;而且传输材料远比传输原始的公钥更加安全。…

zabbix触发器与动作

一、触发器&#xff08;Trigger&#xff09; 1、概念&#xff1a; 在 Zabbix 中&#xff0c;触发器用于监测 Zabbix 监控系统中的各种指标和条件&#xff0c;并在特定条件满足时触发警报。&#xff08;触发器用于定义监控项的报警阈值&#xff09; 2、触发器对象&#xff1a…

2核4G服务器支持多少用户同时在线访问?卡不卡?

腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;5M带宽下载速度峰值可达640KB/秒&#xff0c;阿腾云以搭建网站为例&#xff0c;假设优化后平均大小为60KB&#xff0c;则5M带宽可支撑10个用户同时在1秒内打开网站&#xff0c;从CPU内存的角度&#xff0c;网站程序效…

【数据结构】排序--插入排序(希尔排序)

目录 一 基本思想 二 直接插入排序 三 希尔排序 一 基本思想 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为 止&#xff0c;得到一个新的有序序列 。 实际中我们玩扑克牌时&#xff0c;就用了插入排序的思想 二…

【Linux】进程概念讲解

前言 在了解进程概念之前&#xff0c;还有很多东西需要我们先了解&#xff0c;以助我们更好地学习以后的知识 大部分都是概念的东西&#xff0c;大部分大概有个印象就好了 冯诺依曼体系结构&#xff08;硬件方面&#xff09; 当代计算机的设计都是按照冯诺依曼体系结构设计…

快速修复“找不到xinput1_3.dll无法继续执行此代码的”问题的5个方法

在计算机系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;是一个重要的组件&#xff0c;它负责在程序和操作系统之间进行有效的通信。然而&#xff0c;有时候我们可能会遇到“xinput1_3.dll”文件出现问题的情况&#xff0c;这可能会导致系统不稳定甚至无法正常运行。…

Git 回退代码的两种方法对比

Git 回退代码版本 在项目的开发中&#xff0c;有时候还是会出现&#xff0c;一些误提交了一些代码&#xff0c;这时候就会想撤回提交的代码&#xff0c;在Git中有两种方法可以使用&#xff0c;现在通过对比方法比较这两种方法的区别&#xff0c;分别适用于哪些情况&#xff1f…

Flink(林子雨慕课课程)

文章目录 12.Flink12.1 Flink简介12.2 为什么要选择Flink12.3 Flink应用场景12.4 Flink技术栈、体系架构和编程模型12.5 Flink的安装和编程实战 12.Flink 12.1 Flink简介 企业的处理架构已经由传统数据处理架构和大数据Lamda架构向流处理架构演变 Flink实现了Goole Dataflow…

区块链的两个核心概念之一签名, 另一个是共识.

Alice的公私钥&#xff0c; 签名和验证签名仅仅确定了Alice对数字资产A所有权的宣言. 之后, Bob也可以用自己的私钥对资产A进行签名宣誓所有权。区块链中叫双花&#xff0c;即重复宣称所有权&#xff0c; 也称重复花费交易。这时候需要共识算法(集体成员pow或委员会代表pos监督…