内容翻译⾃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 有关创建此类地图的⽰
例,请 ⻚⾯。
- 远程可视化
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
评论(0)
您还未登录,请登录后发表或查看评论