ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

I'm not sure of the "optimal" way, but there are several options for handling somewhat uneven terrain. Unfortunately, most of the approaches I know require more than just a single-layer lidar. Here are a couple in case it gives you ideas:

  • If you have an IMU, you can filter the lidar returns by setting z limits, much like you suggested. Basically, with the tilt angle from the IMU, you can calculate the height of each return point and kick out the ones that are too far from the 2D plane. The actual z limits would depend on your setup and environment. Some SLAM packages have this functionality built in.

  • Calculate surface normals based on lidar data. It's easiest with multi-layer lidars, but the idea is to throw out points that indicate a plane with a normal that's mostly in the z direction (floor or ceiling).

If you're stuck with just a single-layer lidar, you may be able to filter based on further assumptions about your environment/application, but that can be tricky. For example, how do you know (from lidar data alone) that you're looking at the ground and not a big box someone dropped right in front of your robot? One scenario:

  • If you know that your robot will never tilt more than a particular amount, and nothing in the environment moves, you may be able to calculate a safe lidar range limit. The lidar will never see ground closer than X m because that would require it to tilt more than is possible. Then, you can just filter out data beyond X m. Again, this is similar to your original suggestion, but it's important to note the inherent assumptions.

As far as computation, these approaches aren't very expensive and shouldn't be a problem--depending on your platform, obviously. Go with the simplest filter that makes sense. If you explain more of your scenario, maybe there's a more clever solution.

I'm not sure of the "optimal" way, but there are several options for handling somewhat uneven terrain. Unfortunately, most of the approaches I know require more than just a single-layer lidar. Here are a couple in case it gives you ideas:

  • If you have an IMU, you can filter the lidar returns by setting z limits, much like you suggested. Basically, with the tilt angle from the IMU, you can calculate the height of each return point and kick out the ones that are too far from the 2D plane. The actual z limits would depend on your setup and environment. Some SLAM packages have this functionality built in.

  • Calculate surface normals based on lidar data. It's easiest with multi-layer lidars, but the idea is to throw out points that indicate a plane with a normal that's mostly in the z direction (floor or ceiling).

If you're stuck with just a single-layer lidar, you may be able to filter based on further assumptions about your environment/application, but that can be tricky. For example, how do you know (from lidar data alone) that you're looking at the ground and not a big box someone dropped right in front of your robot? One scenario:

  • If you know that your robot will never tilt more than a particular amount, and nothing in the environment moves, you may be able to calculate a safe lidar range limit. The lidar will never see ground closer than X m because that would require it to tilt more than is possible. Then, you can just filter out data beyond X m. Again, this is similar to your original suggestion, but it's important to note the inherent assumptions.

As far as computation, these approaches aren't very expensive and shouldn't be a problem--depending on your platform, obviously. Go with the simplest filter that makes sense. If you explain more of your scenario, maybe there's a more clever solution.

solution. I should add that if the terrain is too uneven, 2D just won't be enough.