DVZ (Deformable Virtual Zone)#

The DVZ is a reactive motion control method first introduced by R. Zapata in 1994 [1]. It has been used since to model systems’ maneuvers in both 2D and 3D spaces. The idea is to surround the system under study with a virtual zone, and any body entering that zone will cause a deformation. Then, the system can be driven in the direction minimizing this deformation or changing it in a desired way.

Supported Motion Models#

  • ACKERMANN

  • DIFFERENTIAL_DRIVE

  • OMNI

Supported Sensory Inputs#

  • LaserScan

Implementation#

  • Define a circular zone around the robot with known undeformed radius ($\(R\)$)

  • Using LaserScan sensor data compute the deformed radius: \( d_h(\alpha) : \alpha in [0, 2\pi]\)

  • Compute the zone deformation:

\( I_D = \frac{1}{2\pi} \int_{0}^{2\pi}\frac{R - d_h(\alpha)}{R} d\alpha \in [0, 1]\)

  • Compute the zone deformation radius (if \(I_D > 0\)):

\( \Theta_D = \frac{\int_{0}^{2\pi} (R - d_h(\alpha))\alpha d\alpha}{I_D} \in [0, 2\pi]\)

  • The control is calculated to minimize \(I_D\) and stay close to the reference trajectory

usage Example#

from kompass_core.control import DVZ
from kompass_core.models import (
    AngularCtrlLimits,
    LinearCtrlLimits,
    Robot,
    RobotCtrlLimits,
    RobotGeometry,
    RobotType,
)

# Configure the robot
my_robot = Robot(
        robot_type=RobotType.ACKERMANN,
        geometry_type=RobotGeometry.Type.CYLINDER,
        geometry_params=np.array([0.1, 0.4]),
    )

# Configure the control limits (used to compute the dynamic window)
robot_ctr_limits = RobotCtrlLimits(
    vx_limits=LinearCtrlLimits(max_vel=1.0, max_acc=5.0, max_decel=10.0),
    omega_limits=AngularCtrlLimits(
        max_vel=2.0, max_acc=3.0, max_decel=3.0, max_steer=np.pi
    ),
)

# Configure the controller
dvz = DVZ(
        robot=my_robot,
        ctrl_limits=robot_ctr_limits,
        control_time_step=control_time_step,
    )