内容翻译⾃http://wiki.ros.org/rtabmap_ros/Tutorials/SetupOnYourRobot

1.介绍

机器⼈必须⾄少配备⼀个类似 Kinect 的传感器。 我 强烈建议 按照 校准类似 Kinect 的传感器 本指南 。

如果您想使⽤ 2D 激光,Kinect 的云必须与激光扫描对⻬。

我将在接下来的部分中介绍⼀些可能的配置,具体取决于机器⼈和⽰例启动⽂件。

推荐的机器⼈配置 :

输出 2D 激光器 sensor_msgs/LaserScan 消息的 。

输出 ⾥程计(IMU、⻋轮编码器等) nav_msgs/Odometry 消息的 。

与 兼容的校准类 Kinect 传感器 openni_launch 、 openni2_launch 或 freenect_launch ros 包 。

这些⽰例基于我为 AZIMUT3 所做的 。 该机器⼈配备了 Kinect、URG-04LX 和使⽤⻋轮编码器提供的⾥

程计。

2.构建你的机器⼈

如果您的机器⼈有 :机器⼈应该以 发布他的 ⾥程计 nav_msgs/Odometry ⾥程计 格式 。

I如果您有激光:启动激光节点,它应该发布 sensor_msgs/LaserScan 消息。 这⾥我们使⽤

hokuyo_node 节点。

使⽤OpenNI 需要depth_registration:=true

必须提供 TF 转换(通过使⽤机器⼈的 URDF 或使⽤ 在⽂件中⼿动提供 静态转换发布者 )。 主要

有⽤的转换是“/odom”、“/base_link”、“/base_laser_link”和“/camera_link”。

$ roslaunch openni_launch openni.launch depth_registration:=true2.1 kinect + ⾥程计 + 2D 激光

在这个配置中,我假设你有⼀个轮式机器⼈被限制在平⾯ XY 上,只能在 旋转 偏航上 (绕 z 轴)。

<launch>

<group ns="rtabmap">

<!-- Use RGBD synchronization -->

<!-- Here is a general example using a standalone nodelet,

but it is recommended to attach this nodelet to nodelet

manager of the camera to avoid topic serialization -->

<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="standalone

rtabmap_ros/rgbd_sync" output="screen">

<remap from="rgb/image" to="/camera/rgb/image_rect_color"/>

<remap from="depth/image" to="/camera/depth_registered/image_raw"/>

<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>

<remap from="rgbd_image" to="rgbd_image"/> <!-- output -->

<!-- Should be true for not synchronized camera topics

(e.g., false for kinectv2, zed, realsense, true for xtion, kinect360)-

->

<param name="approx_sync" value="true"/>

</node>

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="-

-delete_db_on_start">

<param name="frame_id" type="string" value="base_link"/>

<param name="subscribe_depth" type="bool" value="false"/>

<param name="subscribe_rgbd" type="bool" value="true"/>

<param name="subscribe_scan" type="bool" value="true"/>

<remap from="odom" to="/base_controller/odom"/>

<remap from="scan" to="/base_scan"/>

<remap from="rgbd_image" to="rgbd_image"/>

<param name="queue_size" type="int" value="10"/><!-- RTAB-Map's parameters -->

<param name="RGBD/NeighborLinkRefining" type="string" value="true"/>

<param name="RGBD/ProximityBySpace" type="string" value="true"/>

<param name="RGBD/AngularUpdate" type="string" value="0.01"/>

<param name="RGBD/LinearUpdate" type="string" value="0.01"/>

<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>

<param name="Grid/FromDepth" type="string" value="false"/>

<!-- occupancy grid from lidar -->

<param name="Reg/Force3DoF" type="string" value="true"/>

<param name="Reg/Strategy" type="string" value="1"/> <!--

1=ICP -->

<!-- ICP parameters -->

<param name="Icp/VoxelSize" type="string"

value="0.05"/>

<param name="Icp/MaxCorrespondenceDistance" type="string" value="0.1"/>

</node>

</group>

</launch>

让我们分解这个启动⽂件:

<group ns="rtabmap">

为⽅便起⻅,我们将 rtabmap 节点放在 rtabmap 命名空间中。 rtabmap 节点提供的服务可能与来⾃

其他节点的其他服务发⽣冲突。

<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="standalone

rtabmap_ros/rgbd_sync" output="screen">

<remap from="rgb/image" to="/camera/rgb/image_rect_color"/>

<remap from="depth/image" to="/camera/depth_registered/image_raw"/>

