U-VIP-SLAM

📅 发布时间:2026/7/7 12:56:01 👁️ 浏览次数:
U-VIP-SLAM
U-VIP-SLAM复现环境ubuntu20.04ROS 1 noeticOpencv3.4.8PangolinBoost 1.71.0.0数据集硬件配置Depthtopic/barometer_node/depthsensor_msgs/FluidPressure 深度/气压计Imagetopic/camera/image_rawsensor_msgs/Image 图像IMUtopic/rtimulib_node/imusensor_msgs/Imu 惯性测量单元1.按照官网教程安装依赖2.编译Thirdparty中的g2o和DboW23.编译U-VIP_SLAM目录如下/home/lhf/U-VIP-SLAM_ws/src/U-VIP-SLAMcd/home/lhf/U-VIP-SLAM_ws/src/U-VIP-SLAMmkdirbuildcdbuild cmake..-DROS_BUILD_TYPERelease-DPYTHON_EXECUTABLE/usr/bin/python3make-j164.下载BagFromImages不是很好用不如下面实验部分的py脚本cd/home/lhf/U-VIP-SLAM_ws/srcgitclone https://github.com/raulmur/BagFromImages.git BagFromImagescdBagFromImagesmkdirbuildcdbuildexportROS_PACKAGE_PATH/home/lhf/U-VIP-SLAM_ws/src:$ROS_PACKAGE_PATHcmake.-DPYTHON_EXECUTABLE/usr/bin/python3# /home/lhf/U-VIP-SLAM_ws/src/BagFromImages/main.cccv::Mat imcv::imread(filenames[i], CV_LOAD_IMAGE_COLOR);# 应改为cv::Mat imcv::imread(filenames[i], cv::IMREAD_COLOR);# 修改cmakelistscmake_minimum_required(VERSION2.8)include($ENV{ROS_ROOT}/core/rosbuild/rosbuild.cmake)project(BagFromImages)rosbuild_init()# 修改1:find_package(OpenCV3REQUIRED)# 修改2:include_directories(${OpenCV_INCLUDE_DIRS})set(EXECUTABLE_OUTPUT_PATH${PROJECT_SOURCE_DIR}/bin)rosbuild_add_executable(${PROJECT_NAME}main.cc Thirdparty/DLib/FileFunctions.cpp)# 修改3target_link_libraries(${PROJECT_NAME}console_bridge${OpenCV_LIBS})#-------------------source~/opencv_bridge/devel/setup.bash# 参考U-VIP_SLAM make -j16注意步骤中第2步makerosrun BagFromImages BagFromImages PATH_TO_IMAGES IMAGE_EXTENSION FREQUENCY PATH_TO_OUPUT_BAG注意U-VIP_SLAM cmake前需先进行以下步骤1.export ROS_PACKAGE_PATH/home/lhf/U-VIP-SLAM_ws/src/U-VIP-SLAM:$ROS_PACKAGE_PATH2.更新软件源sudorosdep initsudorosdep update注意U-VIP_SLAM make -j16前需先进行以下步骤1.手动下载xfeatures2d模块gitclone https://github.com/opencv/opencv_contrib.gitsudomv/home/lhf/download/opencv_contrib/modules/xfeatures2d /usr/local/include/opencv2/sudocp/usr/local/include/opencv2/xfeatures2d/include/opencv2/xfeatures2d /usr/local/include/opencv2/xfeatures2d2.手动下载适合Opencv3.4.8版本的cv_bridge在主目录工作空间gitclone https://github.com/mapping520/cv_bridge.git# 修改cv_bridge的cmakelistsset(OpenCV_DIR/usr/local/share/OpenCV)# 或者你的 OpenCV 3.4.8 build 目录find_package(OpenCV3.4.8 REQUIRED)#find_package(Boost REQUIRED python3)都修改为以下代码find_package(Boost REQUIRED python38)cd/home/lhf/opencv_bridge catkin_make-DPYTHON_EXECUTABLE/usr/bin/python3-DPYTHON_INCLUDE_DIR/usr/include/python3.8-DPYTHON_LIBRARY/usr/lib/x86_64-linux-gnu/libpython3.8.so# 编译成功后终端输入ldd ~/workspace(实际名称为准)/devel/lib/libcv_bridge.so|grepopencv# 终端输出以下内容即可下一步libopencv_imgcodecs.so.3.4/home/lhf/opencv-3.4.8/build/lib/libopencv_imgcodecs.so.3.4(0x00007f413f319000)libopencv_imgproc.so.3.4/home/lhf/opencv-3.4.8/build/lib/libopencv_imgproc.so.3.4(0x00007f413dac9000)ibopencv_core.so.3.4/home/lhf/opencv-3.4.8/build/lib/libopencv_core.so.3.4(0x00007f413c9c5000)ng520/cv_bridge3.编译U-VIP-SLAM# 修改U-VIP-SLAM的cmakelists# 修改点 1:set(OpenCV_DIR/home/lhf/opencv-3.4.8/build)find_package(OpenCV3.4REQUIRED)message(STATUSOpenCV_INCLUDE_DIRS:${OpenCV_INCLUDE_DIRS})message(STATUSOpenCV_LIBS:${OpenCV_LIBS})# 修改点 2include_directories(${OpenCV_INCLUDE_DIRS}# --- 必须加这一行且放在第一位${PROJECT_SOURCE_DIR}${EIGEN3_INCLUDE_DIR}${Pangolin_INCLUDE_DIRS}${CHOLMOD_INCLUDE_DIR}${PCL_INCLUDE_DIRS})# 修改点 3:target_link_libraries(${PROJECT_NAME}/home/lhf/opencv-3.4.8/build/lib/libopencv_core.so /home/lhf/opencv-3.4.8/build/lib/libopencv_highgui.so /home/lhf/opencv-3.4.8/build/lib/libopencv_imgproc.so /home/lhf/opencv-3.4.8/build/lib/libopencv_imgcodecs.so /home/lhf/opencv-3.4.8/build/lib/libopencv_video.so /home/lhf/opencv-3.4.8/build/lib/libopencv_calib3d.so /home/lhf/opencv-3.4.8/build/lib/libopencv_features2d.so${OpenCV_LIBS}# 保留这个以防遗漏其他组件${EIGEN3_LIBS}${Pangolin_LIBRARIES}${rosbag_LIBRARIES}${PROJECT_SOURCE_DIR}/Thirdparty/DBoW2/lib/libDBoW2.so${PROJECT_SOURCE_DIR}/Thirdparty/g2o/lib/libg2o.so${PCL_LIBRARIES}-lboost_systemcholmod${CHOLMOD_LIBRARIES}${BLAS_LIBRARIES}${LAPACK_LIBRARIES})types: sensor_msgs/FluidPressure[804dc5cea1c5306d6a2eb80b9833befe]sensor_msgs/Image[060021388200f6f0f447d0fcd9c64743]sensor_msgs/Imu[6a62c6daae103f4ff57a132d6f95cec2]topics: /barometer_node/depth4586msgs:sensor_msgs/FluidPressure /camera/image_raw4586msgs:sensor_msgs/Image /rtimulib_node/imu45859msgs:sensor_msgs/Imu LAM_ws/src//U-VIP-SLAM/buildsource~/opencv_bridge/devel/setup.bash rospackfindcv_bridge# 输出应该是 /home/lhf/opencv_bridge/src/vision_opencv/cv_bridgemake-j16实验遇到的问题1.生成Aqualoc_deepsea数据集的Rosbacd/media/lhf/T7 Shield/Dataset/水下数据集/Aqualoc_deepsea/raw_data python3 creat_rosbag.py# creat_rosbag.py脚本如下#!/usr/bin/env python3importrosbagimportrospyimportpandas as pdimportcv2importnumpy as npimportos from sensor_msgs.msgimportImage, Imu, FluidPressure# --- 关键引入from cv_bridgeimportCvBridge# 路径配置 IMAGE_FOLDER/media/lhf/T7 Shield/Dataset/水下数据集/Aqualoc_deepsea/raw_data/harbor_images_sequence_02/OUTPUT_BAGharbor_sequence_02.bagFILE_IMGharbor_img_sequence_02.csvFILE_IMUharbor_imu_sequence_02.csvFILE_DEPTHharbor_depth_sequence_02.csv# 话题名配置 TOPIC_IMAGE/camera/image_rawTOPIC_IMU/rtimulib_node/imuTOPIC_DEPTH/barometer_node/depthdef find_nearest_depth(target_ts_ns, df_depth): timestampsdf_depth[#timestamp [ns]].values idx(np.abs(timestamps - target_ts_ns)).argmin()returndf_depth.iloc[idx]def main(): script_diros.path.dirname(os.path.abspath(__file__))os.chdir(script_dir)print(正在读取 CSV 文件...)df_imgpd.read_csv(FILE_IMG)df_imupd.read_csv(FILE_IMU)df_depthpd.read_csv(FILE_DEPTH)# 删掉空格df_img.columnsdf_img.columns.str.strip()df_imu.columnsdf_imu.columns.str.strip()df_depth.columnsdf_depth.columns.str.strip()# 深度按时间排序df_depthdf_depth.sort_values(by#timestamp [ns])bagrosbag.Bag(OUTPUT_BAG,w)bridgeCvBridge()print(正在生成Bag)# --- 1. 写入 IMU ---forindex, rowindf_imu.iterrows(): ts_nsint(row[#timestamp [ns]])tsrospy.Time(secsts_ns //1000000000,nsecsts_ns %1000000000)imu_msgImu()imu_msg.header.stampts imu_msg.header.frame_idimu_linkimu_msg.angular_velocity.xrow[w_RS_S_x [rad s^-1]]imu_msg.angular_velocity.yrow[w_RS_S_y [rad s^-1]]imu_msg.angular_velocity.zrow[w_RS_S_z [rad s^-1]]imu_msg.linear_acceleration.xrow[a_RS_S_x [m s^-2]]imu_msg.linear_acceleration.yrow[a_RS_S_y [m s^-2]]imu_msg.linear_acceleration.zrow[a_RS_S_z [m s^-2]]bag.write(TOPIC_IMU, imu_msg, ts)# --- 2. 写入 图片 和 深度 (FluidPressure) ---count0totallen(df_img)forindex, row_imgindf_img.iterrows(): ts_nsint(row_img[#timestamp [ns]])tsrospy.Time(secsts_ns //1000000000,nsecsts_ns %1000000000)# A. 写入图片filenamerow_img[frame_id]image_pathos.path.join(IMAGE_FOLDER, filename)ifos.path.exists(image_path): try: cv_imgcv2.imread(image_path)img_msgbridge.cv2_to_imgmsg(cv_img,bgr8)img_msg.header.stampts img_msg.header.frame_idcamera_linkbag.write(TOPIC_IMAGE, img_msg, ts)# B. 写入深度nearest_depth_rowfind_nearest_depth(ts_ns, df_depth)depth_val_metersfloat(nearest_depth_row[depth [m]])depth_msgFluidPressure()depth_msg.header.stampts# 时间戳对齐depth_msg.header.frame_idbarometer_linkdepth_msg.fluid_pressuredepth_val_meters depth_msg.variance0.0bag.write(TOPIC_DEPTH, depth_msg, ts)except Exception as e: print(fSkipping frame {filename}: {e})count1ifcount %1000: print(f进度: {count}/{total})bag.close()print(✅ Bag 生成完毕)if__name____main__:main()2./home/lhf/U-VIP-SLAM_ws/src/U-VIP-SLAM/launch/ORB.launch需要修改# 改为nodenameUSLAMpkgU-VIP-SLAMtypeU-VIP-SLAMoutputscreenargs$(findU-VIP-SLAM)/Data/ORBvoc.txt$(findU-VIP-SLAM)/Data/Settings_VI_Aqualoc_harbor.yaml/3.注意环境变量source./build/devel/setup.bash4.修改/home/lhf/U-VIP-SLAM_ws/src/U-VIP-SLAM/src/Tracking.cc/home/lhf/U-VIP-SLAM_ws/src/U-VIP-SLAM/src/MapPublisher.cc/USLAM/World# 应改为USLAM/World