In this example a unicycle type mobile robot is simulated using the hybrid system toolbox. It is assumed that the forward velocity can be either 1 or 0, and the control command is \(u\in\mathbb{R}\) . The control input is assumed be remain between \(\pm 1\) , i.e., \(u \in [U_{\min},\ U_{\max}] := [-1,+1]\) . Moreover, the unicycle is initialized at the origin and required to reach the boundry of a circle of radius \(X_{\max}\)

Contents

The files for this example are found in the package hybrid.examples.mobile_robot :

  • initialize.m
  • mobile_robot.slx
  • postprocess.m

The contents of this package are located in Examples\+hybrid\+examples\mobile_robot (clicking this link changes your working directory).

Mathematical Model

A unicycle mobile robot is a continuous-time nonlinear system. Let \(x_1\) and \(x_2\) be the position of the unicycle on 2D plane and \(x_3\) be the orientation. The kinematics model is given by

\[\begin{array}{ll} \dot x_1 = v \sin x_3\\ \dot x_2 = v \cos x_3\\ \dot x_3 = u, \end{array}\]

where the forward velocity \(v\) is assumed to be constant, and without loss of generality \(v = 1\) . The states and input of the system are \((x_1,x_2,x_3)\in\mathbb{R}^{3}\) and \(u \in \mathbb{R}\) , respectively. We express this system as a hybrid control system with the following data:

\[\begin{array}{ll} f(x,u):=\left[\begin{array}{c} \sin x_{3} \\ \cos x_{3} \\ u \end{array}\right], & C := \{ (x,u) \in \mathbb{R}^{3} \times \mathbb{R} \mid u \in [U_{\min},\ U_{\max}], x_1^2 + x_2^2 \leq X^2_{\max}\} \\ \\ g(x,u):=\left[ \begin{array}{c} 0 \\ 0 \\ 0 \end{array}\right], & D: = \emptyset \end{array}\]

Simulink Model

The following diagram shows the Simulink model for this example. The mobile robot is represented by the Continuous-time Plant block.

A Continuous-time Plant block contains user-defined a flow map \(f\) block and flow set \(C\) block.

The flow map and flow set functions in this example are included below.

flow map f block

function xdot = f(x, u)
    % Flow map for plant.
    xdot = [sin(x(3)); cos(x(3)); u];
end

flow set C block

function inC  = C(x, u, parameters) 
    % Flow set indicator function for plant.
    x1 = x(1);
    x2 = x(2);
    minU = parameters.minU;
    maxU = parameters.maxU;
    maxX = parameters.maxX;
    if u >= minU && u <= maxU && x1^2+x2^2 <= maxX^2
        inC = 1; % report flow
    else
        inC = 0; % do not report flow
    end
end

The jump set C block is given as a constant block with value zero and the jump map D block is unused.

Example Output

The following plot shows a solution to the closed-loop system. The robot starts at the origin and then drives until it eventually hits the target set, which is a circle with radius 5 centered at the origin.

Updated: