I am working on a project where we are mapping a large course outdoors and then we are trying to localize in the course to navigate to the goal. There are a few problems we are running into that I was hoping you could help with.
We are doing the project in ROS, and using rtabmapviz to visualize it.
We are using the realsense d435 camera outdoors, which for the most part works really well, but with the lighting changing it inevatably loses odometry returning the following message:
[ WARN] (2018-06-05 16:58:25.682) OdometryF2M.cpp:472::computeTransform() Registration failed: "Not enough inliers 0/20 (matches=36) between -1 and 462"
We found that this can be fixed by either going back to the point where the odometry was lost, or calling /reset_odometry.
we prefer to reset odometry and continue moving forward for the sake of time.
This works well to find the loop closure and then we can continue navigating, but it also resets the /rtabmap/odom message to zero. After loop closure, the odom is no longer with respect to the original origin. Is there any way to reinitialize the odometry with respect to the original map so that waypoints in the original map are still valid?
So far we are not autonomously navigating, we are just driving the car by RC. but the goal is to get it driving autonomously following waypoints we give it to navigate in the map.
Another bit of information that may be important is that we are building the map in several parts with loop closure between the segments of the map so that it saves as a large map.
as of now we are planning on subscribing to the /rtabmap/odom topic with our path planner so we need that to be a global coordinate system. Is there a better topic to subscribe to?
Another issue we are running into is that rtabmap assumes that we are starting a new session where the last session ended, which makes running successive tests which start in the same location, but end far away difficult. Is there a way to tell rtabmap where you are going to start?
The service /reset_odometry resets odom to 0. If you know the pose you want to reset odom, you can call /reset_odom_to_pose service. However, if you just want to automatically reset odom to last pose, set parameter "Odom/ResetCountdown" to 1. Rtabmap will still create a new map, so a loop closure should happen to merge back with the a previous map.
Odometry topic is in /odom frame, not /map frame. If you want to plan in /map frame, I suggest to subscribe to TF /map -> /base_link to know current position of the car in /map frame. Odometry can then restart to any values, as long as the car is localized in the map, the poses in /map frame will be always the same between sessions. You may use RVIZ to better visualize TF.
Yes, by default now rtabmap assumes that we are restarting from latest localization from the previous session. This can be disabled though, by setting parameter "RGBD/SavedLocalizationIgnored" to true.