1- """
1+ '''
22@ 2025, Copyright AVIS Engine
3- """
3+ '''
44
55import cv2
66import re
77import base64
88import time
99import socket
1010import numpy as np
11- from . import utils
11+ import utils
1212
1313__author__ = "Amirmohammad Zarif"
1414__email__ = "amir@avisengine.com"
1515
1616
17- class Car :
18- """
17+ class Car () :
18+ '''
1919 AVIS Engine Main Car class
20-
20+
2121 Attributes
2222 ----------
2323
@@ -34,57 +34,47 @@ class Car:
3434 sensors
3535 current_speed
3636 sensor_angle
37- """
37+ '''
3838
39- # Attributes to kind of replicate a Pub-sub pattern messaging to request data
39+ #Attributes to kind of replicate a Pub-sub pattern messaging to request data
4040 steering_value = 0
4141 speed_value = 0
4242 sensor_status = 1
4343 image_mode = 1
4444 get_Speed = 1
4545 sensor_angle = 30
46-
46+
4747 sock = socket .socket (socket .AF_INET , socket .SOCK_STREAM )
4848
49- # Data format for request
50- data_arr = [
51- speed_value ,
52- steering_value ,
53- image_mode ,
54- sensor_status ,
55- get_Speed ,
56- sensor_angle ,
57- ]
58- _data_format = (
59- "Speed:{},Steering:{},ImageStatus:{},SensorStatus:{},GetSpeed:{},SensorAngle:{}"
60- )
61- data_str = _data_format .format (
62- data_arr [0 ], data_arr [1 ], data_arr [2 ], data_arr [3 ], data_arr [4 ], data_arr [5 ]
63- )
64-
49+ #Data format for request
50+ data_arr = [speed_value , steering_value , image_mode , sensor_status , get_Speed , sensor_angle ]
51+ _data_format = "Speed:{},Steering:{},ImageStatus:{},SensorStatus:{},GetSpeed:{},SensorAngle:{}"
52+ data_str = _data_format .format (data_arr [0 ], data_arr [1 ], data_arr [2 ], data_arr [3 ], data_arr [4 ], data_arr [5 ])
53+
6554 image = None
6655 sensors = None
6756 current_speed = None
6857
69- def connect (self , server , port ):
70- """
58+ def connect (self ,server ,port ):
59+ '''
7160 Connecting to the simulator (server)
72- """
61+ '''
7362 try :
7463 self .sock .connect ((server , port ))
7564 self .sock .settimeout (5.0 )
76-
65+
7766 print ("connected to " , server , port )
7867 return True
7968 except :
8069 print ("Failed to connect to " , server , port )
8170 return False
8271
72+
8373 def recvall (self , socket ):
84- """
74+ '''
8575 Function to receive all the data chunks
86- """
87- BUFFER_SIZE = 65536 # Increased buffer size for better performance
76+ '''
77+ BUFFER_SIZE = 131072 # Increased buffer size for better performance
8878 data = bytearray () # Use a bytearray for better performance
8979
9080 while True :
@@ -93,35 +83,36 @@ def recvall(self, socket):
9383
9484 # Use KMP search to find the <EOF>, KMPSearch() returns -1 if the pattern was not found
9585 # It is 9 times faster than the simple python search
96- if utils .KMPSearch (b"<EOF>" , data ) > - 1 : # Convert "<EOF>" to bytes
86+ if utils .KMPSearch (b"<EOF>" , data ) > - 1 : # Convert "<EOF>" to bytes
9787 break
9888
9989 return data .decode ("utf-8" )
10090
101- def setSteering (self , steering ):
102- """
91+
92+ def setSteering (self ,steering ):
93+ '''
10394 Setting the steering of the car
104-
95+
10596 Parameters
10697 ----------
10798 steering : int
10899 Steering value in degree
109- """
100+ '''
110101 self .steering_value = steering
111102 self .image_mode = 0
112103 self .sensor_status = 0
113104 self .updateData ()
114105 self .sock .sendall (self .data_str .encode ("utf-8" ))
115106 time .sleep (0.01 )
116107
117- def setSpeed (self , speed ):
118- """
108+ def setSpeed (self ,speed ):
109+ '''
119110 Setting the speed of the car
120-
111+
121112 Parameters
122113 ----------
123114 speed : int
124- """
115+ '''
125116 self .speed_value = speed
126117 self .image_mode = 0
127118 self .sensor_status = 0
@@ -130,107 +121,100 @@ def setSpeed(self, speed):
130121 time .sleep (0.01 )
131122
132123 def setSensorAngle (self , angle ):
133- """
124+ '''
134125 Setting the angle between each sensor ray
135-
126+
136127 Parameters
137128 ----------
138129 angle : int
139130 In degrees
140- """
131+ '''
141132
142133 self .image_mode = 0
143134 self .sensor_status = 0
144135 self .sensor_angle = angle
145136 self .updateData ()
146137 self .sock .sendall (self .data_str .encode ("utf-8" ))
147-
138+
148139 def getData (self ):
149- """
140+ '''
150141 Requesting for the data from the simulator
151- """
142+ '''
152143 self .image_mode = 1
153144 self .sensor_status = 1
154145 self .updateData ()
155146 self .sock .sendall (self .data_str .encode ("utf-8" ))
156147
157148 receive = self .recvall (self .sock )
158149
159- imageTagCheck = re .search (r" <image>(.*?)</image>" , receive )
160- sensorTagCheck = re .search (r" <sensor>(.*?)</sensor>" , receive )
161- speedTagCheck = re .search (r" <speed>(.*?)</speed>" , receive )
162-
150+ imageTagCheck = re .search (' <image>(.*?)<\ /image>' , receive )
151+ sensorTagCheck = re .search (' <sensor>(.*?)<\ /sensor>' , receive )
152+ speedTagCheck = re .search (' <speed>(.*?)<\ /speed>' , receive )
153+
163154 try :
164- if imageTagCheck :
155+ if ( imageTagCheck ) :
165156 imageData = imageTagCheck .group (1 )
166157 im_bytes = base64 .b64decode (imageData )
167- im_arr = np .frombuffer (
168- im_bytes , dtype = np .uint8
169- ) # im_arr is one-dim Numpy array
158+ im_arr = np .frombuffer (im_bytes , dtype = np .uint8 ) # im_arr is one-dim Numpy array
170159 imageOpenCV = cv2 .imdecode (im_arr , flags = cv2 .IMREAD_COLOR )
171160 self .image = imageOpenCV
172-
173- if sensorTagCheck :
161+
162+ if ( sensorTagCheck ) :
174163 sensorData = sensorTagCheck .group (1 )
175- sensor_arr = re .findall (r "\d+" , sensorData )
176- sensor_int_arr = list (map (int , sensor_arr ))
164+ sensor_arr = re .findall ("\d+" , sensorData )
165+ sensor_int_arr = list (map (int , sensor_arr ))
177166 self .sensors = sensor_int_arr
178167 else :
179- self .sensors = [1500 , 1500 , 1500 ]
168+ self .sensors = [1500 ,1500 ,1500 ]
180169
181- if speedTagCheck :
170+ if ( speedTagCheck ) :
182171 current_sp = speedTagCheck .group (1 )
183172 self .current_speed = int (current_sp )
184173 else :
185174 self .current_speed = 0
186175 except :
187176 print ("Failed to receive data" )
188177
178+
189179 def getImage (self ):
190- """
180+ '''
191181 Returns the image from the camera
192- """
182+ '''
193183 return self .image
194184
195185 def getSensors (self ):
196- """
186+ '''
197187 Returns the sensor data
198- A List:
188+ A List:
199189 [Left Sensor: int, Middle Sensor: int, Right Sensor: int]
200- """
190+ '''
201191 return self .sensors
202-
192+
203193 def getSpeed (self ):
204- """
194+ '''
205195 Returns the speed of the car
206- """
196+ '''
207197 return self .current_speed
208-
198+
209199 def updateData (self ):
210- """
200+ '''
211201 Updating the request data array and data string
212- """
213- data = [
214- self .speed_value ,
215- self .steering_value ,
216- self .image_mode ,
217- self .sensor_status ,
218- self .get_Speed ,
219- self .sensor_angle ,
220- ]
221- self .data_str = self ._data_format .format (
222- data [0 ], data [1 ], data [2 ], data [3 ], data [4 ], data [5 ]
223- )
224-
202+ '''
203+ data = [self .speed_value ,self .steering_value ,self .image_mode ,self .sensor_status ,self .get_Speed , self .sensor_angle ]
204+ self .data_str = self ._data_format .format (data [0 ], data [1 ], data [2 ], data [3 ], data [4 ], data [5 ])
205+
225206 def stop (self ):
226- """
207+ '''
227208 Stoping the car and closing the socket
228- """
209+ '''
229210 self .setSpeed (0 )
230211 self .setSteering (0 )
231212 self .sock .sendall ("stop" .encode ("utf-8" ))
232213 self .sock .close ()
233214 print ("Process stopped successfully!" )
234-
215+
235216 def __del__ (self ):
236217 self .stop ()
218+
219+
220+
0 commit comments