0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用深度相机实现视觉slam建图和导航

新机器视觉 来源:机器视觉智能检测 作者:机器视觉智能检测 2022-03-11 13:38 次阅读

一、 概述

1.深度相机

随着机器视觉自动驾驶等颠覆性的技术逐步发展,采用3D相机进行物体识别,行为识别,场景建模的相关应用越来越多,可以说深度相机就是终端和机器人的眼睛,那么什么是深度相机呢,跟之前的普通相机(2D)想比较,又有哪些差别?深度相机又称之为3D相机,顾名思义,就是通过该相机能检测出拍摄空间的景深距离,这也是与普通摄像头最大的区别。

普通的彩色相机拍摄到的图片能看到相机视角内的所有物体并记录下来,但是其所记录的数据不包含这些物体距离相机的距离。仅仅能通过图像的语义分析来判断哪些物体离我们比较远,哪些比较近,但是并没有确切的数据。而深度相机则恰恰解决了该问题,通过深度相机获取到的数据,我们能准确知道图像中每个点离摄像头距离,这样加上该点在2D图像中的(x,y)坐标,就能获取图像中每个点的三维空间坐标。通过三维坐标就能还原真实场景,实现场景建模等应用。

深度相机也具备普通相机的一些不足,容易受视差影响:包括黑色物体(特征点少)、透明物体(光的穿透)、光滑物体(光反射太强)、图像无纹理(特征点少)、过度曝光(特征点少)等。

445fb9a2-91ad-11ec-952b-dac502259ad0.jpg

2.常见的深度相机

目前市面上常有的深度相机方案有以下三种:

2.1 双目视觉(Stereo)

双目立体视觉(Binocular Stereo Vision)是机器视觉的一种重要形式,他是基于视差原理并利用成像设备从不同的位置获取被测物体的两幅图像,通过计算图像对应点间的位置偏差,来获取物体三维几何信息的方法。

双目相机的主要优点有:

1)硬件要求低,成本也低。普通 CMOS 相机即可

2)室内外都适用。只要光线合适,不要太昏暗

但是双目的缺点也是非常明显:

1)对环境光照非常敏感。光线变化导致图像偏差大,进而会导致匹配失败或精度低

2)不适用单调缺乏纹理的场景。双目视觉根据视觉特征进行图像匹配,没有特征会导致匹配失败

3)计算复杂度高,需要很高的计算资源。该方法是纯视觉的方法,对算法要求高,实时性差

4)基线限制了测量范围。测量范围和基线(两个摄像头间距)成正比,导致无法小型化

代表公司

Leap Motion, ZED, 大疆

2.2 结构光(Structured-light)

通过近红外激光器,将具有一定结构特征的光线投射到被拍摄物体上,再由专门的红外摄像头进行采集。这种具备一定结构的光线,会因被摄物体的不同深度区域,而采集不同的图像相位信息,然后通过运算单元将这种结构的变化换算成深度信息,以此来获得三维结构。简单来说就是,通过光学手段获取被拍摄物体的三维结构,再将获取到的信息进行更深入的应用。通常采用特定波长的不可见的红外激光作为光源,它发射出来的光经过 一定的编码投影在物体上,通过一定算法来计算返回的编码图案的畸变来得到物体的位置和深度信息。下图是一个典型的结构光相机的示意图:

447ead9e-91ad-11ec-952b-dac502259ad0.jpg

4494a450-91ad-11ec-952b-dac502259ad0.jpg

结构光(散斑)的优点主要有:

1)方案成熟,相机基线可以做的比较小,方便小型化。

2)资源消耗较低,单帧 IR 图就可计算出深度图,功耗低。

3)主动光源,夜晚也可使用。

4)在一定范围内精度高,分辨率高,分辨率可达 1280×1024,帧率可达 60FPS。

散斑结构光的缺点与结构光类似:

1)容易受环境光干扰,室外体验差。

2)随检测距离增加,精度会变差。

代表公司:

奥比中光,苹果(Prime Sense),微软 Kinect-1,英特尔 RealSense, Mantis Vision 等。