<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>

<remap from="rgbd_image" to="rgbd_image"/>

<param name="approx_sync" value="true"/>

</node>

在这个例⼦中,因为 rtabmap 节点同步来⾃不同传感器的主题,我们使⽤ rgbd_sync nodelet 来确保我

们的图像主题在将它们提供给 之前正确同步在⼀起 rtabmap 。 输出 rgbd_image 是

rtabmap_ros/RGBDImage 消息。 ,参数 approx_sync 当相机节点尚未同步相机主题时 应为真,例如

此处对于 Xbox 360 的 或 openni2 驱动 freenect approx_sync 程序。对于 Kinect v2、ZED 或

realsense 的相机驱动程序, 应为 false,因为它们发布 rgb 和深度主题已经同步(相同的时间戳)。

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--

delete_db_on_start">

该 --delete_db_on_start 参数将使 rtabmap 删除数据库(默认位于 〜/ .ros / rtabmap.db 启动

时)。 如果您希望机器⼈从之前的映射会话继续映射,您应该删除 --delete_db_on_start 。

<param name="frame_id" type="string" value="base_link"/>

“frame_id”应该是机器⼈上的固定框架。<param name="subscribe_depth" type="bool" value="true"/>

<param name="subscribe_scan" type="bool" value="true"/>

默认情况下, subscribe_depth 为真。 但是,在此设置中,我们将改⽤ RGB-D 图像输⼊,因此

subscribe_depth 设置为 false,而 subscribe_rgbd 设置为 true。 由于我们有⼀个 2D 激光雷达,请

将 设置 subscribe_scan 为 true。 如果我们有⼀个 3D 激光雷达发布 sensor_msgs/PointCloud2 消

息,请将 设置 subscribe_scan_cloud 为 true 并重新映射相应的 scan_cloud 主题而不是 scan 。

当 subscribe_rgbd=true 时 , rgbd_image 应设置 输⼊主题。

当 subscribe_scan=true 时 , 扫描 应设置 输⼊主题。

<remap from="odom" to="/base_controller/odom"/>

<remap from="scan" to="/base_scan"/>

<remap from="rgbd_image" to="rgbd_image"/>

设置所需的输⼊主题。 需要注意的是 rgbd_image 没有前导斜杠,这意味着它订阅 rgbd_image 在其命

名空间,这将是 / rtabmap / rgbd_image 在这种情况下。

<param name="queue_size" type="int" value="10"/>

⽤于同步上述输⼊主题。 所述 rtabmap 节点进⾏同步 / base_controller /奥多姆 , / base_scan

和 / rtabmap / rgbd_image 在⼀个单⼀的回调。 该值越⾼,⽤于每个主题的费率就越灵活。 在

AZIMUT3 上, odom /base_controller/ 以 50 Hz 的频率发布, /base_scan 以 10 Hz 的频率发

布,图像以 30 Hz 的频率发布。

<!-- RTAB-Map的参数-->

<param name="RGBD/NeighborLinkRefining" type="string" value="true"/>

<param name="RGBD/ProximityBySpace" type="string" value="true"/>

<param name="RGBD/AngularUpdate" type="string" value="0.01"/>

<param name="RGBD/LinearUpdate" type="string" value="0.01"/>

<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>

<param name="Grid/FromDepth" type="string" value="false"/>

<param name="Reg/Force3DoF" type="string" value="true"/>

<param name="Reg/Strategy" type="string" value="1"/> <!-- 1=ICP -->

<!-- ICP参数-->

<param name="Icp/VoxelSize" type="string" value="0.05"/>

<param name="Icp/MaxCorrespondenceDistance" type="string" value="0.1"/>

此部分设置 RTAB-Map 的参数(与独⽴版本中的⾸选项对话框相同)。 要知道RTAB-Map的所有可以

设置的参数,加上⼀些描述,执⾏这个命令:

$ rosrun rtabmap_ros rtabmap --params

以下是此处设置的主要参数的简要概述:

RGBD/NeighborLinkRefining ⾥程计 :使⽤ ICP 使⽤输⼊激光雷达主题校正 。

RGBD/ProximityBySpace :根据地图中的机器⼈位置查找局部闭环。 例如,当机器⼈以相反的⽅

向返回时,它很有⽤。 相机朝后,⽆法找到全局闭环。 因此,使⽤位置和先前添加到地图的激光

扫描,我们使⽤ ICP 找到变换。

RGBD/AngularUpdate :机器⼈应该移动以更新地图(如果不是 0)。

RGBD/LinearUpdate :机器⼈应该移动以更新地图(如果不是 0)。RGBD/OptimizeFromGraphEnd :通过设置为 false(这是默认值),在循环闭包时,将从地图中

的第⼀个姿势开始优化图形。 ,TF /map -> /odom 发⽣这种情况时 会发⽣变化。 当设置为 false

时,图形从添加到地图的最新节点而不是第⼀个节点进⾏优化。 通过从最后⼀个优化,最后⼀个姿

势保持其值,所有先前的姿势都根据它进⾏校正(因此 /odom 和 /map 将始终匹配在⼀起)。

Grid/FromDepth :如果为 true,则占⽤⽹格是从深度相机⽣成的云中创建的。 如果为 false,则

根据激光扫描创建占⽤⽹格。

Reg/Force3DoF :强制 3DoF 注册: roll 、 pitch 和 z 不会估计 。

规则/策略 :我们选择 ICP 来改进使⽤激光扫描使⽤ ICP 发现的全局闭环。

Icp/VoxelSize :在做 ICP 之前,扫描被过滤到 5 厘⽶的体素。

Icp/MaxCorrespondenceDistance : ICP 注册期间点之间的最⼤距离。

关闭组。

2.2 Kinect + ⾥程计 + 来⾃ Kinect 的假 2D 激光

如果您没有激光并且想要创建 2D 占⽤⽹格图(需要激光扫描),您可以使⽤ 使⽤ Kinect 的深度图像模

拟 2D 激光 depthimage_to_laserscan ros-pkg 。 这是⽤于 的配置 IROS 2014 Kinect Contest 。 这也

可以⽤于像 这样的机器⼈ TurtleBot 。 与上⾯⽰例中的真实激光雷达不同,我不建议将 设置

Reg/Strategy 为 1(对于 ICP),因为相机的视野太小而⽆法进⾏良好的 ICP 注册。

</node>

</group>

<launch>

<!-- Kinect cloud to laser scan -->

<node pkg="depthimage_to_laserscan" type="depthimage_to_laserscan"

name="depthimage_to_laserscan">

<remap from="image" to="/camera/depth_registered/image_raw"/>

<remap from="camera_info" to="/camera/depth_registered/camera_info"/>

<remap from="scan" to="/kinect_scan"/>

<param name="range_max" type="double" value="4"/>

</node>

<!-- SLAM -->

<group ns="rtabmap">

2.3 Kinect + 2D laser

如果您没有⾥程计,您可以使⽤ 2D 激光扫描和 ICP 创建⼀个。 有了这个新的⾥程计节点后,您可以执

⾏与 相同的步骤 上述 (使⽤⾥程计)。 要从激光扫描⽣成⾥程计,请查看这些包:

laser_scan_matcher 或 hector_slam 。 新的 RTAB-Map 现在拥有⾃⼰的 icp_odometry 节点。

下⾯是⼀个关于 如何 hector_slam 与 集成的 rtabmap ⽰例 : demo_hector_mapping.launch 。 你可

以⽤这个包试试: 包中 demo_mapping.bag 先从 (你应该 取出“/odom”tf):

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="-

-delete_db_on_start">

<param name="frame_id" type="string" value="base_footprint"/>

<param name="subscribe_depth" type="bool" value="true"/>

<param name="subscribe_scan" type="bool" value="true"/>

<remap from="odom" to="/base_controller/odom"/>

<remap from="scan" to="/kinect_scan"/>

<remap from="rgb/image" to="/camera/rgb/image_rect_color"/>

<remap from="depth/image" to="/camera/depth_registered/image_raw"/>

<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>

<param name="queue_size" type="int" value="10"/>

<!-- RTAB-Map's parameters -->

<param name="RGBD/ProximityBySpace" type="string" value="false"/>

<param name="RGBD/AngularUpdate" type="string" value="0.01"/>

<param name="RGBD/LinearUpdate" type="string" value="0.01"/>

<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>

<param name="Reg/Force3DoF" type="string" value="true"/>

<param name="Vis/MinInliers" type="string" value="12"/>

</node>

</group>

</launch>对于使⽤ 的⽰例 rtabmap_ros/icp_odometry ,将 设置 hector 上⾯的 参数 为 false。 为获得最佳结

果,请使⽤ 构建 rtabmap libpointmatcher 依赖项 。

2.4 仅⼆维激光

这与 ⽰例相同 上⾯ 使⽤ Kinect+Laser 的 ,但没有摄像头。 如果你只有⼀个没有⻋轮⾥程计的激光雷

