DM-VIO(ROS)+t265配置运行记录(ubuntu18.04+ros melodic)

在工作中需要对DM-VIO算法进行测试,于是配置并记录了一下:

首先运行ros接口的dm-vio,一定要先配置源码

https://github.com/lukasvst/dm-vio在这个网址把源码下载下来并解压,并安装一下依赖:

sudo apt-get install cmake libsuitesparse-dev libeigen3-dev libboost-all-dev libyaml-cpp-dev

然后安装GTSAM,这个是dm-vio的后段优化库,一定要是 4.2a6版本的,先安装下依赖:

sudo apt install libtbb-dev

然后在 https://github.com/borglab/gtsam.git下载:

然后解压并执行:

mkdir build && cd build
cmake -DGTSAM_POSE3_EXPMAP=ON -DGTSAM_ROT3_EXPMAP=ON -DGTSAM_USE_SYSTEM_EIGEN=ON -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF ..
make -j12
sudo make install

这个过程很慢,大家耐心等待。

然后是opencv,这个我们装过ros,用自带的就可以,笔者是ubuntu18.04 ros melodic的自带3.2.0版本的opencv。

然后是pangolin,github上需要0.6版本,但是笔者环境中存在0.5版本的,为了不影响其他项目运行且不污染环境,笔者这里选择多版本共存,具体可看笔者之前写的opencv3.4.5多版本共存,原理是一样的。

还有一个问题是笔者这个版本的boost是1.65的,但是gtsam要求最低为1.73的boost,于是笔者又安装了boost1.73,去官网https://archives.boost.io/release/1.73.0/source/下载好包后:

./boottrap.sh --with-libraries=all
./b2
sudo  ./b2 install --prefix=/usr/local/boost1.73

依旧是在用的时候set一下就好

修改cmakelists.txt:

set(Pangolin "/usr/local/pangolin-0.6/include/pangolin")
set(BOOST_ROOT "/usr/local/boost-1.73")

还有一处如果不修改汇报错:

CMake Error at CMakeLists.txt:198 (add_executable):
Target “dmvio_t265” links to target “Boost::regex” but the target was not
found. Perhaps a find_package() call is missing for an IMPORTED target, or
an ALIAS target is missing?

CMake Error at CMakeLists.txt:191 (add_executable):
Target “dmvio_dataset” links to target “Boost::regex” but the target was
not found. Perhaps a find_package() call is missing for an IMPORTED
target, or an ALIAS target is missing?

这里在cmakelist.txt中find boost时做添加就好了:

find_package(Boost 1.73 REQUIRED COMPONENTS system thread filesystem chrono serialization date_time timer regex)

然后安装boost1.73后又会在yaml-cpp中报错:/usr/include/yaml-cpp/node/detail/iterator.h:48:54: error: ‘next’ is not a member of ‘boost’    48 |   void increment() { this->base_reference() = boost::next(this->base()); }这是因为比较新的boost版本中可能出现找不到迭代器next方法

在/usr/include/yaml-cpp/node/detail/iterator.h这个路径下,找到这个文件:sudo gedit iterator.h之后,添加头文件#include<boost/next_prior.hpp>就好了。

然后应该就没什么问题了,小伙伴有什么报错都可以发在评论区,我有时间会看,能解答的一定解答给大家

mkdir build
cd build
cmake ..
make -j12

接下来是ros接口,在刚刚的子文件路径下建一个文件夹,把ros接口的包放在里面解压,在编译之前,我们要确保可以找到刚刚编译的:sudo gedit ~/.bashrc,在里面加上:

export DMVIO_BUILD=/PATH/TO/dm-vio/build

然后修改cmakelist.txt:

还是刚刚的pangolin和boost,这里还要在大概90行左右加:

add_dependencies(${PROJECT_NAME}_node ${PROJECT_NAME}_generate_messages_cpp)

不然编译的时候会因为找不到生成的msg格式而报错 

catkin_make
source devel/setup.bash

这里可能会出现刚刚安装的新版本boost库中的某些包找不到的情况,

/home/shikai/dm-vio-catkin_ws/src/dm-vio-master/ROS/devel/lib/dmvio_ros/node: error while loading shared libraries: libboost_serialization.so.1.73.0: cannot open shared object file: No such file or directory

这是因为之前没设置环境变量:

sudo gedit /etc/ld.so.conf
#将如下我们自己的so所在路径添加到这个文件中
/usr/local/boost-1.73/lib

然后还要执行才可以生效:

cd /etc
ldconfig

笔者到这里就配置完成了。

网上的博客接下来大多是如何运行数据集,但是笔者要使用t265实时跑,并初步查看下建图效果

roscore
rosrun dmvio_ros node nogui=0 useimu=1 quiet=1 mode=3   calib=/home/shikai/dm-vio-catkin_ws/src/dm-vio-master/configs/tumvi_calib/camera02.txt                imuCalib=/home/shikai/dm-vio-catkin_ws/src/dm-vio-master/configs/tumvi_calib/test1-camchain-imucam.yaml               gamma=/home/shikai/dm-vio-catkin_ws/src/dm-vio-master/configs/pcalib_linear_8bit.txt                vignette=/home/shikai/dm-vio-catkin_ws/src/dm-vio-master/configs/realsense/vignette_t265.png                 settingsFile=/home/shikai/dm-vio-catkin_ws/src/dm-vio-master/configs/t265_noise_tumvi.yaml                 resultsPrefix=/home/shikai/dm-vio-catkin_ws/result          cam0/image_raw:=/camera/fisheye1/image_raw imu0:=/camera/imu

