CARLA
 
载入中...
搜索中...
未找到
Carla.cpp
浏览该文件的文档.
1// 版权所有 1998-2017 Epic Games, Inc. 保留所有权利
2
3#include "Carla.h"
4#include "Developer/Settings/Public/ISettingsModule.h" // 包含用于管理插件设置的模块接口
5#include "Developer/Settings/Public/ISettingsSection.h" // 包含设置部分的接口
6#include "Developer/Settings/Public/ISettingsContainer.h" // 包含设置容器的接口
7#include "Settings/CarlaSettings.h" // 包含CARLA设置的具体实现
8
9#define LOCTEXT_NAMESPACE "FCarlaModule" // 定义本地化文本命名空间
10
11// 定义两个日志类别:用于一般日志和服务器相关日志
13DEFINE_LOG_CATEGORY(LogCarlaServer);
14
15// 模块启动函数
17{
18 RegisterSettings(); // 注册插件设置
19 LoadChronoDll(); // 加载Chrono动态链接库(DLL)
20}
21
22// 加载Chrono动态链接库的实现
24{
25 #if defined(WITH_CHRONO) && PLATFORM_WINDOWS // 仅在Windows平台且启用了Chrono库时执行
26 const FString BaseDir = FPaths::Combine(*FPaths::ProjectPluginsDir(), TEXT("Carla")); // 获取插件的基础目录
27 const FString DllDir = FPaths::Combine(*BaseDir, TEXT("CarlaDependencies"), TEXT("dll")); // 拼接DLL所在目录路径
28 FString ChronoEngineDll = FPaths::Combine(*DllDir, TEXT("ChronoEngine.dll")); // Chrono引擎核心DLL
29 FString ChronoVehicleDll = FPaths::Combine(*DllDir, TEXT("ChronoEngine_vehicle.dll")); // Chrono车辆模块DLL
30 FString ChronoModelsDll = FPaths::Combine(*DllDir, TEXT("ChronoModels_vehicle.dll")); // Chrono模型模块DLL
31 FString ChronoRobotDll = FPaths::Combine(*DllDir, TEXT("ChronoModels_robot.dll")); // Chrono机器人模块DLL
32 UE_LOG(LogCarla, Log, TEXT("Loading Dlls from: %s"), *DllDir); // 记录加载路径
33
34 // 加载DLL并检查是否成功
35 auto ChronoEngineHandle = FPlatformProcess::GetDllHandle(*ChronoEngineDll);
36 if (!ChronoEngineHandle)
37 {
38 UE_LOG(LogCarla, Warning, TEXT("Error: ChronoEngine.dll could not be loaded")); // 提示加载失败
39 }
40 auto ChronoVehicleHandle = FPlatformProcess::GetDllHandle(*ChronoVehicleDll);
41 if (!ChronoVehicleHandle)
42 {
43 UE_LOG(LogCarla, Warning, TEXT("Error: ChronoEngine_vehicle.dll could not be loaded"));
44 }
45 auto ChronoModelsHandle = FPlatformProcess::GetDllHandle(*ChronoModelsDll);
46 if (!ChronoModelsHandle)
47 {
48 UE_LOG(LogCarla, Warning, TEXT("Error: ChronoModels_vehicle.dll could not be loaded"));
49 }
50 auto ChronoRobotHandle = FPlatformProcess::GetDllHandle(*ChronoRobotDll);
51 if (!ChronoRobotHandle)
52 {
53 UE_LOG(LogCarla, Warning, TEXT("Error: ChronoModels_robot.dll could not be loaded"));
54 }
55 #endif
56}
57
58// 模块关闭函数
60{
61 if (UObjectInitialized()) // 确保对象系统已经初始化
62 {
63 UnregisterSettings(); // 注销插件设置
64 }
65}
66
67// 注册设置
69{
70 // 注册插件设置,以便开发者或艺术家在编辑器中调整
71 if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
72 {
73 // 创建一个新设置类别
74 ISettingsContainerPtr SettingsContainer = SettingsModule->GetContainer("Project");
75
76 SettingsContainer->DescribeCategory("CARLASettings",
77 LOCTEXT("RuntimeWDCategoryName", "CARLA Settings"), // 设置类别名称
78 LOCTEXT("RuntimeWDCategoryDescription", "CARLA plugin settings")); // 设置类别描述
79
80 // 注册通用设置部分
81 ISettingsSectionPtr SettingsSection = SettingsModule->RegisterSettings("Project", "CARLASettings", "General",
82 LOCTEXT("RuntimeGeneralSettingsName", "General"), // 设置部分名称
83 LOCTEXT("RuntimeGeneralSettingsDescription", "General configuration for the CARLA plugin"), // 设置部分描述
84 GetMutableDefault<UCarlaSettings>() // 获取CARLA设置的默认对象
85 );
86
87 // 注册保存处理函数,用于验证设置或对修改后的设置执行操作
88 if (SettingsSection.IsValid())
89 {
90 SettingsSection->OnModified().BindRaw(this, &FCarlaModule::HandleSettingsSaved);
91 }
92 }
93}
94
95// 注销设置
97{
98 // 确保注销所有已注册的设置,避免热重载导致的意外行为
99 if (ISettingsModule* SettingsModule = FModuleManager::GetModulePtr<ISettingsModule>("Settings"))
100 {
101 SettingsModule->UnregisterSettings("Project", "CustomSettings", "General");
102 }
103}
104
105// 处理设置保存逻辑
107{
108 UCarlaSettings* Settings = GetMutableDefault<UCarlaSettings>();
109 bool ResaveSettings = false; // 标记是否需要重新保存设置
110
111 // 验证设置值,并在无效时重新保存设置
112 if (ResaveSettings)
113 {
114 Settings->SaveConfig(); // 保存配置
115 }
116
117 return true; // 返回保存成功状态
118}
119
120#undef LOCTEXT_NAMESPACE // 取消定义本地化文本命名空间
121
122// 实现模块的加载入口
123IMPLEMENT_MODULE(FCarlaModule, Carla)
124
125// =============================================================================
126// -- 实现carla异常处理 --------------------------------------------------------
127// =============================================================================
128
129// 引入一个头文件,用于禁用Unreal Engine 4(UE4)的宏定义,避免宏冲突
130#include <compiler/disable-ue4-macros.h>
131// 引入Carla库中定义的异常处理相关头文件
132#include <carla/Exception.h>
133// 引入另一个头文件,用于重新启用之前被禁用的UE4宏定义
135// 引入C++标准库中的异常处理头文件
136#include <exception>
137
138// 定义命名空间carla,封装Carla相关的代码
139namespace carla {
140
141// 定义一个函数,用于抛出并处理异常
142 void throw_exception(const std::exception &e) {
143 // 使用UE_LOG记录异常信息,并以Fatal级别终止程序
144 UE_LOG(LogCarla, Fatal, TEXT("Exception thrown: %s"), UTF8_TO_TCHAR(e.what()));
145 // 调用std::terminate()立即终止程序
146 // 理论上程序不应该到达这里
147 std::terminate();
148 }
149
150} // 命名空间carla结束
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
DEFINE_LOG_CATEGORY(LogCarla)
void RegisterSettings()
Definition Carla.cpp:68
void UnregisterSettings()
Definition Carla.cpp:96
virtual void ShutdownModule() override
Definition Carla.cpp:59
void LoadChronoDll()
Definition Carla.cpp:23
virtual void StartupModule() override
IModuleInterface实现
Definition Carla.cpp:16
bool HandleSettingsSaved()
Definition Carla.cpp:106
Carla 的全局设置
CARLA模拟器的主命名空间。
Definition Carla.cpp:139
void throw_exception(const std::exception &e)
Definition Carla.cpp:142