LSD-SLAM在Ubuntu14.04+indigo环境中编译运行

LSD-SLAM在Ubuntu14.04+indigo环境中编译运行


LSD-SLAM源码:https://github.com/tum-vision/lsd_slam
LSD-SLAM官网:https://vision.in.tum.de/research/vslam/lsdslam
1、初始化ROS工作空间
sudo apt-get install python-rosinstall
mkdir ~/rosbuild_ws
cd ~/rosbuild_ws
rosws init . /opt/ros/indigo
mkdir package_dir
rosws set ~/rosbuild_ws/package_dir -t .
echo "source ~/rosbuild_ws/setup.bash" >> ~/.bashrc
bash
cd package_dir
2、安装依赖项:
sudo apt-get install ros-indigo-libg2o ros-indigo-cv-bridge liblapack-dev libblas-dev freeglut3-dev libqglviewer-dev libsuitesparse-dev libx11-dev
3、在package_dir目录下克隆lsd_slam源码
git clone https://github.com/tum-vision/lsd_slam.git lsd_slam
4、编译lsd_slam包
rosmake lsd_slam
5、下载Datasets
https://vision.in.tum.de/research/vslam/lsdslam
官网提供了Datasets,可以下载
 
下载video:后面的.bag文件或者.png文件都可以。
6、运行测试lsd_slam,下面提供三种测试方式
1)使用.bag数据集
将第5步下载的.bag文件解压。
例如我解压后得到了 LSD_room.bag文件,该文件831.7MB。
在新终端运行roscore
roscore
在新终端运行 lsd_slam viewer
rosrun lsd_slam_viewer viewer
在新终端运行lsd_slam main ros node
rosrun lsd_slam_core live_slam image:=/image_raw camera_info:=/camera_info
在新终端运行.bag文件
rosbag play ~/LSD_room.bag
2)使用.png数据集
第5步下载.png得到的压缩包解压后得到LSD_room文件夹,里面包含images文件夹和cameraCalibration.cfg文件。
在新终端运行roscore
roscore
在新终端运行 lsd_slam viewer
rosrun lsd_slam_viewer viewer
在新终端运行lsd_slam main ros node
rosrun lsd_slam_core dataset_slam _files:=/home/username/LSD_room/images _hz:=0 _calib:=/home/username/LSD_room/cameraCalibration.cfg
注:这儿的路径应与你的数据集路径一致
3)使用USB摄像头实时采集视频
安装uvc_camera
mkdir catkin_ws
cd catkin_ws
mkdir src
cd src
git clone https://github.com/ros-drivers/libuvc_ros.git
cd ..
catkin_make
编译完成后,若是使用笔记本电脑,因为其自带摄像头编号为/dev/video0,因此需修改uvc_camera.launch文件,将/dev/video0改为/dev/video1
gedit src/camera_umd/uvc_camera/launch/camera_node.launch
 当然还可以在里面修改摄像头的分辨率,我将分辨率改为了640*480。
设置好后,我们可以运行检查驱动是否安装成功
先source一下uvc_camera的setup.bash文件,然后
roslaunch uvc_camera camera_node.launch
rosrun image_view image_view image:=/image_raw
此时出现视频窗口说明驱动安装成功。
下面使用USB摄像头进行lsd_slam
roscore
在新终端运行 lsd_slam viewer
rosrun lsd_slam_viewer viewer
在新终端运行uvc_camera.launch
roslaunch uvc_camera camera_node.launch
在新终端运行lsd_slam main ros node
rosrun lsd_slam_core live_slam /image:=<yourstreamtopic> _calib:=<calibration_file>
我的命令行为:rosrun lsd_slam_core live_slam /image:=image_raw _calib:= ~/rosbuild_ws/package_dir/lsd_slam/lsd_slam_core/calib/OpenCV_example_calib.cfg
此处<yourstreamtopic> 为USB摄像头发布的话题,可执行rostopic list查看,为image_raw
<calibration_file>为摄像机标定文件,规则参考如下:
Camera Calibration:
LSD-SLAM operates on a pinhole camera model, however we give the option to undistort images before they are being used. You can find some sample calib files in lsd_slam_core/calib.
Calibration File for FOV camera model:
fx/width fy/height cx/width cy/height d
in_width in_height
"crop" / "full" / "none" / "e1 e2 e3 e4 0"
out_width out_height
Here, the values in the first line are the camera intrinsics and radial distortion parameter as given by the PTAM cameracalibrator, in_width and in_height is the input image size, and out_width out_height is the desired undistorted image size. The latter can be chosen freely, however 640x480 is recommended as explained in section 3.1.6. The third line specifies how the image is distorted, either by specifying a desired camera matrix in the same format as the first four intrinsic parameters, or by specifying "crop", which crops the image to maximal size while including only valid image pixels.
Calibration File for Pre-Rectified Images
This one is without radial distortion correction, as a special case of ATAN camera model but without the computational cost:
fx/width fy/height cx/width cy/height 0
width height
none
width height
Calibration File for OpenCV camera model:
fx fy cx cy k1 k2 p1 p2
inputWidth inputHeight
"crop" / "full" / "none" / "e1 e2 e3 e4 0"
outputWidth outputHeight
注:若出现[rospack]Error:package’***’not found,请source你的setup.bash
参考网站:
http://blog.youkuaiyun.com/gobitan/article/details/51541977
http://www.mamicode.com/info-detail-957983.html
https://vision.in.tum.de/research/vslam/lsdslam
https://github.com/tum-vision/lsd_slam

<think>嗯,用户想了解关于LSD-SLAM的实现或概述。首先,我需要回忆一下LSD-SLAM的基本概念。LSD-SLAM是Large-Scale Direct SLAM的缩写,属于计算机视觉中的同步定位与地图构建(SLAM)技术。和基于特征的方法(如ORB-SLAM)不同,LSD-SLAM是直接法,直接利用图像像素的亮度信息进行跟踪和建图,不需要提取特征点。 接下来,我得考虑用户的需求。用户可能是在研究SLAM算法,或者在做相关项目,需要了解LSD-SLAM的原理和实现方式。用户提到“implementation or overview”,所以需要兼顾理论和实践部分。可能需要分步骤解释算法流程,比如跟踪、深度估计、地图优化等模块。 然后,需要确保回答的结构清晰。先概述LSD-SLAM,再讲核心算法,然后实现步骤,最后相关资源。这样用户能逐步理解。同时,用户示例中有代码块,可能也需要提供一些代码示例或伪代码,但LSD-SLAM的具体实现可能比较复杂,需要依赖库如OpenCV、Sophus等,可以推荐一些GitHub项目或开源实现。 另外,用户要求生成相关问题,可能需要围绕LSD-SLAM的优缺点、与其他SLAM算法的比较、实际应用中的挑战等方面提问。例如,与ORB-SLAM的区别,直接法的优势,实时性如何保证,如何处理动态环境等。 还要注意引用的问题。用户提供的参考引用是转自GitHub的awesome computer vision,可能其中有相关资源,但需要检查是否准确。引用标识要正确添加,比如在提到关键帧优化或半稠密地图时,可能需要引用原始论文或相关文档。 同时,要确保使用正确的中文表达,避免专业术语错误。比如,“直接法”对应的是“direct method”,而“特征点法”是“feature-based method”。需要解释这些术语,帮助用户理解不同SLAM方法的区别。 最后,要验证提供的信息是否准确。比如,LSD-SLAM是否真的使用SE(3)位姿表示,是否采用半稠密地图,以及关键帧的优化方法。可能需要回顾相关论文或权威资料,确保回答的正确性。例如,LSD-SLAM的论文由Engel等人提出,发表在2014年的ICCV或类似的顶会上,这些信息需要确认正确。 总结一下,回答需要涵盖: 1. LSD-SLAM的概述和核心思想 2. 核心算法步骤分解 3. 实现所需的工具和依赖库 4. 开源实现资源推荐 5. 相关问题生成,如比较、优化、应用场景等 6. 正确引用相关文献和资源 现在需要把这些点组织成结构化的回答,确保符合用户的要求,使用中文,LaTeX公式正确,代码块适当,引用标识自然添加。</think>### LSD-SLAM 概述与实现 LSD-SLAM(Large-Scale Direct SLAM)是一种基于直接法的实时单目SLAM(同步定位与地图构建)算法,适用于无标定相机的场景。其核心思想是通过直接利用图像像素的亮度信息估计相机的位姿和场景的几何结构,而非依赖特征点匹配[^1]。 #### 核心算法步骤 1. **直接跟踪(Direct Tracking)** 通过最小化相邻帧间的光度误差(Photometric Error)估计相机运动: $$E(\xi) = \sum_{i} \left\| I_{\text{ref}}(\mathbf{p}_i) - I_{\text{new}}(\mathbf{p}_i(\xi)) \right\|^2$$ 其中,$\xi \in \mathfrak{se}(3)$ 表示李代数形式的相机位姿,$\mathbf{p}_i$ 是参考帧中的像素坐标。 2. **深度估计(Depth Map Estimation)** 使用滤波器(如卡尔曼滤波器)递归更新关键帧的逆深度图,支持半稠密(Semi-Dense)重建,仅对高梯度区域计算深度。 3. **关键帧与地图优化** 当相机运动超出阈值时插入新关键帧,并通过位姿图优化(Pose Graph Optimization)全局约束地图一致性。 #### 实现依赖与工具 - **开源实现**: - 官方C++实现(已停止维护):[LSD-SLAM GitHub仓库](https://github.com/tum-vision/lsd_slam) - 基于ROS的集成版本:[LSD-SLAM ROS](http://wiki.ros.org/lsd_slam) - **依赖库**:OpenCV(图像处理)、Eigen(线性代数)、Sophus(李群/李代数操作)。 #### 代码片段示例(关键帧初始化伪代码) ```cpp void initializeKeyFrame(Frame& current_frame, DepthMap& depth_map) { if (current_frame.hasSufficientMotion()) { KeyFrame* new_keyframe = new KeyFrame(current_frame); depth_map.propagateDepth(new_keyframe); // 深度传播 pose_graph.addKeyFrame(new_keyframe); // 添加至位姿图 } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值