Rosanswers logo

Hi, I'm trying to build a 3D map remotely with RTABMap over WiFi. I'm running a navigation stack, Rosaria, freenect and depthimage_to_laserscan nodes on Raspberry Pi 3 which is interfaced with Kinect Xbox 360 camera and Pioneer robot. RTABMap and RViz nodes are running on my laptop. ROS Kinetic is installed on both computers with Ubuntu 14.04 LTS 32-bit on laptop and Ubuntu Mate on RPi3.

Here are some screenshots of 3D maps I've build so far. Let's say these are the least bad.

1.) I've tried experimenting with different velocity rates, slowing vel_x and vel_theta down to 0.1 m/s. Maybe it did reduce misalignment a bit, but 3D map still has considerable amount of error.

2.) I am not sure if I should try calibrating my Kinect, since Freenect loads default calibration settings every time it starts.

3.) I have one static TF transform between robot base_link and camera_link which I've set up following this tutorial. Kinect is positioned 17,5 cm at the back on x-axis and 56,7 cm from the center of robot's base to the center of kinect.

<node pkg="tf" type="static_transform_publisher" name="base_to_camera_tf" args="-0.175 0.0 0.567 0 0 0 /base_link /camera_link 100"

I am not sure if I should also have base_footprint between /odom and /base_link. I did notice that there is as a map offset in RviZ. This is how my TF frames look like.

4.) Could it be that robot using skid steering drive leads to odometry drift? Even if I am trying to map a small scale space, a room that is 5,5 m x 4,5 m.

5.) Would some parameter tunning improve the performance? I also tried throttling frame rate but I would not say that it had any considerable effect on reducing the errors. I am currently using these:

    <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="Optimizer/Slam2D"          type="string" value="true"/>
      <param name="Reg/Strategy"              type="string" value="1"/> <!-- 1=ICP -->
      <param name="Reg/Force3DoF"             type="string" value="true"/>
      <param name="Vis/MaxDepth"              type="string" value="4.0"/>
      <param name="Vis/MinInliers"            type="string" value="5"/>
      <param name="Vis/InlierDistance"        type="string" value="0.05"/>
      <param name="Rtabmap/TimeThr"           type="string" value="700"/>
      <param name="Mem/RehearsalSimilarity"   type="string" value="0.45"/>
      <param name="Icp/CorrespondenceRatio"   type="string" value="0.5"/>
      <!-- Added -->
      <param name="Odom/Strategy"       type="string" value="1"/> <!-- Frame-to-Frame odometry -->
      <param name="Odom/GuessMotion"    type="string" value="true" /> 
      <param name="Vis/EstimationType"  type="string" value="1"/>  <!-- 2D->3D PnP -->
      <param name="Vis/CorType"         type="string" value="1"/> 

I'm stuck ATM, since I do not know what to try next to improve the quality of 3D map. Any suggestions would be much appreciated. Thanks!

Originally posted by Dox on ROS Answers with karma: 36 on 2018-07-21

Post score: 0

Original comments

Comment by matlabbe on 2018-07-24:
Can you share a database? From the screenshots, errors seem coming from the odometry drift and/or not precise tf between base_link and camera_link.

Comment by Dox on 2018-07-25:
I couldn't find a database that corresponds to those specific screenshots since I have many. This one is even messier. If you need more db or anything else, please let me know.


1 Answer 1


Rosanswers logo


Looking at the database, odometry from your robot is drifting quite much at some places, here is an example between two captures 1 second apart:

image description

Synchronization between RGB-D data and scan is sometimes poor, does the scan is coming from the same depth image fed to rtabmap?

image description

When using scan from RGB-D camera, don't use these parameters:

<param name="Reg/Strategy"        type="string" value="1"/> <!-- 1=ICP -->
<param name="Odom/Strategy"       type="string" value="1"/> <!-- Frame-to-Frame odometry -->
<param name="Odom/GuessMotion"    type="string" value="true" /> 
<param name="Vis/EstimationType"  type="string" value="1"/>  <!-- 2D->3D PnP -->
<param name="Vis/CorType"         type="string" value="1"/>

Synchronization between RGB and Depth is also poor sometimes, what is the frame rate of rgb and depth images? image description

Here is the map without loop closure optimizations, only odometry from the robot: image description

With loop closures: image description

I am quite surprised that the map is quite good for as much odometry noise.

I did reprocessed the database, but computing visual odometry instead, here are the results, without loop closures: image description

with loop closures: image description

Note that visual odometry should give better results than that when processing at higher frame rate than 1 Hz here. The optimized results are good enough to generate a mesh though:

image description

In conclusion, you may try to increase accuracy of your robot odometry, or switch to visual odometry. However, as you are using a RPI3 on the robot, you may not be able to stream as fast the images to remote computer so that odometry can be done higher than 10 Hz. For the synchronization problem, I think it is coming from the network as rtabmap is running offboard. You may try to use rtabmap_ros/rgbd_sync nodelet to synchronize RGB, depth and camera_info message on RPI before sending the synchronized rtabmap_ros/RGBDImage message to rtabmap offboard. On the robot:

<group ns="camera">
  <node pkg="nodelet" type="nodelet" name="rgbd_sync" args="load rtabmap_ros/rgbd_sync camera_nodelet_manager">
    <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"/>

Then on laptop, start rtabmap with subscribe_rgbd:=true:

<param name="subscribe_depth" type="bool"   value="false"/>
<param name="subscribe_rgbd"  type="bool"   value="true"/>
<remap from="rgbd_image"  to="/camera/rgbd_image/compressed"/>


Originally posted by matlabbe with karma: 6409 on 2018-07-25

This answer was ACCEPTED on the original site

Post score: 2

Original comments

Comment by Dox on 2018-07-26:
Thank you for your thorough analysis and clarification Mathieu.

I don't know how to improve the robot's odometry atm, so I'll try with visual odometry as you suggested. Basically, I need to replace ROSAria's odom for rtabmap rgbd_odometry node, right? I'll test it and get back with results asap.

Comment by Dox on 2018-08-14:
Hi Mathieum when trying to use rtabmap_ros/rgbd_sync nodelet as u suggested I get the following error: Failed to load nodelet [/camera/rgbd_sync] of type [rtabmap_ros/rgbd_sync] even after refreshing the cache: Failed to load library /opt/ros/kinetic/lib//librtabmap_ros.so. Make sure that you are...

Comment by Dox on 2018-08-14:
...calling the PLUGINLIB_EXPORT_CLASS macro in the library code, and that names are consistent between this macro and your XML. Error string: Could not load library (Poco exception = librtabmap_core.so.0.17: cannot open shared object file: No such file or directory)

Comment by matlabbe on 2018-08-14:
Hi, rgbd_sync should be in the released binaries for kinetic. Is ros-kinetic-rtabmap-ros updated to latest version?

Comment by Dox on 2018-08-15:
I have v 0.17 installed. I also get this:

Client [/rtabmap/rtabmap] wants topic /camera/rgbd_image/compressed to have datatype/md5sum [rtabmap_ros/RGBDImage/a7fa8f34f44b976b3b2dec13c02f9f0e], but our version has [rtabmap_ros/RGBDImage/e2918ceee8cb5b4c4b0007166508b871]. Dropping connection.

Comment by matlabbe on 2018-08-15:
Make sure you have the same version on both computers. The topic didn't change since 0.17.0 release.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.