这是笔者的执行命令,根据github中给的改的,

nogui=0: 启动时不显示 GUI(图形界面)。这里设置为 0,意味着不禁用 GUI。
useimu=1: 使用 IMU 数据(设置为 1 表示启用 IMU 数据)。
quiet=1: 静默模式,减少输出。
mode=3: 模式设置为 3,表示使用特定的校准模式(比如没有曝光控制但有光晕校准),这通常与相机配置(如曝光、增益等)有关。
calib=/PATH_TO/RealsenseCalibration/camera.txt: 相机的校准文件,包含相机内参和外参。
imuCalib=/PATH_TO/RealsenseCalibration/factory_camchain.yaml: IMU 校准文件,包含与 IMU 相关的校准数据。
gamma=PATH_TO/dm-vio/configs/pcalib_linear_8bit.txt: Gamma 校正文件,用于相机图像的后处理。
vignette=PATH_TO/dm-vio/configs/realsense/vignette_t265.png: 鱼眼镜头的光晕校正文件,用于校正相机图像中的光晕效应。

settingsFile=/PATH_TO/dm-vio/configs/t265_noise_tumvi.yaml: VIO(视觉惯性里程计)系统的配置文件,包含噪声参数等。
resultsPrefix=/PATH_TO_RESULTS/: 结果保存的文件夹路径。
cam0/image_raw:=/camera/fisheye1/image_raw: 重映射 ROS 话题,将 /camera/fisheye1/image_raw 数据传递到 cam0/image_raw。
imu0:=/camera/imu: 重映射 IMU 话题,将 /camera/imu 数据传递到 imu0。

同时打开t265的lanunch文件,将相机启动:工作原因,(将image打马了)

初始化代价太大了,不过可以看到半稠密建图效果还是很顶的,这个只是看下效果,考虑精度的话需要做光度标定,先留个坑,过一段时间再来填

03-22
### DMVIO 算法概述 DMVIO(Direct Monocular Visual-Inertial Odometry)是一种基于直接法的单目视觉惯性里程计算法,它继承了DSO(Direct Sparse Odometry)的核心思想并扩展至多传感器融合领域。该算法通过结合相机和IMU的数据,在实时性和精度之间取得了较好的平衡[^1]。 #### 关键特性 DMVIO 的核心在于其能够利用光度误差模型来优化相机的姿态估计以及尺度恢复问题。这种设计使得 DMVIO 对环境光照变化具有较强的鲁棒性,并且能够在纹理稀疏的情况下保持良好的性能。然而,由于其高度依赖于光度误差假设,因此对于光学硬件的要求较高,例如摄像头的校准质量直接影响系统的稳定性。 以下是 DMVIO 技术的主要特点: - **高精度姿态估计**:通过对 IMU 数据进行预积分处理并与图像信息联合优化,实现了厘米级的位置跟踪能力。 - **尺度一致性保障**:借助加速度计测量值解决了传统 VISO 中存在的尺度漂移问题。 - **计算复杂度适中**:相比其他间接法 VO 或 SLAM 方法,DMVIO 减少了特征提取的时间消耗;但由于引入了密集像素亮度约束条件,整体运算量依然较大。 #### 实现细节 为了理解如何具体实现 DMVIO ,可以将其分为以下几个方面考虑: ##### 1. 初值初始化阶段 在系统启动初期,需要完成如下几个任务: - 使用少量帧构建初始地图点集合; - 调整内外参矩阵参数直至满足残差收敛准则为止; - 同步时间戳以便后续数据关联操作顺利开展。 ##### 2. 前端部分 前端主要负责快速预测当前时刻位姿候选解集。这一过程涉及到两部分内容——状态传播与匹配验证: - **状态传播**:依据最新获取到的陀螺仪读数更新旋转分量R_k 和平移向量t_k ; - **匹配验证**:寻找最佳对应关系以指导下一步非线性最小二乘求解流程. ##### 3. 后端优化模块 后端采用因子图框架表示整个轨迹序列及其观测证据之间的相互联系。其中每条边代表某种特定类型的约束力作用效果 (e.g., odometry constraints, loop closure detections),而节点则用来存储各个关键帧所携带的状态变量副本。最终目标就是找到一组最优配置让所有这些约束共同成立的概率最大化。 ```python import numpy as np def initialize_system(camera_intrinsics, imu_params): """ Initializes the system with given camera intrinsics and IMU parameters. Args: camera_intrinsics (dict): Dictionary containing focal length and principal point offsets. imu_params (dict): Dictionary of gyroscope bias, accelerometer noise density etc. Returns: initialized_state (object): Object representing initial state configuration. """ pass def propagate_states(previous_pose, angular_velocity, linear_acceleration, delta_t): """ Propagates poses forward based on previous pose estimates along with measured rates from sensors. Args: previous_pose (SE3Pose object): Pose at last timestamp. angular_velocity (np.ndarray): Angular velocity vector over interval [s^-1]. linear_acceleration (np.ndarray): Linear acceleration during same period [m/s²]. delta_t (float): Time difference between consecutive measurements [seconds]. Returns: predicted_current_pose (SE3Pose object): Predicted current pose after propagation step completed successfully. """ pass ``` #### 应用场景分析 考虑到上述提到的各种优劣势因素组合起来看的话,则可推测出适合部署此类解决方案的实际应用场合应该具备下面一些典型特征: - 需要在动态环境下执行长时间连续作业的任务; - 可接受一定程度额外功耗换取更高定位准确性指标; - 已经做好充分准备应对可能出现的技术挑战比如深入掌握底层原理知识等等^. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值