2.3 光飞行时间法(TOF)

顾名思义是测量光飞行时间来取得距离,具体而言就是通过给目标连续发射激光脉冲,然后用传感器 接收从反射光线,通过探测光脉冲的飞行往返时间来得到确切的目标物距离。因为光速激光,通过直接测 光飞行时间实际不可行,一般通过检测通过一定手段调制后的光波的相位偏移来实现。TOF 法根据调制方法的不同,一般可以分为两种:脉冲调制(Pulsed Modulation)和连续波调制 (Continuous Wave Modulation)。脉冲调制需要非常高精度时钟进行测量,且需要发出高频高强度激光,目 前大多采用检测相位偏移办法来实现 TOF 功能。简单来说就是,发出一道经过处理的光,碰到物体以后会反射回来,捕捉来回的时间,因为已知光速和调制光的波长,所以能快速准确计算出到物体的距离。

其原理示意图:

44a7cd5a-91ad-11ec-952b-dac502259ad0.jpg

因为 TOF 并非基于特征匹配,这样在测试距离变远时,精度也不会下降很快,目前无人驾驶以及一些高端的消费类 Lidar 基本都是采用该方法来实现。

TOF 的优点主要有:

1)检测距离远。在激光能量够的情况下可达几十米

2)受环境光干扰比较小

但是 TOF 也有一些显而易见的问题:

1)对设备要求高,特别是时间测量模块。

2)资源消耗大。该方案在检测相位偏移时需要多次采样积分,运算量大。

3)边缘精度低。

4)限于资源消耗和滤波,帧率和分辨率都没办法做到较高。

代表公司:

微软 Kinect-2,PMD,SoftKinect, 联想 Phab。

传感器技术不是很成熟,因此,分辨率较低,成本高,但由于其原理与另外两种完全不同,实时性高,不需要额外增加计算资源,几乎无算法开发工作量,是未来。

2.4 综合对比

从上面三种主流的 3D 相机成像方案来看,各有优劣,但是从实际应用场景来看,在非无人驾驶域,结构光,特别是散斑结构光的用途是最广泛。因为从精度,分辨率,还有应用场景的范围来看双目和 TOF 都没有办法做到最大的平衡。而且对于结构光容易受环境光干扰,特别是太阳光影响问题,鉴于此类相机都有红外激光发射模块,非常容易改造为主动双目来弥补该问题。

结构光与TOF的对比:

对比来看,结构光技术功耗更小,技术更成熟,更适合静态场景。而TOF方案在远距离下噪声较低,同时拥有更高的FPS,因此更适合动态场景。

目前,结构光技术主要应用于解锁以及安全支付等方面,其应用距离受限。而TOF技术主要用于智能机后置摄影,并在AR、VR等领域(包括3D拍照、体感游戏等)有一定的作用。

44bafdb2-91ad-11ec-952b-dac502259ad0.jpg

3D结构光和TOF两者其实各有优劣势。结构光最大的优势是发展的较为成熟,成本比较低,劣势是只适合中短距离使用。ToF优势是抗干扰性较好,视角较宽,缺陷是功耗高,造价贵,精度及深度图分辨率较低。两项技术各有侧重点和适配使用场景。

结构光相机硬件说明:

综合考虑成本,本文将采用此类相机,在这里单独说明下。

Kinect(xbox游戏机配件):

44d031b4-91ad-11ec-952b-dac502259ad0.png

乐视体感相机(乐视tv配件):

44e37990-91ad-11ec-952b-dac502259ad0.png

相机一般有三只眼睛,从左到右分别为:

投射红外线pattern的IR Projector(左)

摄像头Color Camera(中)

读取反射红外线的IR Camera(右)

Depth传感器读取左右两边投射的红外线pattern,通过pattern的变形来取得Depth的信息。

二、 摄像头通路打通

1.硬件连接

考虑成本,我们在上一次组装的ROS+底盘套装的基础上,新增一个深度相机即可:

乐视体感三合一摄像头 * 1

usb子母延长线 * 1

2.安装驱动

