[Nav2] Speed Restriction Support Now Available

As was mentioned above, the Speed Filter reads two types of speed restriction:

  1. Expressed in a percent from maximum allowed speed. This is good for single robot systems because of easy set-up (just set a % and go). But not suitable for tuning heterogeneous systems with different kinds of robots running simultaneously, because each robot might have its own maximum speed defined by its construction and vendor.
  2. Expressed in absolute value for all types of robots (e.g. speed limit 15 m/s) is intended to work with such systems.

For the last one we have an issue with absolute velocity encoding it with a filter mask. Let’s look into some background of the question:

In general case the speed of the robot is decomposed into two components - linear and angular velocity.

Apparently, if we are restricting the maximum linear velocity of a robot, we also should restrict its angular velocity as well, in order to keep safety. Robots can be different in type and shape, for example elongated robots or omni-directional drives. Angular speed restriction has a very important meaning for them.

Filter mask can encode only one value per cell.

For the first type of speed restriction expressed in a percent, there are no issues: we are decreasing both maximum linear and rotational components of velocity by the same percent taken from a filter mask.

For the second type of speed restriction (expressed in absolute values), there is a question: which type of maximum velocity should we set in a filter mask (say 15): linear (max 15 m/s), angular (max 15 rad/s) or both?

What do you think about it all?
Is this a big deal to have speed limits in absolute value or is this something we can just pass over? Is this even useful for you guys?

Here I see two possible solutions how to use absolute values in Speed Filter:

Solution #1:

Encode maximum linear velocity in a filter mask. Then restrict maximum angular velocity in the same proportion as it was changed for maximum linear velocity.

For example, a robot has 100 m/s max linear velocity and 20 rad/s max angular velocity allowed by its construction. Robot enters in a speed restriction area having 15 m/s speed restriction. This means, that maximum linear velocity will be restricted by this value, and maximum angular velocity by ( 15m/s / 100m/s ) * 20rad/s = 3rad/s. This will be a restriction of maximum angular velocity for this robot.

This solution is similar to restricting the speed in a percent value approach, but it is suitable for heterogeneous systems, where we have different kinds of robots.

Solution #2:

Despite the first solution being suitable for heterogeneous systems, it detracts from the generality: we might want to set-up by component linear and angular speed restriction for some specific area and does not depend on the robot’s architectural limits. This problem might be solved by running two Speed Filters simultaneously: one tuned for linear velocity restriction, another – for angular. This will resolve the problem, but system setup in this case might be quite heavy to catch without any specific tooling.

Which one do you see is better to have?
You are also welcoming to propose another approach for absolute values here!

Looking forward to your opinions.

-Alex

2 Likes