Open danit-niwattananan opened 4 months ago
For problem 1, I created https://github.com/introlab/rtabmap_ros/issues/1186, which may be the cause. I think you could just ignore the warning if it was one of the causes cited there.
For problem 2, I tried with this demo (adding 'initial_pose': '10 10 0 0 0 0'
to icp_odometry parameters) and it seems to work as expected:
For problem 3, could you record a rosbag of the scans you are feeding to icp_odometry or kiss-icp?
Hi @matlabbe , thank you for your response. Here is my rosbag record of my 3d lidar point cloud that I feed into icp_odometry
and kiss-icp
node. https://drive.google.com/file/d/1UNnMuyYQ84lfDErb_yFD-Y8YijEjnnbH/view?usp=sharing
I have recorded it as soon as I started my simulation. I also drove my rover around a little bit during the recording.
The point cloud topic doesn't look right. Instead of setting 0 or NaN for invalid readings, it sets a maximum of some distance:
When doing ICP on this, it will always converge on the points on the arc, so it may thinks the robot is not moving.
Try with Icp/RangeMax: '50'
. Here an example:
ros2 run rtabmap_odom icp_odometry --ros-args \
-r scan_cloud:=/bf/points_raw \
-p Icp/VoxelSize:="'0.3'" \
-p Icp/CorrespondenceRatio:="'0.01'" \
-p Icp/MaxCorrespondenceDistance:="'1'" \
-p Icp/MaxTranslation:="'1'" \
-p Icp/RangeMax:="'50'" \
-p Icp/OutlierRatio:="'0.7'" \
-p Odom/ScanKeyFrameThr:="'0.4'" \
-p OdomF2M/ScanSubtractRadius:="'0.3'" \
-p OdomF2M/ScanMaxSize:="'15000'"
ros2 bag play rosbag2_2024_08_04-16_38_20_0.db3
Thank you so much for your help. I will try this out.
Hi everyone, I am running my robot on simulation using ROS2 Humble within Gazebo and testing SLAM and localization of different sensors.
Setup: I am using camera, imu, and lidar (with only 90 deg horizontal FOV like our hardware and not 360). I am running
rgbd_odometry
node to extract the camera odometry and alsoicp_odometry
node to extract lidar odometry from 3D lidar point cloud. All of these odometry and imu data are then fed intoekf_node
fromrobot_localization
package to extract filtered odometry/odometry/filtered
, which are then fed intortab_slam
node to generate maps. All of these are running inside a modified version of ROS2 Docker container with some extra packages.After I built my packages with
colcon build
, source it, and launch the simulation, I then drive my rover around usingteleop_twist_keyboard
and record all of the odometry values for evaluation usingevo
package. You can see the plot below.Problem:
ros2 bag record
with KeyboardInterrupt, this warning message appears.And the output frequency of the
icp_odometry
jumps from around 0.5 Hz to 4.4 Hz, which is still lower than lidar points cloud publishing at around 5.5 Hz when checked withros2 topic hz /bf/points_raw
after that. That means the input topic is NOT empty like the message suggested. I am also sure that I mapped the/scan
topic to a ghost topic/unused_scan
where no message is published in the launch file. So, I really don't know why this happens. Here is my launch file for reference:I looked into similar issues in the past and I found these issues https://github.com/introlab/rtabmap_ros/issues/189 and https://github.com/introlab/rtabmap_ros/issues/1054. I don't think that the synchronizer is the cause of this problem like suggested here https://github.com/introlab/rtabmap_ros/issues/1054#issuecomment-2123789944 since I set
approx_sync
tofalse
. And I am sure that mytf
is working and thebase_link
frame is there. Here is the transform of my robot and simulation:icp_odometry
node will estimate. I did that by declaring the parameterinitial_pose
in yaml file in config folder under my package directory. All of the parameters come from the official wiki http://wiki.ros.org/rtabmap_odom#icp_odometry. However, when I plot the odometry out withevo_traj
fromevo
package, the odometry from lidar estimated by that node always start at somewhere close to the origin and not at the coordinate I gave it! Here is the picture of the xyz of odometry. (If initial pose declaration is working, it should start very close to /odometry/camera and /odometry/lidar)Here is my yaml file in which I declare initial pose. This yaml file is then used by the launch file above.
I have also tried declaring
ground_truth_frame_id
andground_truth_base_frame_id
using mybase_link
(I have a node declared in my robot's URDF fromlibgazebo_ros_p3d.so
to publish ground truth usingbase_link
) but that didn't work. Do you guys have any ideas on how to solve it?This problem is really annoying since that also cause a "teleportation" problem as those lidar input close to 0 made the filtered odometry jump instantly like in the plot below.
icp_odometry
node is always almost 0 and much worse than the camera odometry, which shouldn't be the case. Do you guys also know what could have gone wrong here? I tried usingkiss_icp
package https://github.com/PRBonn/kiss-icp?tab=readme-ov-file but the odometry from that is also almost zero.I have been trying to solve this problem for 2-3 weeks already and I am really out of ideas. Any help would be greatly appreciated!