# 安装相关依赖 sudo apt install ros-$ROS_DISTRO-rgbd-launch ros-$ROS_DISTRO-libuvc-camera ros-$ROS_DISTRO-libuvc-ros ros-$ROS_DISTRO-camera-info-manager # ros-$ROS_DISTRO-libuvc # 安装vslam相关依赖 sudo apt install ros-$ROS_DISTRO-rtabmap ros-$ROS_DISTRO-rtabmap-ros ros-$ROS_DISTRO-depthimage-to-laserscan # 克隆功能包源码 cd ~/catkin_ws/src git clone git@github.com:orbbec/ros_astra_camera.git git clone git@github.com:yanjingang/robot_vslam.git # 创建udev规则 cd ros_astra_camera chmod +x ./scripts/create_udev_rules ./scripts/create_udev_rules # 配置并加载环境变量(机器人端执行) cd ~/catkin_ws/src ./robot_vslam/script/setrgbd.sh astrapro source ~/.bashrc # export CAMERA_TYPE=astrapro # 编译 cd ~/catkin_ws catkin_make --pkg astra_camera robot_vslam source ~/catkin_ws/devel/setup.bash

3.测试摄像头

在完成第一步的功能包编译之后,将摄像头连接到机器人的主机

# 0.检查摄像头是否正常识别 ll /dev/astra* lrwxrwxrwx 1 root root 15 Jan 6 12:50 /dev/astra_pro -> bus/usb/001/014 lrwxrwxrwx 1 root root 15 Jan 6 12:50 /dev/astrauvc -> bus/usb/001/015 # 1.机器人端启动摄像头(启动后会弹出几个警告,不用管它,这是由于驱动中的一些参数摄像头不支持) #roslaunch astra_camera astra.launch # Use Astra roslaunch robot_vslam astrapro.launch # 如果报Warning: USB events thread - failed to set priority. This might cause loss of data...,是因为没有权限,执行以下命令 #sudo -s #source /home/work/.bashrc #roslaunch robot_vslam astrapro.launch # 2.PC 端查看图像(常用topic:深度:/camera/depth/image;彩色:/camera/rgb/image_raw/compressed;红外:/camera/ir/image;注:ir图像只能通过rviz显示,在rqt_image_view 中显示会是全黑,这和图像格式有关,并非设备问题) rviz 或 rqt_image_view

4.点云显示

这一部分为了让大家了解一下 rviz 中的各类插件的使用,将带着大家一起搭建一个 rviz 显示环境。(如果不想进行手动配置,也可以直接使用预先配置好的文件:/robot_vslam/rviz/astrapro.rviz)

首先我们添加一个点云显示插件,点击”Add”,在弹出的界面中双击” PointCloud2”:

44f8f22a-91ad-11ec-952b-dac502259ad0.png

展开左侧PointCloud2选型卡,选择Topic:

450e273a-91ad-11ec-952b-dac502259ad0.png

将 Fixed Frame 选择为 camera_link:

4528da26-91ad-11ec-952b-dac502259ad0.png

此时界面中就会显示出点云图:

45447074-91ad-11ec-952b-dac502259ad0.png

在 Color Transformer 中选择不同的颜色模式可以给点云按照不同的规则着色:

455a2432-91ad-11ec-952b-dac502259ad0.png

最后通过左上角的”File”选项卡中 Save Config As 可以将当前 rviz 配置保存到指定位置,下次打开 rviz 候可以通过 Open Config 直接打开配置文件避免再次手动配置界面。

4575333a-91ad-11ec-952b-dac502259ad0.png

5.转激光雷达数据测试

# 启动深度相机(机器人端) roslaunch robot_vslam camera.launch # 启动深度图到雷达数据的转换 roslaunch robot_vslam depth_to_laser.launch # pc端可视化 rviz

配置一下界面就可以正常显示雷达数据了

458d02a8-91ad-11ec-952b-dac502259ad0.png

这里可以注意到,相对于机器人的 TF 坐标位置,雷达数据并不是像我们常见的激光雷达数据是 360 度的,这是由于深度相机的视场角(即 FOV,我们这款相机水平 FOV 为 58.4 度,垂直FOV 为 45.5 度)是有限的,所以转换出的雷达数据角度范围和相机是水平 FOV是一致的,简单理解就是,只能看到相机前方一定角度范围内的东西。