达,你可以试试这个设置。 显然,如果没有摄像头,您将⽆法使⽤视觉检测全局闭环或全局定位。 如

果⾥程计没有漂移太多,仍然可以检测到接近度检测以随着时间的推移校正⾥程计。 我们将再次使⽤

⾥程计的 demo_mapping.bag 没有⻋轮 和相同的启动⽂件(

demo_hector_mapping.launch ),但

使⽤参数“camera:=false”来禁⽤相机内容:

对于使⽤ 的⽰例 rtabmap_ros/icp_odometry ,将 设置 hector 上⾯的 参数 为 false。 为获得最佳结

果,请使⽤ 构建 rtabmap libpointmatcher 依赖项 。

2.5 2D 激光 + ⻋轮⾥程计作为猜测

$ rosbag filter demo_mapping.bag demo_mapping_no_odom.bag 'topic != "/tf" or

topic == "/tf" and m.transforms[0].header.frame_id != "/odom"'

$ roslaunch rtabmap_ros demo_hector_mapping.launch hector:=true

$ rosbag play --clock demo_mapping_no_odom.bag

$ rosbag filter demo_mapping.bag demo_mapping_no_odom.bag 'topic != "/tf" or

topic == "/tf" and m.transforms[0].header.frame_id != "/odom"'

$ roslaunch rtabmap_ros demo_hector_mapping.launch hector:=true 相机:=false

$ rosbag play --clock demo_mapping_no_odom.bag这与 ⽰例相同 上⾯ 仅使⽤激光的 ,但在这⾥我们使⽤⻋轮⾥程计作为 icp_odometry 的猜测。 这将使

icp_odometry 对于具有短距离激光雷达的类似走廊的环境更加稳健。 对于此⽰例,我们将使⽤ 的原始

⾥程计 demo_mapping.bag 带有⻋轮 。 在这⾥,我们应该使⽤启动⽂件 设置“hector:=false”和

“odom_guess:=true” demo_hector_mapping.launch :

显然,如果没有摄像头,您将⽆法使⽤视觉检测全局闭环或全局定位。 如果⾥程计没有漂移太多,仍然

可以检测到接近度检测以随着时间的推移校正⾥程计。 通过设置“camera:=true”,可以使⽤相机运⾏相

同的⽰例以进⾏⽐较。 为获得最佳结果,请使⽤ 构建 rtabmap libpointmatcher 依赖项 。

2.6 Kinect + ⾥程计

在此配置中,我假设您有⼀个不受限于单个平⾯(如 UAV)的机器⼈,它可以在 移动 XYZ 中 并进⾏

roll 、 pitch 、 yaw 旋转。

$ roslaunch rtabmap_ros demo_hector_mapping.launch hector:=false 相机:=false

odom_guess:=true

$ rosbag play --clock demo_mapping.bag

<launch>

2.7 Kinect

<group ns="rtabmap">

<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="standalone

rtabmap_ros/rgbd_sync" output="screen">

<remap from="rgb/image" to="/camera/rgb/image_rect_color"/>

<remap from="depth/image" to="/camera/depth_registered/image_raw"/>

<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>

<remap from="rgbd_image" to="rgbd_image"/> <!-- output -->

<!-- Should be true for not synchronized camera topics

(e.g., false for kinectv2, zed, realsense, true for xtion, kinect360)-

->

<param name="approx_sync" value="true"/>

</node>

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="-

-delete_db_on_start">

<param name="frame_id" type="string" value="base_link"/>

<param name="subscribe_depth" type="bool" value="false"/>

<param name="subscribe_rgbd" type="bool" value="true"/>

<remap from="odom" to="/base_controller/odom"/>

<remap from="rgbd_image" to="rgbd_image"/>

<param name="queue_size" type="int" value="10"/>

<!-- RTAB-Map's parameters -->

<param name="RGBD/AngularUpdate" type="string" value="0.01"/>

<param name="RGBD/LinearUpdate" type="string" value="0.01"/>

<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>

</node>

</group>

</launch>如果您没有可靠的⾥程计,您可以仅使⽤ RTAB-Map 以“丢失⾥程计”为代价进⾏映射(如 的 独⽴版本中

红⾊屏幕 )。 当 时,机器⼈可能会检测到这种“丢失”状态 空 发送 ⾥程计消息 rgbd_odometry 节点 。

请注意,我们将 rtabmap 节点的 approx_sync 设置为 false 以确保它完全使⽤使⽤相同的

