Our robot's local costmap contains false objects in a perfect ring shape around the robot. The object detection otherwise works properly within the ring. Any ideas why?
I am working with the Clearpath Husky UGV. Currently I am trying to integrate an Ouster OS0 3D LiDAR sensor for object detection and avoidance using the move_base_flex node. It is working perfectly apart from the fact that it falsely identifies obstacles in a continuous ring around it's current position. This is obviously a problem as it prevents navigation to any points outside this false ring object due to no routes being found, and ruins the global costmap while the robot moves around.
A screenshot of the local costmap while the robot sits still next to a wall can be seen here https://ibb.co/3SGVk5G (Sorry, I'm new here and don't have enough points for image upload). In the image you can see many accurately identified obstacles (tables, desks, chairs, myself, etc.) and the wall being detected behind the robot. Then there is the circular pattern around the robot that is a FALSE object detection. The radius of the ring appears to be roughly the local cost map size limit. The 3D LiDAR pointcloud is not being used directly for object detection, but rather it is being converted to a 2D LaserScan type before being fed into move_base_flex. the laser scan looks good and is also seen in the local costmap screenshot provided (yellow dots). The raw point cloud coming from the LiDAR does not show this ring at all. Nor does the laser scan.
This seems like very odd behaviour to me and I was wondering if anyone has any ideas about what may be causing it? I have tried several things including reducing the size of the local costmap. When the local costmap width and height are set to < 5 the rings is no longer visible and the costmap works much better. This is a poor solution of course because such a small local map impacts performance in other ways. The ring is just hidden from view.
The local costmap configs are:
robot_base_frame: base_link
footprint: [[-0.5, -0.35], [-0.5, 0.35], [0.5, 0.35], [0.5, -0.35]]
footprint_padding: 0.01
transform_tolerance: 0.5
#If true the full costmap is published in every update
always_send_full_costmap: true
local_costmap:
update_frequency: 10
publish_frequency: 5
global_frame: map
robot_base_frame: base_link
rolling_window: true
width: 9.0 #lower than this will prevent the robot from going full speed
height: 9.0
resolution: 0.1 # 0.05 # 0.05
plugins:
- name: obstacles
type: "costmap_2d::ObstacleLayer"
- name: inflation
type: "costmap_2d::InflationLayer"
obstacles:
observation_sources: laser lidar
resolution: 0.25
inflation:
inflation_radius: 0.3
With the laser and lidar configs being:
obstacles:
lidar: {sensor_frame: velodyne, data_type: LaserScan, topic: /velodyne_scan_filtered, expected_update_rate: 0.4,
observation_persistence: 0.0, marking: true, clearing: true, inf_is_valid: true, max_obstacle_height: 1.2, min_obstacle_height:
0.45, obstacle_range: 4.5, raytrace_range: 5}
other info
I am using ROS Melodic, Ubuntu 18.04
Please let me know if I can provide any additional information. Any thoughts are appreciated :)