This matrix will be use to control the position and direction of a mobile robot in a 2D enviroment. See header file for more info

Dependents:   Kinematics Matrix_class

TrackVector2D.h

Committer:
Yo_Robot
Date:
2011-12-03
Revision:
0:958e1e10e536

File content as of revision 0:958e1e10e536:

/**
 * @file   TrackVector2D.h
 * @author Ernesto Palacios
 *
 * @brief
 * Develop Under  GPL v3.0 License
 * http://www.gnu.org/licenses/gpl-3.0.html .
 *
 * Created on 22 de octubre de 2011, 11:26 PM
 */

#ifndef TRACKVECTOR2D_H
#define TRACKVECTOR2D_H

#include "mbed.h"
#include "Matrix.h"
#include "MatrixMath.h"

#include <complex>

/**@brief
 * This class keeps track of a "vector" on a 2D plane.
 * Vector is defined as any point on an XY plane, with a determine direction.
 * Could be a mobile robot for instance. Distance is unit-less depends on the use.
 * Angles are internally measured in radiands but the API uses degrees.
 *
 * Static Functions are provided for Angle and Coordenates transformations.
 */
class TrackVector2D {

public:

    /**@brief default Constructor.
     * Initializes Matrices to default Values
     */
    TrackVector2D();


    /**@brief Copies all elements.
     * @param orig Original "Vector"
     */
    TrackVector2D(const TrackVector2D& orig);


    /**@brief
     * Move the "vector" to position x, y in the plane.
     * Calculates the angle the vector should rotate, and the distance
     * it should travel. Distance depeneds on metric units of coordenates.
     * @param x  Coordenate in "X" axis.
     * @param y  Coordenate in "Y" axis.
     * @return   1x2 Matrix, [1][1] Distance to travel -no units.
     *                       [1][2] Rotation Angle in degrees
     */
    const Matrix moveto( float x, float y );


    /**@brief
     * Changes the direction of the "vector" to point to a new direction.
     * Keeps track of ratation. Doesn't return anything because does not travels
     * any distance, and rotation is already known.
     * @param degrees Angle in degrees to Rotate
     */
    void rotate( float degrees );


    /**@brief Returns 3x3 Matrix Rotation
     *
     * @return 3x3 Matrix Rotation only
     */
    const Matrix GetRotM();


    /**@brief Retirns 4x4 Full Transformation Matrix
     *
     * @return 4x4 Full Transfrmation Matrix.
     */
    const Matrix GetTrasfM();


    /**@brief Returns 1x2 Matrix last [ X ][ Y ] coordenates
     * @return 1x2 with last only Cordenates.
     */
    const Matrix GetLastMove();


    /**@brief Retruns nx2 Matrix with all n-Moves.
     * @return Large nx2 Matrix with all moves done by "vector"
     */
    const Matrix GetMove( int index );

    /**@brief Cuerrent X position of Robot
     * @return X position in Coordenate Sistem.
     */
    float getX();


    /**@brief Current Y position of Robot
     * @return Y position in Coordenate Sistem
     */
    float getY();


    /**@brief Current direction with respect to "X" axis.
     * @return Angle in radians
     */
    float getRad();


    /**@brief Current direction with respect to "X" axis.
     * @return Angle in Degrees
     */
    float getDeg();


    /**@brief Transform from RADIANS to DEGREES.
     * @param angle in radians
     * @return angle in degrees
     */
    static float rad2deg( float angle );


    /**@brief Transform from DEGREES to RADIANS.
     * @param angle in degrees
     * @return angle in radians
     */
    static float deg2rad( float angle );


    /**@brief Transforms from Rectangular to Polar coordenates.
     * @param 1x2 Matrix [x][y]
     * @return 1x2 Matrix [Magnitude][Direction]  in Degrees!
     */
    static const Matrix Rect2Polar( const Matrix& Coord );


    /**@brief Transforms from Polar to Rectangular coordenates.
     * @param 1x2 Matrix [Magnitude][Direction] in Degrees!
     * @return 1x2 Matrix [x][y]
     */
    static const Matrix Polar2Rect( const Matrix& Coord );


private:

    Matrix _TrnsfM;
    Matrix _InvM;
    Matrix _RotM;
    vector< complex<float> > _Moves; 

    int   _nMoves;
    float _angRad;
    float _angDeg;
    float _distance;
};

#endif  /* TRACKVECTOR2D_H */