三、 视觉 vSLAM 建图及导航

1.vSLAM建图

机器人端启动建图:

# 启动底盘base control roslaunch ros_arduino_python arduino.launch # 启动camera roslaunch robot_vslam camera.launch # 启动rtab vslam roslaunch robot_vslam rtabmap_rgbd.launch

在 rtabmap_rgbd.launch 启动完成后,camera 节点和 rtabmap 的节点中会分别输出以下信息(因为这里输出的信息较多且有参考价值,所以我们没有将所有的启动文件写成一个 launch 文件在同一个终端中输出)

45a5e0c0-91ad-11ec-952b-dac502259ad0.png

45bb2c46-91ad-11ec-952b-dac502259ad0.png

PC端查看建图过程:

# PC端打开rviz终端(在rviz终端中就可以看到所建立的平面地图和立体地图) roslaunch robot_vslam rtabmap_rviz.launch # 也可以使用rtabmap自带的图形化界面rtabmapviz在PC端来观测建图过程(不建议,带宽占用100M以上) # roslaunch robot_vslam rtabmapviz.launch

45d06a48-91ad-11ec-952b-dac502259ad0.png

键盘控制机器人移动:

# 键盘控制 rosrun teleop_twist_keyboard teleop_twist_keyboard.py

我们建议是将机器人的直线运动速度不超过 0.2m/s,旋转速度不超过 0.4rad/s 以保证建图质量。建图过程和激光雷达建图基本一致,遥控机器人在环境中遍历一遍完成建图。

地图是默认保存在机器人端~/.ros/rtabmap.db文件中,由于这个文件包含了建图过程中的图片和特征点的信息,所以文件会比较大。

注意:启动 roslaunch robot_vslam rtabmap_rgbd.launch 都会覆盖掉 rtabmap.db 文件,如果需要保留上次建图的结果,注意备份文件。

建图完成后 rviz 中的地图如下所示

45e3135a-91ad-11ec-952b-dac502259ad0.png

这里我们也可以修改点云显示的颜色来实现其他效果,例如这样

45fdb0f2-91ad-11ec-952b-dac502259ad0.png

46158452-91ad-11ec-952b-dac502259ad0.png

2.导航

机器人端打开四个终端,分别运行:

# 启动底盘base control roslaunch ros_arduino_python arduino.launch # 启动camera roslaunch robot_vslam camera.launch # 启动rtab并自动定位 roslaunch robot_vslam rtabmap_rgbd.launch localization:=true # 启动movebase(纯前向视觉无法后退) roslaunch robot_vslam move_base.launch planner:=dwa move_forward_only:=true

这里 move_base 的 planner 参数可以选择 dwa 和 teb,这部分在激光雷达导航部分已经介绍过,这里就不再赘述,move_forward_only 参数是为了只允许机器人向前运动(视觉传感器只有前向感知) 。启动后检查各个节点有无报错,正常应该是可以直接定位成功的。

# pc端rviz查看和控制 roslaunch robot_vslam rtabmap_rviz.launch

462c0d9e-91ad-11ec-952b-dac502259ad0.png

# pc端rtabmap查看(需手动下载全局地图) roslaunch robot_vslam rtabmapviz.launch

4654ba50-91ad-11ec-952b-dac502259ad0.png

在 rtabmapviz 中点击红框中的按钮同步地图数据库的信息,可能会花费一点时间,取决于你的局域网条件。如果左下位置中没有出现图像且图像两侧处为黑色,则机器人尚未完成初始位置的确定。如果如下图所示,则机器人已经完成定位,可以开始导航无需执行下面的步骤(通常机器人从纹理比较丰富且上次已经到达过的位置启动,都可以直接完成定位,这里文档中是为了说明初始定位这一过程故意从一处几乎没有纹理的区域启动使机器人不能完成初始定位)

如果没有自动定位成功,则可以在 PC 端或机器人端启动一个键盘控制节点:

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

