trajectory manager rework
[aversive.git] / modules / devices / robot / trajectory_manager / doc.txt
1 Le module ne fonctionne qu'avec un asserv composes des modules 
2 control_system_manager, position_manager, quadramp, robot_system.
3 Il utilise le module vect2.
4
5
6 QUESTIONS (et reponses) QUI RESTENT
7
8 - cm ou mm ?
9 - quand on donne l'ordre d'aller a un point tres proche du robot, mais
10   different en angle, ca fait des gros pivots. Solution ?
11 - pour le trajectory_nearly_finished(), doit-on utiliser une fenetre, ou
12   etre en fonction de la rampe ? Pour la rampe, la distance en pas c'est
13   Vmax.Vmax / 2.Adec
14 - bien preciser les unites dans les noms des variables, ca rend le
15   code plus clair (par exemple les angles en deg ou rad, les distances
16   en cm ou mm...)
17 - l'angle target.angle de la structure est entre 0 et 2 pi ?
18 - pour le 'nearly finished' dans le cas d'une trajectoire sans evenement,
19   comment gerer ?
20 - quid du position manager, qui retourne un angle entre -pi et pi, et ca, 
21   c'est chiant.
22 - dans position manager, il manque les unites dans les noms de var
23 - l'evenement trajectory est supprime lorsque l'on s'approche du point, du
24   coup on n'est plus asservi sur le point x,y a partir d'une certaine
25   distance
26 - la vitesse pourrait etre specifiee en cm/s et deg/s
27
28 INIT DU MODULE
29
30  void trajectory_init(struct trajectory * traj);
31
32 Initialisation de la structure. Met tout a zero, et le scheduler_task
33 a -1.
34
35
36  void trajectory_set_cs(struct trajectory * traj, struct cs * cs_d, struct cs * cs_a);
37
38 Associe les structures d'asservissement a la structure traj.
39
40  void trajectory_set_robot_params(struct trajectory * traj, struct robot_system * rs, 
41                                                                  struct robot_position * pos);
42
43 Associe les structures robot_system et position a la structure traj.
44
45
46  void trajectory_set_windows(struct trajectory * traj, double d_win, double a_win)
47
48 Definit la fenetre de fin de trajectoire, en angle comme en distance
49
50
51  void trajectory_set_speed( struct trajectory * traj, int16_t speed_d, int16_t speed_a);
52
53 Definit la vitesse lineaire et angulaire max 
54
55
56 STRUCTURE DE DONNEES
57
58 struct trajectory {
59         enum trajectory_state state; /*<< describe the type of target, and if we reached the target */
60
61         union {
62                 vect2_cart vect; /**<< target, if it is a vector */
63                 double angle;    /**<< target, if it is an angle */
64         } target;
65
66         double d_win;      /**<< distance window (for END_NEAR) */
67         double a_win_rad;  /**<< angle window (for END_NEAR) */
68   
69         uint16_t d_speed;  /**<< distance speed consign */
70         uint16_t a_speed;  /**<< angle speed consign */
71
72         struct robot_position * position; /**<< associated robot_position */
73         struct robot_system * robot;      /**<< associated robot_system */
74         struct cs * csm_angle;    /**<< associated control system (angle) */
75         struct cs * csm_distance; /**<< associated control system (distance) */
76   
77         int8_t scheduler_task;    /**<< id of current task (-1 if no running task) */
78 };
79
80
81 FONCTIONS ET MACROS STATIQUES
82
83 - modulo_pi(a) : retourne a entre -pi et pi
84 - modulo_2pi(a) : retourne a entre 0 et 2.pi
85 - modulo_180(a) : retourne a entre -180 et 180
86 - modulo_360(a) : retourne a entre 0 et 360
87 (on considere que le a d'origine n'est pas a plus d'un 
88  tour [2.pi ou 360] de son intervalle)
89
90 - is_in_dist_window(t) : vrai si on a dans la fenetre de dist
91 - is_in_angle_window(t) : vrai si on a dans la fenetre d'angle
92
93 - schedule_traj_event(t) : ajoute l'evenement de gestion de traj
94 - delete_traj_event(t) : le supprime
95
96
97 GOTO XY
98
99 Donnees d'entree, fournies par l'utilisateur du module
100 - vitesse lineaire max et vitesse angulaire max
101 - le point de destination du robot (relatif ou absolu)
102 - fenetre de fin de trajectoire (distance, precise a l'init)
103 - marche avant, arriere, ou le plus court des deux.
104
105 Donnees d'entree
106 - la position du robot
107 - les parametres du quadramp
108
109 Evenements retournes
110   Les fonctions ne re retournent rien, on sait lorsque l'on arrive en
111   appelant:
112   - trajectory_finished() : le robot est arrive a destination, la
113     consigne d'asservissement en position correspond alors a la
114     consigne de position filtree (apres quadramp). Le robot est sense
115     etre a l'arret, ou presque.
116   - trajectory_in_window() : le robot est entre dans la fenetre
117     d'arrivee, de distance ou d'angle.
118   - trajectory_in_deceleration() : le robot est arrive assez pres du
119     point, juste avant la rampe de deceleration. Permet d'enchainer
120     des trajectoires sans ralentir. Si ca ne va pas avec la rampe de
121     deceleration, alors il faut au moins quelque chose qui depende de
122     la vitesse
123
124 Infos sur l'algo
125 - La consigne de vitesse passee a l'asservissement depend de l'angle 
126   du robot pour aller vers le point suivant
127 - La consigne de position en distance est la distance vers le point
128 - La consigne de position en angle est l'angle vers le point
129
130  void trajectory_goto_xy_abs( struct trajectory * traj, double x, double y );
131  void trajectory_goto_xy_rel( struct trajectory * traj, double x, double y );
132  void trajectory_goto_da_rel( struct trajectory * traj, double d, double a_deg );
133
134
135
136
137 TRAJS SIMPLE (pas d'event)
138  void trajectory_d_a_rel ( struct trajectory * traj, double d, double a );
139  void trajectory_d_rel( struct trajectory * traj, double d, double a );
140  void trajectory_a_rel( struct trajectory * traj, double d, double a );
141  void trajectory_a_abs( struct trajectory * traj, double a );
142  void trajectory_turnto_xy_abs( struct trajectory* traj, double tx, double ty );
143  void trajectory_only_d( struct trajectory * traj, double d );
144  void trajectory_only_a( struct trajectory * traj, double a );
145  void trajectory_stop( struct trajectory * traj );
146  void trajectory_hardstop( struct trajectory * traj );
147
148