From 1a4cbd0d51b5e51e013ec5a0405a336a87466d2c Mon Sep 17 00:00:00 2001 From: noori Date: Thu, 15 Jun 2023 23:01:58 +0330 Subject: [PATCH 1/2] update --- README.md | 14 +- src/adverse_weather_classification/train.py | 133 ++++++++++++++++++ .../weather_classification.py | 57 ++++++++ src/object_detection/coco_classes.py | 97 +++++++++++++ src/object_detection/object_detection.py | 112 +++++++++++++++ 5 files changed, 410 insertions(+), 3 deletions(-) create mode 100644 src/adverse_weather_classification/train.py create mode 100644 src/adverse_weather_classification/weather_classification.py create mode 100644 src/object_detection/coco_classes.py create mode 100644 src/object_detection/object_detection.py diff --git a/README.md b/README.md index 2ede9a6..79e371c 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Submit a pull request to the repository and make any changes you want in your ow Commit your changes and make sure to push them as well. The deadline to deliver the assignment is 5-May-2023. -Update: The deadline has been extended to 12-May-2023 (1 week) due to students' request. +Update: The deadline has been extended to 29-May-2023. ## Assignment #2 Task #1: Integrate what you have learned in session 1 and 2 by adding RGB camera, IMU, and LIDAR sensor @@ -37,5 +37,13 @@ and create new branch. The branch name should be: A2-FAMILYNAME-STUDENTNUMBER ``` -The deadline to deliver the assignment is -20-May-2023. +The deadline to deliver the assignment is 10-June-2023. + +## Assignment #3 +Generate an image dataset from the CARLA simulator containing samples from different weather conditions including day, +night, rain, and fog. Train a deep convolutional neural network to classify the images based on the weather conditions. + +Evaluate the trained model on the test set utilizing relevant criteria in the classification task +and form the confusion matrix. + +The due date is 20-June-2023. \ No newline at end of file diff --git a/src/adverse_weather_classification/train.py b/src/adverse_weather_classification/train.py new file mode 100644 index 0000000..8822b6b --- /dev/null +++ b/src/adverse_weather_classification/train.py @@ -0,0 +1,133 @@ +import os +from typing import Tuple + +import matplotlib +import numpy as np +import tensorflow as tf +from tensorflow import keras +from tensorflow.keras.preprocessing.image import ImageDataGenerator +from tensorflow.keras.callbacks import ModelCheckpoint +from mock import Mock +import matplotlib.pyplot as plt + + +class TrainHyperParameters: + def __init__(self, input_shape: Tuple[int, int, int] = (256, 256, 3), number_of_classes: int = 2, + learning_rate: float = 0.001, batch_size: int = 32, number_of_epochs: int = 3) -> None: + self.hyperparameters = Mock() + self.hyperparameters.input_shape = input_shape + self.hyperparameters.number_of_classes = number_of_classes + self.hyperparameters.learning_rate = learning_rate + self.hyperparameters.batch_size = batch_size + self.hyperparameters.number_of_epochs = number_of_epochs + + +class TrainCustomCNN(TrainHyperParameters): + def __init__(self, data_dir: str, checkpoint_dir: str = 'output/checkpoints') -> None: + super().__init__() + self.model = None + + # Set the seed for reproducibility + np.random.seed(42) + tf.random.set_seed(42) + + self.data_dir = data_dir + self.checkpoint_dir = checkpoint_dir + + def form_data_generator(self) -> Tuple[ImageDataGenerator, ImageDataGenerator]: + train_dir = os.path.join(self.data_dir, 'train') + test_dir = os.path.join(self.data_dir, 'test') + + # Define the data generators for training and validation + train_datagen = ImageDataGenerator(rescale=1. / 255) + test_datagen = ImageDataGenerator(rescale=1. / 255) + + train_generator = train_datagen.flow_from_directory( + train_dir, + target_size=self.hyperparameters.input_shape[:2], + batch_size=self.hyperparameters.batch_size, + class_mode='categorical') + + test_generator = test_datagen.flow_from_directory( + test_dir, + target_size=self.hyperparameters.input_shape[:2], + batch_size=self.hyperparameters.batch_size, + class_mode='categorical') + return train_generator, test_generator + + def model_builder(self): + # Define the model architecture + self.model = keras.models.Sequential([ + keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=self.hyperparameters.input_shape), + keras.layers.MaxPooling2D((2, 2)), + keras.layers.Conv2D(64, (3, 3), activation='relu'), + keras.layers.MaxPooling2D((2, 2)), + keras.layers.Conv2D(128, (3, 3), activation='relu'), + keras.layers.MaxPooling2D((2, 2)), + keras.layers.Flatten(), + keras.layers.Dense(128, activation='relu'), + keras.layers.Dropout(0.5), + keras.layers.Dense(self.hyperparameters.number_of_classes, activation='softmax') + ]) + + def train(self, train_generator, test_generator): + # Define the optimizer and loss function + optimizer = keras.optimizers.Adam(lr=self.hyperparameters.learning_rate) + loss_fn = keras.losses.CategoricalCrossentropy() + + # Compile the model + if self.model is not None: + self.model.compile(optimizer=optimizer, loss=loss_fn, metrics=['accuracy']) + else: + raise ValueError('Model is not defined. Please call model_builder() first.') + + # Set up a checkpoint to save the best model weights + if os.path.exists(self.checkpoint_dir) is False: + os.makedirs(self.checkpoint_dir) + checkpoint_path = os.path.join(self.checkpoint_dir, 'best_model.h5') + + checkpoint_cb = ModelCheckpoint(checkpoint_path, monitor='val_accuracy', verbose=1, save_best_only=True, + mode='max') + + # Train the model + history = self.model.fit(train_generator, + epochs=self.hyperparameters.number_of_epochs, + validation_data=test_generator, + callbacks=[checkpoint_cb]) + + # Save the model architecture + model_dir = os.path.join(self.checkpoint_dir, 'model') + if os.path.exists(model_dir) is False: + os.makedirs(model_dir) + model_path = os.path.join(model_dir, 'model.json') + model_json = self.model.to_json() + with open(model_path, 'w') as json_file: + json_file.write(model_json) + # plot loss and accuracy on train and validation set + self.plot_history(history) + + def plot_history(self, history): + matplotlib.use('Agg') + plt.figure(figsize=(10, 5)) + plt.subplot(1, 2, 1) + plt.plot(history.history['loss'], label='train') + plt.plot(history.history['val_loss'], label='test') + plt.title('Loss') + plt.legend() + plt.subplot(1, 2, 2) + plt.plot(history.history['accuracy'], label='train') + plt.plot(history.history['val_accuracy'], label='test') + plt.title('Accuracy') + plt.legend() + plt.savefig(os.path.join(self.checkpoint_dir, 'loss_accuracy.png'), dpi=300) + + def exec(self): + train_generator, test_generator = self.form_data_generator() + self.model_builder() + self.train(train_generator, test_generator) + + +if __name__ == '__main__': + data_dir_ = '/home/ahv/PycharmProjects/Visual-Inertial-Odometry/simulation/CARLA/output/root_dir' + train_custom_cnn = TrainCustomCNN(data_dir_) + train_custom_cnn.exec() diff --git a/src/adverse_weather_classification/weather_classification.py b/src/adverse_weather_classification/weather_classification.py new file mode 100644 index 0000000..777ddfe --- /dev/null +++ b/src/adverse_weather_classification/weather_classification.py @@ -0,0 +1,57 @@ +import os +import time +from typing import Tuple + +import cv2 +import numpy as np +from tensorflow import keras + + +class AdverseWeatherClassifier: + def __init__(self, model_path, model_input_size: Tuple[int, int] = (256, 256)) -> None: + self.model = None + self.model_path = model_path + self.model_input_size = model_input_size + self.class_labels = ['day', 'night'] + + def load(self): + start_time = time.time() + self.model = keras.models.load_model(self.model_path) + print("Model loaded in {} seconds.".format(time.time() - start_time)) + + def __preprocess_frame__(self, frame: np.ndarray) -> np.ndarray: + frame = cv2.resize(frame, self.model_input_size) + frame = frame.astype('float32') / 255.0 + frame = np.expand_dims(frame, axis=0) + return frame + + def predict(self, preprocessed_frame: np.ndarray) -> str: + if self.model is not None: + predictions = self.model.predict(preprocessed_frame) + else: + raise ValueError("Model is not loaded. Please call load() method first.") + predicted_class = self.class_labels[np.argmax(predictions)] + return predicted_class + + def exec(self, frame: np.ndarray) -> str: + preprocessed_frame = self.__preprocess_frame__(frame) + predicted_class = self.predict(preprocessed_frame) + return predicted_class + + +if __name__ == "__main__": + img_dir = "/home/ahv/PycharmProjects/Visual-Inertial-Odometry/simulation/CARLA/output/root_dir/testing_imgs" + model_path_ = "/src/adverse_weather_classification/output/checkpoints/best_model.h5" + adverse_weather_classifier = AdverseWeatherClassifier(model_path_) + adverse_weather_classifier.load() + for root, dirs, files in os.walk(img_dir): + # shuffle the files + np.random.shuffle(files) + for file in files: + img = cv2.imread(os.path.join(root, file)) + visualization_img = img.copy() + predicted_class_ = adverse_weather_classifier.exec(img) + cv2.putText(visualization_img, predicted_class_, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) + cv2.imshow("Image", visualization_img) + cv2.waitKey(0) + cv2.destroyAllWindows() diff --git a/src/object_detection/coco_classes.py b/src/object_detection/coco_classes.py new file mode 100644 index 0000000..29d768f --- /dev/null +++ b/src/object_detection/coco_classes.py @@ -0,0 +1,97 @@ +# a class that contains all the classes in the COCO dataset + +class COCOUtils: + def __init__(self): + self.coco_classes = {0: '__background__', + 1: 'person', + 2: 'bicycle', + 3: 'car', + 4: 'motorcycle', + 5: 'airplane', + 6: 'bus', + 7: 'train', + 8: 'truck', + 9: 'boat', + 10: 'traffic light', + 11: 'fire hydrant', + 12: 'stop sign', + 13: 'parking meter', + 14: 'bench', + 15: 'bird', + 16: 'cat', + 17: 'dog', + 18: 'horse', + 19: 'sheep', + 20: 'cow', + 21: 'elephant', + 22: 'bear', + 23: 'zebra', + 24: 'giraffe', + 25: 'backpack', + 26: 'umbrella', + 27: 'handbag', + 28: 'tie', + 29: 'suitcase', + 30: 'frisbee', + 31: 'skis', + 32: 'snowboard', + 33: 'sports ball', + 34: 'kite', + 35: 'baseball bat', + 36: 'baseball glove', + 37: 'skateboard', + 38: 'surfboard', + 39: 'tennis racket', + 40: 'bottle', + 41: 'wine glass', + 42: 'cup', + 43: 'fork', + 44: 'knife', + 45: 'spoon', + 46: 'bowl', + 47: 'banana', + 48: 'apple', + 49: 'sandwich', + 50: 'orange', + 51: 'broccoli', + 52: 'carrot', + 53: 'hot dog', + 54: 'pizza', + 55: 'donut', + 56: 'cake', + 57: 'chair', + 58: 'couch', + 59: 'potted plant', + 60: 'bed', + 61: 'dining table', + 62: 'toilet', + 63: 'tv', + 64: 'laptop', + 65: 'mouse', + 66: 'remote', + 67: 'keyboard', + 68: 'cell phone', + 69: 'microwave', + 70: 'oven', + 71: 'toaster', + 72: 'sink', + 73: 'refrigerator', + 74: 'book', + 75: 'clock', + 76: 'vase', + 77: 'scissors', + 78: 'teddy bear', + 79: 'hair drier', + 80: 'toothbrush', + 81: 'hair brush', + 82: 'banner', + 83: 'blanket', + 84: 'branch', + 85: 'bridge', + 86: 'building-other', + 87: 'bush', + 88: 'cabinet', + 89: 'cage', + 90: 'cardboard'} + # convert to list + self.coco_classes_list = [self.coco_classes[i] for i in range(len(self.coco_classes))] diff --git a/src/object_detection/object_detection.py b/src/object_detection/object_detection.py new file mode 100644 index 0000000..674e429 --- /dev/null +++ b/src/object_detection/object_detection.py @@ -0,0 +1,112 @@ +# import the necessary packages +from typing import List, Tuple + +from torchvision.models import detection +import numpy as np +import torch +import cv2 +import time +from src.object_detection.coco_classes import COCOUtils + + +class TorchObjectDetection: + def __init__(self, model_name: str = "frcnn-resnet", confidence_threshold: float = 0.5): + self.model = None + self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + self.classes = COCOUtils().coco_classes_list + self.colors = np.random.uniform(0, 255, size=(len(self.classes), 3)) + # choices fo model_name are: "frcnn-resnet", "frcnn-mobilenet", "retinanet" + if model_name not in ["frcnn-resnet", "frcnn-mobilenet", "retinanet"]: + raise ValueError("Supported model names are: 'frcnn-resnet', 'frcnn-mobilenet', 'retinanet'") + self.model_name = model_name + self.confidence_threshold = confidence_threshold + + def load(self): + start_time = time.time() + if self.model_name == "frcnn-resnet": + self.model = detection.fasterrcnn_resnet50_fpn(pretrained=True, progress=True, + num_classes=len(self.classes), + pretrained_backbone=True).to(self.device) + elif self.model_name == "frcnn-mobilenet": + self.model = detection.fasterrcnn_mobilenet_v3_large_320_fpn(pretrained=True, progress=True, + num_classes=len(self.classes), + pretrained_backbone=True).to(self.device) + elif self.model_name == "retinanet": + self.model = detection.retinanet_resnet50_fpn(pretrained=True, progress=True, + num_classes=len(self.classes), + pretrained_backbone=True).to(self.device) + self.model.eval() + print(f"Model {self.model_name} loaded successfully in {time.time() - start_time} seconds.") + + def __detect__(self, preprocessed_img: torch.FloatTensor) -> Tuple[List[list], List[int], List[float]]: + bboxes_list, class_index_list, scores_list = [], [], [] + detections = self.model(preprocessed_img)[0] + # loop over the detections + for i in range(0, len(detections["boxes"])): + # extract the confidence (i.e., probability) associated with the + # prediction + confidence = detections["scores"][i] + # filter out weak detections by ensuring the confidence is + # greater than the minimum confidence + if confidence > self.confidence_threshold: + # extract the index of the class label from the detections, + # then compute the (x, y)-coordinates of the bounding box + # for the object + idx = int(detections["labels"][i]) + box = detections["boxes"][i].detach().cpu().numpy() + start_x, start_y, end_x, end_y = box.astype("int") + bboxes_list.append([start_x, start_y, end_x, end_y]) + class_index_list.append(idx) + scores_list.append(confidence) + return bboxes_list, class_index_list, scores_list + + def __preprocess_frame__(self, frame: np.array) -> torch.FloatTensor: + # convert the image from BGR to RGB channel ordering and change the + # image from channels last to channels first ordering + image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + image = image.transpose((2, 0, 1)) + + # add the batch dimension, scale the raw pixel intensities to the + # range [0, 1], and convert the image to a floating point tensor + image = np.expand_dims(image, axis=0) + image = image / 255.0 + image = torch.FloatTensor(image) + image = image.to(self.device) + return image + + def visualize(self, frame, bboxes_list: List[list], class_index_list: List[int], scores_list: List[float]): + for bbox, class_index, confidence in zip(bboxes_list, class_index_list, scores_list): + start_x, start_y, end_x, end_y = bbox + label = "{}: {:.2f}%".format(self.classes[class_index], confidence * 100) + # draw the prediction on the frame + cv2.rectangle(frame, (start_x, start_y), (end_x, end_y), self.colors[class_index], 2) + y = start_y - 15 if start_y - 15 > 15 else start_y + 15 + cv2.putText(frame, label, (start_x, y), cv2.FONT_HERSHEY_SIMPLEX, 0.5, self.colors[class_index], 2) + + def exec(self, frame=np.array): + preprocessed_img = self.__preprocess_frame__(frame) + bboxes_list, class_index_list, scores_list = self.__detect__(preprocessed_img) + return bboxes_list, class_index_list, scores_list + + +if __name__ == "__main__": + import glob + import os + + img_dir = "PATH TO THE DIRECTORY CONTAINING THE IMAGES" + img_list = glob.glob(img_dir + "/*.jpg") # Get all the jpg files in the directory + img_list.sort() + object_detector = TorchObjectDetection(model_name="frcnn-resnet") + object_detector.load() + for img_name in img_list: + img_raw_name = os.path.basename(img_name) + frame_ = cv2.imread(img_name) + bboxes_list_, class_index_list_, scores_list_ = object_detector.exec(frame_) + object_detector.visualize(frame_, bboxes_list_, class_index_list_, scores_list_) + cv2.imshow("Frame", frame_) + key = cv2.waitKey(1) # wait for 1ms before moving on to the next frame + if key == ord("q"): + break + elif key == ord("s"): + cv2.imwrite(f"{os.path.dirname(__file__)}/{img_raw_name}", frame_) + cv2.destroyAllWindows() From 2f7f828f4e128c4c4a64d0d94e450045c65e7f46 Mon Sep 17 00:00:00 2001 From: noori Date: Thu, 15 Jun 2023 23:18:23 +0330 Subject: [PATCH 2/2] A3-Noori-98413188 --- output/checkpoints/loss_accuracy.png | Bin 0 -> 146378 bytes src/__main__.py | 118 ++++++++++-- src/adverse_weather_classification/train.py | 36 +++- .../weather_classification.py | 6 +- src/path_following_handler.py | 136 +++++++++----- src/simulator_handler.py | 168 +++++++++++++----- src/utils/carla_utils.py | 16 +- src/utils/controller.py | 7 +- utils/vehicle_command.py | 3 + 9 files changed, 369 insertions(+), 121 deletions(-) create mode 100644 output/checkpoints/loss_accuracy.png diff --git a/output/checkpoints/loss_accuracy.png b/output/checkpoints/loss_accuracy.png new file mode 100644 index 0000000000000000000000000000000000000000..fe8d52e01b1895ab02eb3c27b36efa5767f7c5b5 GIT binary patch literal 146378 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

XXtUeD9)Lcd^IPH(z2lDt|=6`?m(=vU!uA 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®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 D(*N}% literal 0 HcmV?d00001 diff --git a/src/__main__.py b/src/__main__.py index fdb8552..2c9bd94 100644 --- a/src/__main__.py +++ b/src/__main__.py @@ -1,30 +1,114 @@ + +import glob +import os +import sys + +try: + sys.path.append(glob.glob('../carla/dist/carla-*%d.%d-%s.egg' % ( + sys.version_info.major, + sys.version_info.minor, + 'win-amd64' if os.name == 'nt' else 'linux-x86_64'))[0]) +except IndexError: + pass + +sys.path.append(r"D:\CARLA_0.9.8_2\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.8-py3.7-win-amd64.egg") + +sys.path.append(r"D:\CARLA_Code\integrate two session\src") +from utils.carla_utils import draw_waypoints, filter_waypoints, TrajectoryToFollow, InfiniteLoopThread + import time import carla -from src.simulator_handler import SimulatorHandler -from utils.vehicle_command import VehicleCommand -if __name__ == "__main__": - simulator_handler = SimulatorHandler(town_name="Town04") - simulator_handler.spawn_vehicle(spawn_index=13) - simulator_handler.set_weather(weather=carla.WeatherParameters.ClearNoon) +sys.path.append(r"D:\CARLA_Code\integrate two session\src") +sys.path.append(r"D:\CARLA_Code\integrate two session\utils") + +from simulator_handler import SimulatorHandler +from path_following_handler import PathFollowingHandler +from vehicle_command import VehicleCommand + + + + + +if __name__ == '__main__': + client = carla.Client("localhost", 2000) + client.set_timeout(8.0) + + town_name="Town05" + # spawn_index = 2 + + try: + print("Trying to communicate with the client...") + world = client.get_world() + if os.path.basename(world.get_map().name) != town_name: + world: carla.World = client.load_world(town_name) - # potential weather choices are [ClearNoon, ClearSunset, CloudyNoon, CloudySunset, - # WetNoon, WetSunset, MidRainyNoon, MidRainSunset, HardRainNoon, HardRainSunset, - # SoftRainNoon, SoftRainSunset] + blueprint_library = world.get_blueprint_library() + actor_list = [] + print("Successfully connected to CARLA client") + except Exception as error: + raise Exception(f"Error while initializing the simulator: {error}") - # add sensors - rgb_cam = simulator_handler.rgb_cam() - gnss_sensor = simulator_handler.gnss() - imu_sensor = simulator_handler.imu() + simulator_handler = SimulatorHandler(client=client,actor_list=actor_list) + + + weather = [carla.WeatherParameters(cloudiness=20.0,sun_altitude_angle=90.0,fog_density=0.0), # day + carla.WeatherParameters(cloudiness=20.0,sun_altitude_angle=-90.0,fog_density=0.0), # night + carla.WeatherParameters(cloudiness=20.0,sun_altitude_angle=90.0,fog_density=60.0), # fog + carla.WeatherParameters(cloudiness=85.0,sun_altitude_angle=90.0,fog_density=0.0)] # cloud + + world.set_weather(weather[3]) + + # weather = carla.WeatherParameters(cloudiness=100.0,sun_altitude_angle=165.0,fog_density=0.0) + # world.set_weather(weather) + + # carla.WeatherParameters(cloudiness=20.0, + # sun_altitude_angle=100.0,fog_density=60.0) + + path_following_handler = PathFollowingHandler(client=client, debug_mode=False) + + vehicle_blueprint = blueprint_library.filter("model3")[0] # choosing the car + # spawn_point = world.get_map().get_spawn_points()[spawn_index] + # vehicle = world.spawn_actor(vehicle_blueprint, spawn_point) + + ego_spawn_point = path_following_handler.ego_spawn_point + + + filtered_waypoints = filter_waypoints(path_following_handler.waypoints, road_id=ego_spawn_point["road_id"]) + spawn_point = filtered_waypoints[ego_spawn_point["filtered_points_index"]].transform + spawn_point.location.z += 2 + vehicle = client.get_world().spawn_actor(vehicle_blueprint, spawn_point) + actor_list.append(vehicle) + + + rgb_cam = simulator_handler.rgb_cam(vehicle) + + # gnss_sensor = simulator_handler.gnss(vehicle) + # imu_sensor = simulator_handler.imu(vehicle) + # lidar = simulator_handler.lidar(vehicle) + # radar = simulator_handler.radar(vehicle) + # collision = simulator_handler.collision(vehicle) # listen to sensor data rgb_cam.listen(lambda image: simulator_handler.rgb_cam_callback(image)) - imu_sensor.listen(lambda imu: simulator_handler.imu_callback(imu)) - gnss_sensor.listen(lambda gnss: simulator_handler.gnss_callback(gnss)) - VehicleCommand(throttle=1.0).send_control(simulator_handler.vehicle) - time.sleep(20.0) + + # imu_sensor.listen(lambda imu: simulator_handler.imu_callback(imu)) + # gnss_sensor.listen(lambda gnss: simulator_handler.gnss_callback(gnss)) + # lidar.listen(lambda data: simulator_handler.lidar_callback(data)) + # radar.listen(lambda data: simulator_handler.radar_callback(data)) + # collision.listen(lambda event: simulator_handler.collision_callback(event)) + + if path_following_handler.debug_mode: + path_following_handler.start() + else: + ego_pid_controller = path_following_handler.pid_controller(vehicle, + path_following_handler.pid_values_lateral, + path_following_handler.pid_values_longitudinal) + + path_following_handler.vehicle_and_controller_inputs(vehicle, ego_pid_controller) + path_following_handler.start() diff --git a/src/adverse_weather_classification/train.py b/src/adverse_weather_classification/train.py index 8822b6b..a798966 100644 --- a/src/adverse_weather_classification/train.py +++ b/src/adverse_weather_classification/train.py @@ -9,11 +9,16 @@ from tensorflow.keras.callbacks import ModelCheckpoint from mock import Mock import matplotlib.pyplot as plt +from sklearn.metrics import classification_report, confusion_matrix +num_of_test_samples = 0 +for root_dir, cur_dir, files in os.walk(r"D:\CARLA_Code\trainSet\test"): + num_of_test_samples += len(files) +print('num_of_test_samples count:', num_of_test_samples) class TrainHyperParameters: - def __init__(self, input_shape: Tuple[int, int, int] = (256, 256, 3), number_of_classes: int = 2, - learning_rate: float = 0.001, batch_size: int = 32, number_of_epochs: int = 3) -> None: + def __init__(self, input_shape: Tuple[int, int, int] = (256, 256, 3), number_of_classes: int = 4, + learning_rate: float = 0.001, batch_size: int = 32, number_of_epochs: int = 5) -> None: self.hyperparameters = Mock() self.hyperparameters.input_shape = input_shape self.hyperparameters.number_of_classes = number_of_classes @@ -60,12 +65,23 @@ def model_builder(self): self.model = keras.models.Sequential([ keras.layers.Conv2D(32, (3, 3), activation='relu', input_shape=self.hyperparameters.input_shape), keras.layers.MaxPooling2D((2, 2)), + keras.layers.Dropout(0.2), + keras.layers.Conv2D(64, (3, 3), activation='relu'), keras.layers.Conv2D(64, (3, 3), activation='relu'), keras.layers.MaxPooling2D((2, 2)), + keras.layers.Dropout(0.2), + keras.layers.Conv2D(128, (3, 3), activation='relu'), keras.layers.Conv2D(128, (3, 3), activation='relu'), keras.layers.MaxPooling2D((2, 2)), + keras.layers.Dropout(0.2), + keras.layers.Conv2D(512, (3, 3), activation='relu'), + keras.layers.Conv2D(512, (3, 3), activation='relu'), + keras.layers.MaxPooling2D((2, 2)), + keras.layers.Dropout(0.2), keras.layers.Flatten(), - keras.layers.Dense(128, activation='relu'), + keras.layers.Dense(1024, activation='relu'), + keras.layers.Dropout(0.2), + keras.layers.Dense(64, activation='relu'), keras.layers.Dropout(0.5), keras.layers.Dense(self.hyperparameters.number_of_classes, activation='softmax') ]) @@ -106,6 +122,16 @@ def train(self, train_generator, test_generator): # plot loss and accuracy on train and validation set self.plot_history(history) + Y_pred = self.model.predict_generator(test_generator, num_of_test_samples // self.hyperparameters.batch_size+1) + y_pred = np.argmax(Y_pred, axis=1) + print('Confusion Matrix') + print(confusion_matrix(test_generator.classes, y_pred)) + print('Classification Report') + target_names = ['fog ', 'day','cloud','night'] + print(classification_report(test_generator.classes, y_pred, target_names=target_names)) + + + def plot_history(self, history): matplotlib.use('Agg') plt.figure(figsize=(10, 5)) @@ -128,6 +154,8 @@ def exec(self): if __name__ == '__main__': - data_dir_ = '/home/ahv/PycharmProjects/Visual-Inertial-Odometry/simulation/CARLA/output/root_dir' + + data_dir_ = r"D:\CARLA_Code\trainSet" train_custom_cnn = TrainCustomCNN(data_dir_) train_custom_cnn.exec() + diff --git a/src/adverse_weather_classification/weather_classification.py b/src/adverse_weather_classification/weather_classification.py index 777ddfe..7feb2aa 100644 --- a/src/adverse_weather_classification/weather_classification.py +++ b/src/adverse_weather_classification/weather_classification.py @@ -12,7 +12,7 @@ def __init__(self, model_path, model_input_size: Tuple[int, int] = (256, 256)) - self.model = None self.model_path = model_path self.model_input_size = model_input_size - self.class_labels = ['day', 'night'] + self.class_labels = ['fog ', 'day','night','cloud'] def load(self): start_time = time.time() @@ -40,8 +40,8 @@ def exec(self, frame: np.ndarray) -> str: if __name__ == "__main__": - img_dir = "/home/ahv/PycharmProjects/Visual-Inertial-Odometry/simulation/CARLA/output/root_dir/testing_imgs" - model_path_ = "/src/adverse_weather_classification/output/checkpoints/best_model.h5" + img_dir = r"D:\CARLA_Code\trainSet\finalTest" + model_path_ = r"D:\CARLA_Code\output\checkpoints\best_model.h5" adverse_weather_classifier = AdverseWeatherClassifier(model_path_) adverse_weather_classifier.load() for root, dirs, files in os.walk(img_dir): diff --git a/src/path_following_handler.py b/src/path_following_handler.py index b7a75c6..b75252c 100644 --- a/src/path_following_handler.py +++ b/src/path_following_handler.py @@ -3,12 +3,19 @@ import sys from abc import ABC from typing import Any, Union, Dict, List +from datetime import datetime +import numpy as np + +sys.path.append(r"D:\CARLA_0.9.8_2\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.8-py3.7-win-amd64.egg") +sys.path.append(r"D:\CARLA_Code\integrate two session\src") +sys.path.append(r"D:\CARLA_Code\integrate two session\utils") + import carla from carla import World -from src.utils.carla_utils import draw_waypoints, filter_waypoints, TrajectoryToFollow, InfiniteLoopThread -from src.utils.controller import VehiclePIDController +from utils.carla_utils import draw_waypoints, filter_waypoints, TrajectoryToFollow, InfiniteLoopThread +from utils.controller import VehiclePIDController class PathFollowingHandler(InfiniteLoopThread, ABC): @@ -17,6 +24,7 @@ def __init__(self, client: carla.Client, debug_mode: bool = False, super(PathFollowingHandler, self).__init__(name="CARLA trajectory following handler") self.trajectory_to_follow_handler = TrajectoryToFollow(trajectory_index=trajectory_index) self.ego_vehicle = None + self.weatherCounter = 1; self.ego_pid_controller = None carla_map, road_id_list, filtered_point_index_list = self.trajectory_to_follow_handler.get_trajectory_data() self.ego_spawn_point: Union[Dict[str, int], Dict[str, int]] = \ @@ -31,10 +39,10 @@ def __init__(self, client: carla.Client, debug_mode: bool = False, self.waypoints: list = self.client.get_world().get_map().generate_waypoints(distance=1.0) self.debug_mode = debug_mode if self.debug_mode: - self.waypoints_to_visualize = {'road_id': [4], 'filtered_points_index': [0]} + self.waypoints_to_visualize = {'road_id': [1], 'filtered_points_index': [0]} self.pid_values_lateral: Union[Dict[str, float], Dict[str, float], Dict[str, float]] = \ - {'K_P': 1, - 'K_D': 0.07, + {'K_P': 2, + 'K_D': 0, 'K_I': 0.05} # control steering self.pid_values_longitudinal: Union[Dict[str, float], Dict[str, float], Dict[str, float]] = \ {'K_P': 1, @@ -42,9 +50,19 @@ def __init__(self, client: carla.Client, debug_mode: bool = False, 'K_I': 0.05} # control speed self.vehicle_to_target_distance_threshold: float = 2.5 - self.desired_speed: int = 20 # meter per second + self.desired_speed: int = 15 # meter per second self.reached_destination: bool = False self.previous_waypoint: Union[carla.Waypoint, None] = None + + # self.i = 0 + self.intersectionCounter =0 + # for x in range(4): + # with open("intersection"+str(x)+".csv", 'a') as csvfile: + # ww = np.array(["timeStamp","P,I,D", "Yaw"]) + # ww = np.reshape(ww, (1, 3)) + # np.savetxt(csvfile, ww, delimiter=',', fmt=['%s', '%s', '%s'], comments='') + + def __follow_target_waypoints__(self, vehicle: Any, target_waypoint, ego_pid_controller_) -> None: self.client.get_world().debug.draw_string(target_waypoint.transform.location, 'O', @@ -52,7 +70,12 @@ def __follow_target_waypoints__(self, vehicle: Any, target_waypoint, ego_pid_con color=carla.Color(r=255, g=0, b=0), life_time=20, persistent_lines=True) + + # dict = {} + self.i = 0 + while True: + self.i = self.i+1 vehicle_loc = vehicle.get_location() vehicle_to_target_distance = math.sqrt((target_waypoint.transform.location.x - vehicle_loc.x) ** 2 + (target_waypoint.transform.location.y - vehicle_loc.y) ** 2) @@ -63,6 +86,15 @@ def __follow_target_waypoints__(self, vehicle: Any, target_waypoint, ego_pid_con else: control_signal = ego_pid_controller_.run_step(desired_speed, target_waypoint) vehicle.apply_control(control_signal) + # print("***************", vehicle.get_transform().rotation.yaw) + + # if self.i % 500 == 0: + # with open("intersection"+str(self.intersectionCounter%4)+".csv", 'a') as csvfile: + # yaw = vehicle.get_transform().rotation.yaw + # PID = str(self.pid_values_lateral['K_P'])+" ,"+str(self.pid_values_lateral['K_I'])+" ,"+str(self.pid_values_lateral['K_D']) + # data = np.array([str(datetime.now()),PID, str(yaw)]) + # data = np.reshape(data, (1, 3)) + # np.savetxt(csvfile, data, delimiter=',', fmt=['%s', '%s', '%s'], comments='') def visualize_road_id(self, road_id: int, filtered_points_index: int, life_time: int = 5) -> None: # For debugging purposes. @@ -93,29 +125,41 @@ def pid_controller(vehicle, args_lateral: dict, args_longitudinal: dict) -> Vehi return ego_pid_controller_ def follow_trajectory(self, vehicle: Any, ego_pid_controller_: VehiclePIDController) -> None: - for trajectory_point_index in range(len(self.trajectory_to_follow['road_id'])): - current_road_id, current_filtered_point_index = \ - self.trajectory_to_follow['road_id'][trajectory_point_index], \ - self.trajectory_to_follow['filtered_points_index'][trajectory_point_index] - draw_waypoints(self.world, self.waypoints, road_id=current_road_id, life_time=30) - print("Following point: {}/{}".format(trajectory_point_index, - len(self.trajectory_to_follow['road_id']) - 1)) - print('current_road_id: {}, current_filtered_point_index: {}'.format(current_road_id, - current_filtered_point_index)) - if current_road_id == 1000: # 1000 means using waypoint.next - target_waypoint = self.previous_waypoint.next(float( - current_filtered_point_index))[0] - elif current_road_id == 2000: # 2000 means using waypoint.next_until_lane_end - target_waypoints: List[carla.Waypoint] = self.previous_waypoint.next_until_lane_end(float( - current_filtered_point_index)) - for target_waypoint in target_waypoints: - self.__follow_target_waypoints__(vehicle, target_waypoint, ego_pid_controller_) - self.previous_waypoint = target_waypoint - else: - filtered_waypoints = filter_waypoints(self.waypoints, road_id=current_road_id) - target_waypoint = filtered_waypoints[current_filtered_point_index] - self.__follow_target_waypoints__(vehicle, target_waypoint, ego_pid_controller_) - self.previous_waypoint = target_waypoint + weather = [carla.WeatherParameters(cloudiness=20.0,sun_altitude_angle=90.0,fog_density=0.0), # day + carla.WeatherParameters(cloudiness=20.0,sun_altitude_angle=-90.0,fog_density=0.0), # night + carla.WeatherParameters(cloudiness=20.0,sun_altitude_angle=90.0,fog_density=60.0), # fog + carla.WeatherParameters(cloudiness=100.0,sun_altitude_angle=165.0,fog_density=0.0)] # cloud + while True: + for trajectory_point_index in range(len(self.trajectory_to_follow['road_id'])): + current_road_id, current_filtered_point_index = \ + self.trajectory_to_follow['road_id'][trajectory_point_index], \ + self.trajectory_to_follow['filtered_points_index'][trajectory_point_index] + draw_waypoints(self.world, self.waypoints, road_id=current_road_id, life_time=30) + print("Following point: {}/{}".format(trajectory_point_index, + len(self.trajectory_to_follow['road_id']) - 1)) + print('current_road_id: {}, current_filtered_point_index: {}'.format(current_road_id, + current_filtered_point_index)) + + if current_road_id == 1000: # 1000 means using waypoint.next + target_waypoint = self.previous_waypoint.next(float( + current_filtered_point_index))[0] + elif current_road_id == 2000: # 2000 means using waypoint.next_until_lane_end + self.intersectionCounter +=1 + if self.intersectionCounter%4 == 0: + self.world.set_weather(weather[self.weatherCounter]) + self.weatherCounter += 1 + if(self.weatherCounter==4): + self.weatherCounter=0 + target_waypoints: List[carla.Waypoint] = self.previous_waypoint.next_until_lane_end(float( + current_filtered_point_index)) + for target_waypoint in target_waypoints: + self.__follow_target_waypoints__(vehicle, target_waypoint, ego_pid_controller_) + self.previous_waypoint = target_waypoint + else: + filtered_waypoints = filter_waypoints(self.waypoints, road_id=current_road_id) + target_waypoint = filtered_waypoints[current_filtered_point_index] + self.__follow_target_waypoints__(vehicle, target_waypoint, ego_pid_controller_) + self.previous_waypoint = target_waypoint def vehicle_and_controller_inputs(self, ego_vehicle_, ego_pid_controller_): self.ego_vehicle = ego_vehicle_ @@ -139,19 +183,21 @@ def terminate(self): self.join() -if __name__ == '__main__': - client_ = carla.Client("localhost", 2000) - client_.set_timeout(8.0) - path_following_handler = PathFollowingHandler(client=client_, debug_mode=False) - ego_spawn_point = path_following_handler.ego_spawn_point - if path_following_handler.debug_mode: - path_following_handler.start() - else: - ego_vehicle = \ - path_following_handler.spawn_ego_vehicles(road_id=ego_spawn_point["road_id"], - filtered_points_index=ego_spawn_point["filtered_points_index"]) - ego_pid_controller = path_following_handler.pid_controller(ego_vehicle, - path_following_handler.pid_values_lateral, - path_following_handler.pid_values_longitudinal) - path_following_handler.vehicle_and_controller_inputs(ego_vehicle, ego_pid_controller) - path_following_handler.start() +# if __name__ == '__main__': +# client_ = carla.Client("localhost", 2000) +# client_.set_timeout(8.0) +# path_following_handler = PathFollowingHandler(client=client_, debug_mode=False) +# ego_spawn_point = path_following_handler.ego_spawn_point +# if path_following_handler.debug_mode: +# path_following_handler.start() +# else: +# ego_vehicle = \ +# path_following_handler.spawn_ego_vehicles(road_id=ego_spawn_point["road_id"], +# filtered_points_index=ego_spawn_point["filtered_points_index"]) + +# ego_pid_controller = path_following_handler.pid_controller(ego_vehicle, +# path_following_handler.pid_values_lateral, +# path_following_handler.pid_values_longitudinal) + +# path_following_handler.vehicle_and_controller_inputs(ego_vehicle, ego_pid_controller) +# path_following_handler.start() diff --git a/src/simulator_handler.py b/src/simulator_handler.py index ba3b914..0a47b6d 100644 --- a/src/simulator_handler.py +++ b/src/simulator_handler.py @@ -1,16 +1,25 @@ import os +import sys -import carla import cv2 import numpy as np import pandas as pd from matplotlib import pyplot as plt +from matplotlib import cm +sys.path.append(r"D:\CARLA_0.9.8_2\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.8-py3.7-win-amd64.egg") +import carla +from carla import World + +# sys.path.append(r"D:\CARLA_Code\integrate two session\src") class SimulatorHandler: - def __init__(self, town_name): + def __init__(self,client: carla.Client,actor_list): + self.raw_data = None + self.COOL = None + self.COOL_RANGE = None + self.viridis = None self.spawn_point = None - self.vehicle = None self.rgb_cam_sensor = None self.vehicle_blueprint = None @@ -21,36 +30,82 @@ def __init__(self, town_name): if not os.path.exists(os.path.join(self.save_dir, "rgb_cam")): os.makedirs(os.path.join(self.save_dir, "rgb_cam")) - try: - print("Trying to communicate with the client...") - client = carla.Client("localhost", 2000) - client.set_timeout(8.0) - self.world = client.get_world() - if os.path.basename(self.world.get_map().name) != town_name: - self.world: carla.World = client.load_world(town_name) - - self.blueprint_library = self.world.get_blueprint_library() - self.actor_list = [] - self.vehicle_list = [] - self.IM_WIDTH = 800 # Ideally a config file should be defined for such parameters - self.IM_HEIGHT = 600 - print("Successfully connected to CARLA client") - except Exception as error: - raise Exception(f"Error while initializing the simulator: {error}") - self.imu_dataframe = pd.DataFrame({}) self.gnss_dataframe = pd.DataFrame({}) - def spawn_vehicle(self, spawn_index: int = 90): - self.vehicle_blueprint = self.blueprint_library.filter("model3")[0] # choosing the car - self.spawn_point = self.world.get_map().get_spawn_points()[spawn_index] - self.vehicle = self.world.spawn_actor(self.vehicle_blueprint, self.spawn_point) - self.actor_list.append(self.vehicle) - - def set_weather(self, weather=carla.WeatherParameters.ClearNoon): - self.world.set_weather(weather) - - def rgb_cam(self): + self.client = client + self.world: World = self.client.get_world() + self.blueprint_library = self.world.get_blueprint_library() + + self.IM_WIDTH = 800 # Ideally a config file should be defined for such parameters + self.IM_HEIGHT = 600 + + self.actor_list = actor_list + + + + + # Add LIDAR and RADAR, and collision sensors + + def lidar(self,vehicle): + lidar_sensor = self.blueprint_library.find("sensor.lidar.ray_cast") + # lidar_sensor.set_attribute("sensor_tick", str(0.0)) + # lidar_sensor.set_attribute('range', '100.0') + # lidar_sensor.set_attribute('upper_fov', '15.0') + # lidar_sensor.set_attribute('lower_fov', '-25.0') + # lidar_sensor.set_attribute('channels', '64.0') + # lidar_sensor.set_attribute('rotation_frequency', '20.0') + # lidar_sensor.set_attribute('points_per_second', '500000') + with open("src/data/lidar.csv", 'a') as csvfile: + ww = np.array(["X", "Y", "Z"]) + ww = np.reshape(ww, (1, 3)) + np.savetxt(csvfile, ww, delimiter=',', fmt=['%s', '%s', '%s'], comments='') + self.viridis = np.array(cm.get_cmap('plasma').colors) + lidar_location = carla.Location(0, 0, 0) + lidar_rotation = carla.Rotation(0, 0, 0) + lidar_transform = carla.Transform(lidar_location, lidar_rotation) + lidar_sen = self.world.spawn_actor(lidar_sensor, lidar_transform, attach_to=vehicle, + attachment_type=carla.AttachmentType.Rigid) + self.actor_list.append(lidar_sen) + return lidar_sen + + def radar(self,vehicle): + radar_sensor = self.blueprint_library.find("sensor.other.radar") + radar_sensor.set_attribute('horizontal_fov', '30.0') + radar_sensor.set_attribute('vertical_fov', '30.0') + radar_sensor.set_attribute('points_per_second', '10000') + with open('src/data/radar.csv', 'a') as csvfile: + ww = np.array(["altitude", "azimuth", "depth", "velocity"]) + ww = np.reshape(ww, (1, 4)) + np.savetxt(csvfile, ww, delimiter=',', fmt=['%s', '%s', '%s', '%s'], comments='') + self.viridis = np.array(cm.get_cmap('plasma').colors) + # VID_RANGE = np.linspace(0.0, 1.0, self.viridis.shape[0]) + self.COOL_RANGE = np.linspace(0.0, 1.0, self.viridis.shape[0]) + self.COOL = np.array(cm.get_cmap('winter')(self.COOL_RANGE)) + self.COOL = self.COOL[:, :3] + radar_location = carla.Location(0, 0, 0) + radar_rotation = carla.Rotation(0, 0, 0) + radar_transform = carla.Transform(radar_location, radar_rotation) + radar_sen = self.world.spawn_actor(radar_sensor, radar_transform, attach_to=vehicle, + attachment_type=carla.AttachmentType.Rigid) + self.actor_list.append(radar_sen) + return radar_sen + + def collision(self,vehicle): + collision_sensor = self.blueprint_library.find("sensor.other.collision") + with open('src/data/collision.csv', 'a') as csvfile: + ww = np.array(["time stamp", "situation"]) + ww = np.reshape(ww, (1, 2)) + np.savetxt(csvfile, ww, delimiter=',', fmt=['%s', '%s'], comments='') + collision_location = carla.Location(0, 0, 0) + collision_rotation = carla.Rotation(0, 0, 0) + collision_transform = carla.Transform(collision_location, collision_rotation) + collision_sen = self.world.spawn_actor(collision_sensor, collision_transform, attach_to=vehicle, + attachment_type=carla.AttachmentType.Rigid) + self.actor_list.append(collision_sen) + return collision_sen + + def rgb_cam(self,vehicle): rgb_camera = self.blueprint_library.find("sensor.camera.rgb") rgb_camera.set_attribute("image_size_x", f"{self.IM_WIDTH}") rgb_camera.set_attribute("image_size_y", f"{self.IM_HEIGHT}") @@ -59,40 +114,44 @@ def rgb_cam(self): spawn_point_rgb = carla.Transform(carla.Location(x=2.5, y=0, z=0.9), carla.Rotation(pitch=-5, roll=0, yaw=0)) - self.rgb_cam_sensor = self.world.spawn_actor(rgb_camera, spawn_point_rgb, attach_to=self.vehicle) + self.rgb_cam_sensor = self.world.spawn_actor(rgb_camera, spawn_point_rgb, attach_to=vehicle) self.actor_list.append(self.rgb_cam_sensor) return self.rgb_cam_sensor - def gnss(self): + def gnss(self,vehicle): gnss_sensor = self.blueprint_library.find("sensor.other.gnss") gnss_sensor.set_attribute("sensor_tick", str(0.0)) gnss_location = carla.Location(0, 0, 0) gnss_rotation = carla.Rotation(0, 0, 0) gnss_transform = carla.Transform(gnss_location, gnss_rotation) - ego_gnss = self.world.spawn_actor(gnss_sensor, gnss_transform, attach_to=self.vehicle, + ego_gnss = self.world.spawn_actor(gnss_sensor, gnss_transform, attach_to=vehicle, attachment_type=carla.AttachmentType.Rigid) self.actor_list.append(ego_gnss) return ego_gnss - def imu(self): + def imu(self,vehicle): imu_sensor = self.blueprint_library.find("sensor.other.imu") imu_location = carla.Location(0, 0, 0) imu_rotation = carla.Rotation(0, 0, 0) imu_transform = carla.Transform(imu_location, imu_rotation) - ego_imu = self.world.spawn_actor(imu_sensor, imu_transform, attach_to=self.vehicle, + ego_imu = self.world.spawn_actor(imu_sensor, imu_transform, attach_to=vehicle, attachment_type=carla.AttachmentType.Rigid) self.actor_list.append(ego_imu) return ego_imu + # callbacks + def rgb_cam_callback(self, image): - image.save_to_disk("data/rgb_cam/%06d.jpg" % image.frame) - raw_image = np.array(image.raw_data) - - rgba_image = raw_image.reshape((self.IM_HEIGHT, self.IM_WIDTH, 4)) # because carla rgb cam is rgba - rgb_image = rgba_image[:, :, :3] - rgb_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2RGB) - plt.imshow(rgb_image) - plt.show() + image.save_to_disk("src/data/rgb_cam/%06d.jpg" % image.frame) + # raw_image = np.array(image.raw_data) + + # rgba_image = raw_image.reshape((self.IM_HEIGHT, self.IM_WIDTH, 4)) # because carla rgb cam is rgba + # rgb_image = rgba_image[:, :, :3] + # rgb_image = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2RGB) + # plt.imshow(rgb_image) + # plt.show() + + # cv2.imshow("rgb camera", rgb_image) # FixMe: Replace with pygame visualization # cv2.waitKey(1) @@ -118,3 +177,26 @@ def gnss_callback(self, gnss): gnss_dict["altitude"] = gnss.altitude self.gnss_dataframe = self.gnss_dataframe.append(gnss_dict, ignore_index=True) self.gnss_dataframe.to_csv(os.path.join(self.save_dir, "gnss.csv"), index=False) + + def lidar_callback(self, point_cloud): + data = np.copy(np.frombuffer(point_cloud.raw_data, dtype=np.dtype('f4'))) + # print("#########", len(point_cloud.raw_data), "#########") + data = np.reshape(data, (int(data.shape[0] / 3), 3)) + + with open('src/data/lidar.csv', 'a') as csvfile: + np.savetxt(csvfile, data, delimiter=',', fmt=['%f', '%f', '%f'], comments='') + + def collision_callback(self, event): + ar = np.array([str(event.timestamp), "collision detected!"]) + ar = np.reshape(ar, (1, 2)) + with open('src/data/collision.csv', 'a') as csvfile: + np.savetxt(csvfile, ar, delimiter=',', fmt=['%s', '%s'], comments='') + + def radar_callback(self, data): + + mydata = np.frombuffer(data.raw_data, dtype=np.dtype('f4')) + mydata = np.reshape(mydata, (int(mydata.shape[0] / 4), 4)) + with open('src/data/radar.csv', 'a') as csvfile: + np.savetxt(csvfile, mydata, delimiter=',', fmt=['%f', '%f', '%f', '%f'], comments='') + + \ No newline at end of file diff --git a/src/utils/carla_utils.py b/src/utils/carla_utils.py index 6297424..e5683b9 100644 --- a/src/utils/carla_utils.py +++ b/src/utils/carla_utils.py @@ -1,5 +1,7 @@ +import sys import threading from typing import Tuple, Any, Dict, Union +sys.path.append(r"D:\CARLA_0.9.8_2\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.8-py3.7-win-amd64.egg") import carla @@ -27,12 +29,14 @@ def __init__(self, trajectory_index: int) -> None: def get_trajectory_data(self) -> Tuple[Any, list, list]: if self.trajectory_index == 0: - carla_map = "Town10HD_Opt" - road_id_list: list = [13, 12, 12, 11, 2, 10] - filtered_point_index_list: list = [-4, -1, 11, 1, 0, 0] + carla_map = "Town05" + # road_id_list: list = [17,1000, 1,2000, 1000, 5,2000, 1000, 7,2000,1000, 17,2000] + # filtered_point_index_list: list = [-4,3, 0,1, 9, -1, 1,3, -1,1,8, 0,1] + road_id_list: list = [1,1,2000, 1000, 5,5,2000, 1000, 7,7,2000,1000, 17,17,2000,1000] + filtered_point_index_list: list = [ 0,28,1, 5, -1,-29, 1,4, -1,-29,1,8, 0,28,1,5] elif self.trajectory_index == 1: - carla_map = "Town10HD_Opt" - road_id_list: list = [1, 2000, 1, 2, 1000, 21, 20, 20, 1000, 15, 22, 6, 2000] + carla_map = "Town05" + road_id_list: list = [1, 1, 1, 2, 1000, 21, 20, 20, 1000, 15, 22, 6, 2000] filtered_point_index_list: list = [-300, 1, -4, -4, 25, -1, -1, 3, 10, 0, 3, -1, 1] else: raise NotImplementedError('A trajectory with index {} has not been implemented.' @@ -41,7 +45,7 @@ def get_trajectory_data(self) -> Tuple[Any, list, list]: def get_ego_vehicle_spwan_point(self) -> Union[Dict[str, int], Dict[str, int]]: if self.trajectory_index == 0: - ego_spawn_point: Union = {'road_id': 13, 'filtered_points_index': 0} + ego_spawn_point: Union = {'road_id': 1, 'filtered_points_index': 0} elif self.trajectory_index == 1: ego_spawn_point: Union = {'road_id': 1, 'filtered_points_index': 4} else: diff --git a/src/utils/controller.py b/src/utils/controller.py index e312b7d..28716b5 100644 --- a/src/utils/controller.py +++ b/src/utils/controller.py @@ -2,8 +2,9 @@ # # This work is licensed under the terms of the MIT license. # For a copy, see . - +import sys """ This module contains PID controllers to perform lateral and longitudinal control. """ +sys.path.append(r"D:\CARLA_0.9.8_2\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.8-py3.7-win-amd64.egg") from collections import deque import math @@ -170,7 +171,7 @@ def _pid_control(self, target_speed, current_speed): return np.clip((self._k_p * error) + (self._k_d * _de) + (self._k_i * _ie), -1.0, 1.0) - def change_parameters(self, K_P, K_I, K_D, dt): + def change_parameters(self, K_P, K_I, K_D, dt=0.03): """Changes the PID parameters""" self._k_p = K_P self._k_i = K_I @@ -261,7 +262,7 @@ def _pid_control(self, waypoint, vehicle_transform): return np.clip((self._k_p * _dot) + (self._k_d * _de) + (self._k_i * _ie), -1.0, 1.0) - def change_parameters(self, K_P, K_I, K_D, dt): + def change_parameters(self, K_P, K_I, K_D, dt=0.03): """Changes the PID parameters""" self._k_p = K_P self._k_i = K_I diff --git a/utils/vehicle_command.py b/utils/vehicle_command.py index 1b5c3d6..7a8d3ae 100644 --- a/utils/vehicle_command.py +++ b/utils/vehicle_command.py @@ -1,3 +1,6 @@ +import sys +sys.path.append(r"D:\CARLA_0.9.8_2\WindowsNoEditor\PythonAPI\carla\dist\carla-0.9.8-py3.7-win-amd64.egg") + import carla import numpy as np