控制慢速移动机器人,直到左下角位置出现图像且两侧为绿色表示定位成功

4670af62-91ad-11ec-952b-dac502259ad0.png

接下来就可以在地图中指定目标点让机器人导航过去了。

469751ee-91ad-11ec-952b-dac502259ad0.png

注意:rgbd 相机的视场角较小,且深度信息存在较大的盲区,在导航中有可能会发生碰撞,可以通过调节增大 robot_vslam/param/MarsRobot/costmap_common_params.yaml中的inflation_radius 参数来改善,但是很难达到和激光雷达导航或rgbd相机+激光雷达的效果。

四、视觉+激光雷达建图及导航

1.视觉+激光雷达建图

这里操作过程和第三章节完全一致,只是部分启动指令有差异,所以这里只列出启动指令,不再描述操作过程。
机器人端打开三个终端,分别运行:

# 启动激光雷达+base_control roslaunch robot_navigation robot_lidar.launch # 启动深度摄像头 roslaunch robot_vslam camera.launch # 启动rgbd+lidar联合建图 roslaunch robot_vslam rtabmap_rgbd_lidar.launch # pc端查看 roslaunch robot_vslam rtabmap_rviz.launch # pc端控制移动 rosrun teleop_twist_keyboard teleop_twist_keyboard.py

我们建议是将机器人的直线运动速度不超过 0.2m/s,旋转速度不超过 0.4rad/s 以保证建图质量建图过程和激光雷达建图基本一致,遥控机器人在环境中遍历一遍完成建图。这里可以看到,由于加入了360 度的激光雷达数据,建图在 2D 的地图方面表现要更好一些。

46c8ba22-91ad-11ec-952b-dac502259ad0.png

2.视觉vSLAM +激光雷达导航

机器人端打开四个终端,分别运行:

# 启动激光雷达+base_control roslaunch robot_navigation robot_lidar.launch # 启动camera roslaunch robot_vslam camera.launch # 启动rtab并自动定位 roslaunch robot_vslam rtabmap_rgbd_lidar.launch localization:=true # 启动movebase(允许后退) roslaunch robot_vslam move_base.launch planner:=dwa move_forward_only:=false # pc端查看 roslaunch robot_vslam rtabmap_rviz.launch roslaunch robot_vslam rtabmapviz.launch

这里由于加入了 360 度的激光雷达,机器人具备了全向的感知能力,所以可以将 move_forward_only 参数设置为 false 允许机器人向后运动。

46ee8fb8-91ad-11ec-952b-dac502259ad0.png

今天带大家学习了如何使用深度相机实现视觉slam建图和导航,同时我们也尝试了视觉+激光雷达的协同使用,机器人在障碍物感知和避障方面有了明显改善,同时通过摄像头我们也能更方便的实现远程监控和控制。下一次你想看到什么呢?欢迎留言,我将带大家一起实现~!

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 激光雷达
    +关注

    关注

    967

    文章

    3875

    浏览量

    188877
  • 自动驾驶
    +关注

    关注

    781

    文章

    13475

    浏览量

    165393

原文标题:实战 | 用深度相机+激光雷达实现vSLAM建图与导航

文章出处:【微信号:vision263com,微信公众号:新机器视觉】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是SLAM视觉SLAM怎么实现

    上周的组会上,我给研一的萌新们讲解什么是SLAM,为了能让他们在没有任何基础的情况下大致听懂,PPT只能多少字没公式,这里我就把上周的组会汇报总结一下。 这次汇报的题目我定为“视觉SLAM
    的头像 发表于 08-21 10:02 9611次阅读
    什么是<b class='flag-5'>SLAM</b>?<b class='flag-5'>视觉</b><b class='flag-5'>SLAM</b>怎么<b class='flag-5'>实现</b>?

    从基本原理到应用的SLAM技术深度解析

    LSD-SLAM 即 Large-Scale Direct SLAM,兼容单目相机和双目相机。LSD-SLAM是一种基于光流跟踪的直接法
    发表于 02-26 09:41 8523次阅读
    从基本原理到应用的<b class='flag-5'>SLAM</b>技术<b class='flag-5'>深度</b>解析

    AGV激光雷达SLAM定位导航技术

    实现多AGV小车的协调控制。  ■激光雷达在AGV小车中的使用  SLAM中可以进行环境信息感知的主要传感器有激光雷达、摄像头等。其中,基于激光雷达的AGV小车自主定位与的方法,
    发表于 11-09 15:59

    SLAM技术的应用及发展现状

    也将SLAM分为激光SLAM视觉SLAM。激光SLAM视觉
    发表于 12-06 10:25

    让机器人完美SLAM 3.0到底是何方神圣?

    引擎,让机器人在复杂、大面积的场景下也能轻松应对,稳定发挥,完成定位导航任务。 传统SLAMSLAM 3.0的
    发表于 01-21 10:57

    激光SLAM视觉SLAM有什么区别?

    在机器人运动控制系统架构中,可分为最底层、中间通信层和决策层三大层面,最底层包含了机器人本身的电机驱动和控制部分,中间通信层是底层部分和决策层的通信通路,而决策层则是实现机器人的定位导航
    发表于 07-05 06:41

    在gazebo中构建一个用于导航的虚拟环境

    完整任务内容在gazebo中构建一个用于导航的虚拟环境,可以使用Building Editor工具创建,也可以使用其他功能包中已有的虚拟环境;将前面作业完成的带传感器的移动机器人(小车)模型
    发表于 12-17 07:06

    如何实现基于RK3399开发板的cartographer激光SLAM模块的设计?

    如何实现基于RK3399开发板的cartographer激光SLAM模块的设计?
    发表于 03-07 07:05

    单目视觉SLAM仿真系统的设计与实现

    实现单目视觉同时定位与(SLAM)仿真系统,描述其设计过程。该系统工作性能良好,其SLAM
    发表于 04-15 08:50 82次下载

    视觉SLAM技术浅谈

    ),地图构建精度约3cm;所以激光SLAM构建的地图精度一般来说比VSLAM高,且能直接用于定位导航视觉SLAM的地图建立4.易用性激光SLAM
    的头像 发表于 08-09 17:31 1562次阅读

    视觉SLAM深度解读

    ),地图构建精度约3cm;所以激光SLAM构建的地图精度一般来说比VSLAM高,且能直接用于定位导航视觉SLAM的地图建立4.易用性激光SLAM
    的头像 发表于 09-11 22:01 1893次阅读

    自动驾驶的视觉定位与导航应用详细解析

    SLAM(Simultaneous Localization And Mapping,同步定位与)的方式构建一个几何地图,然后在地图中进行路径规划和导航。在每一个时刻,无人车可以通
    发表于 04-28 08:00 7次下载
    自动驾驶的<b class='flag-5'>视觉</b>定位与<b class='flag-5'>导航</b>应用详细解析

    基于深度学习的视觉SLAM综述

    SLAM本质上是一个状态估计问题,根据传感器做划分,主要是激光、视觉两大类。激光SLAM的研究在理论和工程上都比较成熟,现有的很多行业已经开始使用激光SLAM完成工业工作;而
    的头像 发表于 12-02 15:00 1630次阅读

    基于相机和激光雷达的视觉里程计和系统

    提出一种新型的视觉-LiDAR里程计和系统SDV-LOAM,能够综合利用相机和激光雷达的信息,实现高效、高精度的姿态估计和实时
    发表于 05-15 16:17 610次阅读
    基于<b class='flag-5'>相机</b>和激光雷达的<b class='flag-5'>视觉</b>里程计和<b class='flag-5'>建</b><b class='flag-5'>图</b>系统

    视觉纹理导航,亦称Visual SLAM导航

    视觉纹理导航,亦称Visual SLAM导航,通过自动导引车车载视觉传感器获取运行区域周的图像信息来实现
    的头像 发表于 04-29 10:01 3239次阅读
    <b class='flag-5'>视觉</b>纹理<b class='flag-5'>导航</b>,亦称Visual <b class='flag-5'>SLAM</b><b class='flag-5'>导航</b>