rgbd_image 主题计算的 odom 。

2.8 双⽬摄像头 A

<launch>

<group ns="rtabmap">

<node pkg="nodelet" type="nodelet" name="rgbd_sync" args="standalone

rtabmap_ros/rgbd_sync" output="screen">

<remap from="rgb/image" to="/camera/rgb/image_rect_color"/>

<remap from="depth/image" to="/camera/depth_registered/image_raw"/>

<remap from="rgb/camera_info" to="/camera/rgb/camera_info"/>

<remap from="rgbd_image" to="rgbd_image"/> <!-- output -->

<!-- 对于不同步的相机主题应该是真的

(例如,对于 kinectv2、zed、realsense 为 false,对于 xtion、kinect360 为 true)--

>

<param name="approx_sync" value="true"/>

</node>

<!-- Odometry -->

<node pkg="rtabmap_ros" type="rgbd_odometry" name="rgbd_odometry"

output="screen">

<param name="subscribe_rgbd" type="bool" value="true"/>

<param name="frame_id" type="string" value="base_link"/>

<remap from="rgbd_image" to="rgbd_image"/>

</node>

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="-

-delete_db_on_start">

<param name="frame_id" type="string" value="base_link"/>

<param name="subscribe_depth" type="bool" value="false"/>

<param name="subscribe_rgbd" type="bool" value="true"/>

<remap from="odom" to="odom"/>

<remap from="rgbd_image" to="rgbd_image"/>

<param name="queue_size" type="int" value="10"/>

<param name="approx_sync" type="bool" value="false"/>

<!-- RTAB-Map's parameters -->

<param name="RGBD/AngularUpdate" type="string" value="0.01"/>

<param name="RGBD/LinearUpdate" type="string" value="0.01"/>

<param name="RGBD/OptimizeFromGraphEnd" type="string" value="false"/>

</node>

</group>

</launch>RTAB-Map 也可以与⽴体相机⼀起使⽤。 如上图所⽰,您需要安装 viso2_ros 和 stereo_image_proc 节

点。

<launch>

<!-- Run the ROS package stereo_image_proc for image rectification and

disparity computation -->

<group ns="stereo">

<node pkg="stereo_image_proc" type="stereo_image_proc"

name="stereo_image_proc"/>

<!-- Disparity to depth -->

<node pkg="nodelet" type="nodelet" name="disparity2depth" args="standalone

rtabmap_ros/disparity_to_depth"/>

</group>

<!-- Odometry: Run the viso2_ros package -->

<node pkg="viso2_ros" type="stereo_odometer" name="stereo_odometer"

output="screen">

<remap from="stereo" to="stereo"/>

<remap from="image" to="image_rect"/>

<param name="base_link_frame_id" value="/base_link"/>

<param name="odom_frame_id" value="/odom"/>

<param name="ref_frame_change_method" value="1"/>

</node>

<group ns="rtabmap">

<!-- Visual SLAM -->

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="-

-delete_db_on_start">

<param name="subscribe_depth" type="bool" value="true"/>

<param name="subscribe_laserScan" type="bool" value="false"/>

<remap from="rgb/image" to="/stereo/left/image_rect"/>

<remap from="rgb/camera_info" to="/stereo/left/camera_info"/>

<remap from="depth/image" to="/stereo/depth"/>

<remap from="odom" to="/stereo_odometer/odometry"/>

<param name="frame_id" type="string" value="/base_link"/>请注意,我们将 rtabmap 节点的 approx_sync 设置为 false 以确保它完全使⽤使⽤相同图像主题计

算的 odom 。

2.9 双⽬摄像头 B

⻚⾯ StereoOutdoorMapping 显⽰了⼀个⼯作演⽰,您可以尝试使⽤提供的 rosbag。 对于与⽴体相机

的实际映射,您的相机驱动程序应发布如下图像消息(相机命名空间可以与 不同 stereo_camera ):

并假设相机驱动提供了 TF 相机 ⽴体 并且左右图像是同步的(注意 approx_sync 设置为 false),对应

的启动⽂件可能是这样的:

<param name="queue_size" type="int" value="30"/>

<param name="approx_sync" type="bool" value="false"/>

<param name="Vis/MinInliers" type="string" value="12"/>

</node>

</group>

</launch>

$ rostopic list

/stereo_camera/left/image_raw

/stereo_camera/left/camera_info

/stereo_camera/right/image_raw

/stereo_camera/right/camera_info

<launch>

<arg name="pi/2" value="1.5707963267948966" />

<arg name="optical_rotate" value="0 0 0 -$(arg pi/2) 0 -$(arg pi/2)" />

<node pkg="tf" type="static_transform_publisher" name="camera_base_link"

args="$(arg optical_rotate) base_link stereo_camera 100" />

<!-- Run the ROS package stereo_image_proc -->

<group ns="/stereo_camera" >

<node pkg="stereo_image_proc" type="stereo_image_proc"

name="stereo_image_proc"/>

<!-- Odometry --><node pkg="rtabmap_ros" type="stereo_odometry" name="stereo_odometry"

output="screen">

<remap from="left/image_rect" to="left/image_rect"/>

<remap from="right/image_rect" to="right/image_rect"/>

<remap from="left/camera_info" to="left/camera_info"/>

<remap from="right/camera_info" to="right/camera_info"/>

<param name="frame_id" type="string" value="base_link"/>

<param name="odom_frame_id" type="string" value="odom"/>

<param name="approx_sync" type="bool" value="false"/>

<param name="queue_size" type="int" value="5"/>

<param name="Odom/MinInliers" type="string" value="12"/>

<param name="Odom/RoiRatios" type="string" value="0.03 0.03 0.04 0.04"/>

</node>

</group>

<group ns="rtabmap">

<node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--

delete_db_on_start">

<param name="frame_id" type="string" value="base_link"/>

<param name="subscribe_stereo" type="bool" value="true"/>

<param name="subscribe_depth" type="bool" value="false"/>

<param name="approx_sync" type="bool" value="false"/>

<remap from="left/image_rect" to="/stereo_camera/left/image_rect_color"/>

<remap from="right/image_rect" to="/stereo_camera/right/image_rect"/>

<remap from="left/camera_info" to="/stereo_camera/left/camera_info"/>

<remap from="right/camera_info" to="/stereo_camera/right/camera_info"/>

<remap from="odom" to="/stereo_camera/odom"/>

<param name="queue_size" type="int" value="30"/>

<!-- RTAB-Map's parameters -->

<param name="Vis/MinInliers" type="string" value="12"/>

</node>

</group>

</launch>

对于可视化,我建议尝试 ⽴体室外映射 教程,看看 发⽣了 rviz 什么 。 要使⽤ rtabmapviz ,您可以在

下添加节点 rtabmap 上⾯的 命名空间 :

<group ns="rtabmap">

<!-- Visualisation RTAB-Map -->

<node pkg="rtabmap_ros" type="rtabmapviz" name="rtabmapviz" args="-d $(find

rtabmap_ros)/launch/config/rgbd_gui.ini" output="screen">

<param name="subscribe_stereo" type="bool" value="true"/>

<param name="subscribe_odom_info" type="bool" value="true"/>

<param name="queue_size" type="int" value="10"/>

<param name="frame_id" type="string" value="base_link"/>

<remap from="left/image_rect" to="/stereo_camera/left/image_rect_color"/>

<remap from="right/image_rect" to="/stereo_camera/right/image_rect"/>

<remap from="left/camera_info" to="/stereo_camera/left/camera_info"/>

<remap from="right/camera_info" to="/stereo_camera/right/camera_info"/>

<remap from="odom_info" to="/stereo_camera/odom_info"/>

<remap from="odom" to="/stereo_camera/odom"/>3. 导航

所述 rtabmap 节点使⽤激光扫描来创建可由⼀个规划器中使⽤的2D占⽤⽹格图(⻅ grid_map 主

题)。 如果您没有激光扫描,您可以使⽤ 创建 rtabmap 带有 节点 proj_map 主题的 从 Kinect 或⽴体

点云在地⾯上的投影 ⼀个 2D 占⽤⽹格图。 访问 StereoOutdoorNavigation 有关创建此类地图的⽰

例,请 ⻚⾯。

  1. 远程可视化

4.1 rtabmapviz

为了让 rtabmapviz 与 rtabmap 节点轻松通信,在与 rtabmap 相同的命名空间中启动它,这样所有主

题和服务都可以直接连接,⽆需重新映射。

4.2 rviz

RTAB-Map的ros-pkg构建完成后, rtabmap_ros/MapCloud 可以在RVIZ中选择 插件,对构建的3D地图

云进⾏可视化。

</node>

</group>

$ export ROS_NAMESPACE=rtabmap

$ rosrun rtabmap_ros rtabmapviz _frame_id:=base_link

$ rosrun rviz rviz