rtabmap with PX4 in Gazebo

Posted by lh917 on
URL: http://official-rtab-map-forum.206.s1.nabble.com/rtabmap-with-PX4-in-Gazebo-tp6721.html

Hi, I'm fairly new to rtabmap and trying to implement stereo odometey with a px4 built-in model and iris drone. I followed the tutorial in SetupOnYourRobot with the Stereo B approach. Then I tried to implement vision position fusion with no GPS.

My launch file for rtabmap is:

<launch>
  <arg name="rviz" default="false" />
  <arg name="rtabmapviz" default="true" />

<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="base_to_color"
      args="$(arg optical_rotate) iris_0/base_link camera_link 100" />

<!-- Run the ROS package stereo_image_proc -->
<group ns="stereo" >
    <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="/stereo/left/image_rect"/>
        <remap from="right/image_rect"      to="/stereo/right/image_rect"/>
        <remap from="left/camera_info"      to="/stereo/left/camera_info"/>
        <remap from="right/camera_info"     to="/stereo/right/camera_info"/>
        <remap from="odom"                  to="/stereo/stereo_odometry"/>

        <param name="frame_id" type="string" value="iris_0/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">
    <!-- Visual SLAM -->
    <node name="rtabmap" pkg="rtabmap_ros" type="rtabmap" output="screen" args="--delete_db_on_start">
      <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/left/image_rect_color"/>
     <remap from="right/image_rect"  to="/stereo/right/image_rect"/>
     <remap from="left/camera_info"  to="/stereo/left/camera_info"/>
     <remap from="right/camera_info" to="/stereo/right/camera_info"/>

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

      <param name="frame_id"    type="string" value="iris_0/base_link"/>
      <param name="queue_size"  type="int"    value="40"/>
      <param name="approx_sync" type="bool"   value="false"/>

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

 
<!-- Visualisation RTAB-Map -->
 <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="iris_0/base_link"/>
     <remap from="left/image_rect"   to="/stereo/left/image_rect_color"/>
     <remap from="right/image_rect"  to="/stereo/right/image_rect"/>
     <remap from="left/camera_info"  to="/stereo/left/camera_info"/>
     <remap from="right/camera_info" to="/stereo/right/camera_info"/>
     <remap from="odom_info"         to="/stereo/odom_info"/>
     <remap from="odom"              to="/stereo/stereo_odometry"/>
  </node>
</group>

</launch>

I then subscribe to /stereo/stereo_odometry and use a python script to obtain the pose information and add time stamp and send to mavros/vision_pose/pose:

import rospy
from geometry_msgs.msg import PoseStamped
from nav_msgs.msg import Odometry
import math
from pyquaternion import Quaternion
import tf
import sys

vehicle_type = sys.argv[1]
local_pose = PoseStamped()
local_pose.header.frame_id = 'map'

def rtabmap_callback(data):
    local_pose.header.stamp = data.header.stamp
    local_pose.pose = data.pose.pose
    
rospy.init_node('rtabmap_transfer')
rospy.Subscriber("/stereo/stereo_odometry", Odometry, rtabmap_callback)
position_pub = rospy.Publisher(vehicle_type+"_0/mavros/vision_pose/pose", PoseStamped, queue_size=2)
rate = rospy.Rate(30) 

while True:
    local_pose.header.stamp = rospy.Time.now()
    position_pub.publish(local_pose) 
    rate.sleep()

After everything sets up and I launch the simulation, the drone starts to drift and spiral.
I also get this warning:
[ WARN] [1591277980.417315019, 383.544000000]: Odometry: Detected not valid consecutive stamps (previous=383.260000s new=383.260000s). 
New stamp should be always greater than previous stamp. This new data is ignored. This message will appear only once.

Could you help and see where's the problem?