Rocarisa20

Untitled

May 15th, 2025 (edited)
140
0
Never
5
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.36 KB | None | 0 0
  1. with Ada.Text_IO; use Ada.Text_IO;
  2. with GNAT.Sockets; use GNAT.Sockets;
  3. with Ada.Calendar; use Ada.Calendar;
  4. with Ada.Streams;
  5. with Ada.Strings.Unbounded;
  6. with Ada.Numerics.Elementary_Functions;
  7. with Ada.Float_Text_Io; use Ada.Float_Text_Io;
  8.  
  9. use type Ada.Streams.Stream_Element_Count;
  10. use Ada.Numerics.Elementary_Functions;
  11.  
  12. with Ada.Text_Io, Ada.Real_Time;
  13.  
  14. procedure Vcv is
  15.  
  16. package Ent_ES is new Integer_IO (Integer);
  17.  
  18. Client : Socket_Type;
  19. Address : Sock_Addr_Type;
  20. Channel : Stream_Access;
  21.  
  22. Send : String := (1 => ASCII.CR, 2 => ASCII.LF, 3 => ASCII.CR, 4 => ASCII.LF);
  23. Offset : Ada.Streams.Stream_Element_Count;
  24. Data : Ada.Streams.Stream_Element_Array (1 .. 1);
  25.  
  26. RetMsg : Ada.Strings.Unbounded.Unbounded_String := Ada.Strings.Unbounded.Null_Unbounded_String;
  27. ControlMsg : Ada.Strings.Unbounded.Unbounded_String := Ada.Strings.Unbounded.Null_Unbounded_String;
  28.  
  29. type err_ang_t is digits 3 range -3.15 .. 3.15;
  30. type err_lat_t is digits 4 range -99.99 .. 99.99;
  31. type velocidad_t is digits 5 range 0.00 .. 500.00;
  32. type distancia_t is digits 6 range -9999.00 .. 9999.0;
  33. type volante_t is digits 3 range -1.0 .. 1.0;
  34. type accFreno_t is digits 3 range -1.0 .. 1.0;
  35. type radio_t is digits 7 range 0.0 .. 99999.99;
  36.  
  37. c : Character;
  38.  
  39. j : Integer := 1;
  40. count : Integer := 0;
  41.  
  42. Kp, Ki, Kd : Float;
  43.  
  44. us : Float;
  45.  
  46. D_err_lat : err_lat_t;
  47.  
  48. Err_ang : err_ang_t;
  49. Err_lat, Err_lat_ant : err_lat_t;
  50. Curvatura, CurvaturaSig, Tipo, TipoSig : Float;
  51.  
  52. velocidad : velocidad_t;
  53. dist, distSig : distancia_t;
  54. refVelocidad : velocidad_t;
  55.  
  56. volante : volante_t;
  57. acelFreno : accFreno_t;
  58.  
  59. y, cx, sx, ang, fang : Float;
  60.  
  61. begin
  62.  
  63. GNAT.Sockets.Initialize; -- initialize a specific package
  64. Create_Socket (Client);
  65. Address.Addr := Inet_Addr ("127.0.0.1");
  66. Address.Port := 12321;
  67.  
  68. Connect_Socket (Client, Address);
  69. Channel := Stream (Client);
  70.  
  71. Kp := 0.02;
  72. Kd := 0.01;
  73.  
  74. -- Esta es la cadena de configuración. Cambiar los números para los distintos modos
  75. String'Write (Channel, "Controller init request 32" & Send);
  76.  
  77. Curvatura := 0.0;
  78. CurvaturaSig := 1.0;
  79. distSig := 0.0;
  80. velocidad := 0.0;
  81.  
  82. while Curvatura /= 0.0
  83. or CurvaturaSig /= 0.0
  84. or distSig /= 0.0
  85. or velocidad /= 0.0
  86. loop
  87.  
  88. count := 0;
  89. ControlMsg := Ada.Strings.Unbounded.Null_Unbounded_String;
  90. RetMsg := Ada.Strings.Unbounded.Null_Unbounded_String;
  91.  
  92. loop
  93. Ada.Streams.Read (Channel.all, Data, Offset);
  94. Ada.Strings.Unbounded.Append (Source => RetMsg, New_Item => Character'Val (Data (1)));
  95. exit when Character'Val (Data (1)) = '*';
  96. end loop;
  97.  
  98. ---- Lectura de los datos que manda el coche
  99. Ada.Text_IO.Put_Line (Ada.Strings.Unbounded.To_String (RetMsg));
  100.  
  101. j := 1;
  102.  
  103. for i in Ada.Strings.Unbounded.To_String (RetMsg)'Range loop
  104. c := Ada.Strings.Unbounded.To_String (RetMsg) (i);
  105.  
  106. if (c = ';' or c = '*') then
  107. count := count + 1;
  108.  
  109. case count is
  110. when 1 =>
  111. Err_ang := err_ang_t'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  112. when 2 =>
  113. Err_lat := err_lat_t'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  114. when 3 =>
  115. Tipo := Float'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  116. when 4 =>
  117. Curvatura := Float'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  118. when 5 =>
  119. dist := distancia_t'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  120. when 6 =>
  121. TipoSig := Float'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  122. when 7 =>
  123. CurvaturaSig := Float'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  124. when 8 =>
  125. distSig := distancia_t'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  126. when 9 =>
  127. velocidad := velocidad_t'Value (Ada.Strings.Unbounded.To_String (RetMsg) (j .. i - 1));
  128. when others =>
  129. null;
  130. end case;
  131.  
  132. j := i + 1;
  133. end if;
  134. end loop;
  135.  
  136. -- Sacamos por pantalla lo que manda el coche
  137. Ada.Text_IO.Put_Line
  138. ("You gave me "
  139. & err_ang_t'image (Err_ang)
  140. & " "
  141. & err_lat_t'image (Err_lat)
  142. & " "
  143. & Float'image (Tipo)
  144. & " "
  145. & Float'image (Curvatura)
  146. & " "
  147. & distancia_t'image (dist)
  148. & " "
  149. & Float'image (TipoSig)
  150. & " "
  151. & Float'image (CurvaturaSig)
  152. & " "
  153. & distancia_t'image (distSig)
  154. & " "
  155. & velocidad_t'image (velocidad));
  156.  
  157. -- CONTROLADOR CENTRADO: ¡AQUÍ ESTÁ EL CAMBIO!
  158. declare
  159. K_Lateral : constant Float := 0.6;
  160. K_Angular : constant Float := 0.3;
  161. Vel_Deseada : constant velocidad_t := 20.0;
  162. tmp_volante : Float;
  163. begin
  164. tmp_volante := K_Lateral * Float(Err_lat) + K_Angular * Float(Err_ang);
  165.  
  166. -- Saturación entre -1 y 1
  167. if tmp_volante > 1.0 then
  168. tmp_volante := 1.0;
  169. elsif tmp_volante < -1.0 then
  170. tmp_volante := -1.0;
  171. end if;
  172.  
  173. volante := volante_t(tmp_volante);
  174. refVelocidad := Vel_Deseada;
  175. end;
  176. --------------------------------------------------------------------------------------------------------------------------
  177.  
  178. --- Se envían los comandos al coche
  179. Ada.Strings.Unbounded.Append (Source => ControlMsg, New_Item => volante_t'image (volante));
  180. Ada.Strings.Unbounded.Append (Source => ControlMsg, New_Item => ';');
  181. Ada.Strings.Unbounded.Append (Source => ControlMsg, New_Item => velocidad_t'image (refVelocidad));
  182. Ada.Strings.Unbounded.Append (Source => ControlMsg, New_Item => '*');
  183.  
  184. String'Write (Channel, Ada.Strings.Unbounded.To_String (ControlMsg) & Send);
  185.  
  186. end loop;
  187. --
  188.  
  189. --- Comando para terminar la carrera
  190. String'Write (Channel, "Controller end request 44" & Send);
  191.  
  192. end Vcv;
  193.  
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment