diff --git a/src/self_driving_car_navigation/carla_environment.py b/src/self_driving_car_navigation/carla_environment.py index c8d46fd14c..5d6cc466b4 100644 --- a/src/self_driving_car_navigation/carla_environment.py +++ b/src/self_driving_car_navigation/carla_environment.py @@ -220,8 +220,13 @@ def _clear_all_non_ego_actors(self): print(f"[清理] 车辆{cleared_count['vehicle']} | 自行车{cleared_count['bicycle']} | 静态车辆{cleared_count['static_vehicle']}") def process_image(self, image): - """处理摄像头数据""" + """处理摄像头数据 - 修复frame属性访问问题""" try: + # 检查是否为有效的图像对象 + if not hasattr(image, 'raw_data') or not hasattr(image, 'height') or not hasattr(image, 'width'): + print("[图像处理错误] 无效的图像数据") + return + array = np.frombuffer(image.raw_data, dtype=np.uint8).reshape((image.height, image.width, 4))[:, :, :3] array = array[:, :, ::-1].copy() if self.image_queue.full(): @@ -231,8 +236,13 @@ def process_image(self, image): print(f"[图像处理错误] {str(e)}") def process_lidar(self, data): - """处理激光雷达数据""" + """处理激光雷达数据 - 修复frame属性访问问题""" try: + # 检查是否为有效的激光雷达数据 + if not hasattr(data, 'raw_data'): + print("[激光雷达处理错误] 无效的激光雷达数据") + return + points = np.frombuffer(data.raw_data, dtype=np.dtype('f4')).reshape(-1, 4)[:, :3] distances = np.linalg.norm(points, axis=1) angles = np.arctan2(points[:, 1], points[:, 0]) * 180 / np.pi @@ -251,8 +261,13 @@ def process_lidar(self, data): print(f"[激光雷达处理错误] {str(e)}") def process_imu(self, data): - """处理IMU数据""" + """处理IMU数据 - 修复frame属性访问问题""" try: + # 检查是否为有效的IMU数据 + if not hasattr(data, 'accelerometer') or not hasattr(data, 'gyroscope'): + print("[IMU处理错误] 无效的IMU数据") + return + imu_data = np.array([ data.accelerometer.x, data.accelerometer.y, data.accelerometer.z, data.gyroscope.x, data.gyroscope.y, data.gyroscope.z diff --git a/src/self_driving_car_navigation/run_simulation.py b/src/self_driving_car_navigation/run_simulation.py index 36ad14e01c..312538d685 100644 --- a/src/self_driving_car_navigation/run_simulation.py +++ b/src/self_driving_car_navigation/run_simulation.py @@ -3,8 +3,13 @@ import sys import pygame import carla +import os +import sys + +# 添加当前目录到Python路径,确保可以导入_agent模块 +sys.path.append(os.path.dirname(os.path.abspath(__file__))) -# 修正导入路径:适配_agent子目录下的carla_environment.py +# 从_agent子目录导入CarlaEnvironment from _agent.carla_environment import CarlaEnvironment print("="*60) @@ -46,6 +51,9 @@ def lerp(a, b, t): return smooth_tf def run_simulation(): + # 初始化pygame + pygame.init() + env = None try: print("\n[CARLA连接] 创建环境...") @@ -71,6 +79,11 @@ def run_simulation(): # 持续运行仿真(不限制步数) step = 0 while True: + # 处理pygame事件 + for event in pygame.event.get(): + if event.type == pygame.QUIT: + raise KeyboardInterrupt + # 同步CARLA帧(关键优化:保证控制时序稳定) env.world.tick() @@ -100,6 +113,8 @@ def run_simulation(): if env is not None: print("\n[资源清理] 销毁资源...") env.close() + # 退出pygame + pygame.quit() print("\n[程序退出]") if __name__ == "__main__":