下午好,亲爱的读者们! 在ROS机器人平台上的先前文章中,我谈到了本地化和映射的主题,尤其是,我们研究了SLAM方法:本文中的gmapping和本文中的hector_slam。 在本文中,我将继续熟悉ROS中的定位算法,并概述在ROS平台上实现的几种可视测距算法。 视觉测距法在机器人技术中很重要,因为它使您可以根据来自摄像机的视频流来评估机器人的运动,机器人的当前位置和加速度。 您可以使用常规的RGB相机(在这种情况下,是指单眼测距),也可以使用立体相机(立体测距),甚至是RGBD相机。
当使用诸如Microsoft Kinect之类的RGBD相机时,与立体相机相比,可以获得更准确的视觉测距,因为在这种情况下,我们使用3D数据。 在本文中,我们将考虑这种算法。 对这个主题感兴趣的人请关注。
rtabmap
rtabmap本质上是ROS SLAM算法。 在此软件包中,除了用于SLAM的工具外,还有一个
odometryViewer应用程序,用于测试各种视觉测距方法。 在rtabmap中,视觉里程表的工作方式如下:为了计算里程表,该算法使用从RGB图像获得的视觉属性和深度图的深度数据。 使用两个图像之间匹配的视觉属性(匹配),RANSAC算法计算连续帧之间的变换。
通过apt-get在ROS Indigo和Kinetic上安装rtabmap非常简单:
sudo apt-get install ros-<version>-rtabmap ros-<version>-rtabmap-ros
您还可以从源代码中设置rtabmap和rtabmap_ros:
source /opt/ros/<version>/setup.bash cd ~ git clone https://github.com/introlab/rtabmap.git rtabmap cd rtabmap/build cmake .. make cd ~/catkin_ws git clone https://github.com/introlab/rtabmap_ros.git src/rtabmap_ros catkin_make -j1
运行odometryViewer:
rtabmap-odometryViewer
这样的窗口打开:

稍微移动一下相机:

让我们尝试使用参数运行。 例如,使用单词袋方法(默认为SURF):
rtabmap-odometryViewer -bow
将词袋方法与SIFT描述符结合使用(0 = SURF,1 = SIFT)
rtabmap-odometryViewer -bow 1

使用FAST + Brief方法:
rtabmap-odometryViewer -bin

您也可以使用-icp选项尝试基于ICP方法(迭代最近点)的里程计。
您可以使用hz参数(每秒整数帧)调整处理频率:
rtabmap-odometryViewer -hz 2
您还可以配置算法的内部参数,例如,内层之间的最大距离,用于查找匹配项的可视符号的最大数量,RANSAC / ICP方法中的迭代次数。
通常,使用rtabmap的视觉测距法进行的实验表明,该算法可以快速运行而没有延迟,并且可以准确确定摄影机相对于场景的位置。 rtabmap软件包中算法的唯一缺点是,使用该算法时,不可能在rviz中显示里程表数据。 在这里,您需要了解有关与ROS集成的更多信息。
Fovis_ros软件包
fovis_ros软件包仅在ROS Hydro版本下可用。 存储库中有一个Indigo分支,但是在catkin工作区中编译时fovis_ros崩溃并显示错误。
要安装fovis_ros,我们将需要libfovis库和fovis_ros软件包本身。 从github存储库下载它们:
cd ~/catkin_ws/src git clone https://github.com/srv/libfovis.git cd libfovis git checkout hydro cd .. git clone https://github.com/srv/fovis.git cd fovis git checkout hydro cd ~/catkin_ws catkin_make source devel/setup.bash
在这里,我们需要确保Hydro选中了当前分支,否则可能会发生编译问题(存储库中的当前分支是Indigo)。
现在创建一个启动器以启动fovis_ros:
cd ~/catkin_ws/src git clone https://github.com/vovaekb/fovis_demo.git d ~/catkin_ws catkin_make source devel/setup.bash
运行fovis_demo.launch:
roslaunch fovis_demo fovis_demo.launch
rviz窗口将打开:

稍微移动相机并获取更新的位置:

fovis_ros在两个主题中发布数据:/ kinect_odometer /里程表(odometry)和/ kinect_odometer /姿势(position)。
现在,在我的示例中,我们将处理启动文件的内容。 有关信息,请参考第5章“计算机视觉”中的“为机器人编程学习ROS-第二版”一书中的文件。
让我们从主文件fovis_demo.launch开始。
排队
<arg name="mode" default="no_registered"/>
我们将mode参数设置为no_registered。 这意味着我们使用no_registered深度信息,即 深度图未注册,也不会从RGB相机转换为图片。 这样做是为了加快处理速度,因为如果记录了深度,该算法将运行缓慢。
检查里程表刷新率:
rostopic hz /kinect_odometer/odometry
我们得出类似的结论:
average rate: 8.759 min: 0.084s max: 0.156s std dev: 0.02417s window: 9 average rate: 7.938 min: 0.084s max: 0.180s std dev: 0.02724s window: 16 average rate: 7.493 min: 0.084s max: 0.217s std dev: 0.03286s window: 23 average rate: 8.111 min: 0.068s max: 0.217s std dev: 0.03645s window: 33
使用以下模式通过程序注册运行fovis_demo:= sw_registered参数:
roslaunch fovis_demo fovis_demo.launch mode:=sw_registered
我们将收到有关里程表更新率的以下信息:
average rate: 0.963 min: 1.022s max: 1.056s std dev: 0.01676s window: 3 average rate: 0.968 min: 1.020s max: 1.056s std dev: 0.01635s window: 4 average rate: 1.212 min: 0.509s max: 1.056s std dev: 0.25435s window: 6
接下来,我们为rviz定义显示配置文件:
<arg name="rviz_config" default="$(find fovis_demo)/config/rviz_$(arg mode).rviz"/>
我将不在这里考虑其内容。 我只说它决定了rviz窗口的外观:主题的活动显示,诸如“固定框架”之类的全局设置等。
以下是rviz参数的定义以及Kinect传感器的驱动程序的启动,具体取决于mode参数:
<include file="$(find fovis_demo)/launch/openni_kinect_$(arg mode).launch"/>
根据模式参数,从我们的程序包中启动fovis的启动器:
<include file="$(find fovis_demo)/launch/fovis_$(arg mode).launch"/>
由于我们基于摄像机的运动来估计机器人的运动,因此我们需要知道从摄像机坐标系到机器人坐标系的偏移或变换。 为此,我们使用tf包中的static_transform_publisher在坐标系base_link→camera_link之间发布静态转换:
<node pkg="tf" type="static_transform_publisher" name="base_to_camera_tf" args="0 0 -0.05 0 0 0 base_link camera_link 100"/>
最后,运行rviz:
<group if="$(arg rviz)"> <node name="rviz" pkg="rviz" type="rviz" args="-d $(arg rviz_config)"/> </group>
在本文中,我不会考虑其余的启动器文件。 如果需要,这可以独立完成。 我只是说,当使用参数mode = sw_registered启动fovis_ros时,我们会对RGB摄像机的帧进行调节,即 以较低的更新频率(2.5 Hz)将消息从一个主题重新发布到另一个主题(有关更多详细信息,请参见)。
对于那些有兴趣深入研究fovis算法的人,有
一篇文章详细介绍了该算法。
视觉测距法fovis_ros的实验表明,该算法的运行速度不如rtabmap快,在移动相机时会有很小的延迟,但是仍然可以非常准确地确定相机相对于场景的位置。
希望本文对视觉里程计算法的回顾对您的工作有所帮助,并帮助您解决一些问题。 祝您在项目中取得成功,并很快见到您!
PS:我还请您参加调查并选择您在工作中使用的ROS版本。