CARLA
 
载入中...
搜索中...
未找到
CarlaSettings.cpp
浏览该文件的文档.
1// Copyright (c) 2017 Computer Vision Center (CVC) at the Universitat Autonoma
2// de Barcelona (UAB).
3//
4// This work is licensed under the terms of the MIT license.
5// For a copy, see <https://opensource.org/licenses/MIT>.
6
7#include "Carla.h"
9
10#include "Carla/Util/IniFile.h"
11
12#include "CommandLine.h"
13#include "Engine/DirectionalLight.h"
14#include "Engine/Engine.h"
15#include "Engine/PointLight.h"
16#include "Engine/PostProcessVolume.h"
17#include "Engine/StaticMesh.h"
18#include "Kismet/GameplayStatics.h"
19#include "Materials/MaterialInstance.h"
20#include "Package.h"
21#include "UnrealMathUtility.h"
22
23// 初始化设置文件(INI file)段
24#define S_CARLA_SERVER TEXT("CARLA/Server")
25#define S_CARLA_QUALITYSETTINGS TEXT("CARLA/QualitySettings")
26
27// =============================================================================
28// -- 静态变量 & 常量 -----------------------------------------------------------
29// =============================================================================
30
31const FName UCarlaSettings::CARLA_ROAD_TAG = FName("CARLA_ROAD");
32const FName UCarlaSettings::CARLA_SKY_TAG = FName("CARLA_SKY");
33
34// =============================================================================
35// -- 静态方法 ------------------------------------------------------------------
36// =============================================================================
37// 定义一个静态函数,用于将字符串转换为质量等级枚举值
38// 参数:
39// - SQualitySettingsLevel:一个FString类型的字符串,表示质量等级的设置
40// - Default:一个EQualityLevel类型的默认值,当字符串不匹配任何已知质量等级时返回此值,默认为EQualityLevel::INVALID
42 const FString &SQualitySettingsLevel,
43 const EQualityLevel Default = EQualityLevel::INVALID)
44{
45 // 如果输入字符串等于"Low",则返回EQualityLevel::Low
46 if (SQualitySettingsLevel.Equals("Low"))
47 {
48 return EQualityLevel::Low;
49 }
50 // 如果输入字符串等于"Epic",则返回EQualityLevel::Epic
51 if (SQualitySettingsLevel.Equals("Epic"))
52 {
54 }
55 // 如果字符串不匹配"Low"或"Epic",则返回传入的默认值
56 return Default;
57}
58// 定义一个函数,用于将质量等级枚举值转换为字符串
59// 参数:
60// - QualitySettingsLevel:一个EQualityLevel类型的质量等级枚举值
61FString QualityLevelToString(EQualityLevel QualitySettingsLevel)
62{
63 // 尝试在项目的任何包中找到名为"EQualityLevel"的枚举类型对象
64 const UEnum *ptr = FindObject<UEnum>(ANY_PACKAGE, TEXT("EQualityLevel"), true);
65 // 如果未找到该枚举类型对象,则返回"Invalid"字符串
66 if (!ptr)
67 {
68 return FString("Invalid");
69 }
70 // 返回与传入的质量等级枚举值对应的枚举项名称字符串
71 // 这里使用static_cast<int32>将枚举值转换为索引值
72 return ptr->GetNameStringByIndex(static_cast<int32>(QualitySettingsLevel));
73}
74
76 const FIniFile &ConfigFile,
77 UCarlaSettings &Settings,
78 const bool bLoadCarlaServerSection)
79{
80 // CarlaServer.
81 if (bLoadCarlaServerSection)
82 {
83 ConfigFile.GetInt(S_CARLA_SERVER, TEXT("WorldPort"), Settings.RPCPort);
84 ConfigFile.GetInt(S_CARLA_SERVER, TEXT("RPCPort"), Settings.RPCPort);
85 Settings.StreamingPort = Settings.RPCPort + 1u;
86 Settings.SecondaryPort = Settings.RPCPort + 2u;
87 ConfigFile.GetInt(S_CARLA_SERVER, TEXT("StreamingPort"), Settings.StreamingPort);
88 ConfigFile.GetInt(S_CARLA_SERVER, TEXT("SecondaryPort"), Settings.SecondaryPort);
89 FString Tmp;
90 ConfigFile.GetString(S_CARLA_SERVER, TEXT("PrimaryIP"), Tmp);
91 Settings.PrimaryIP = TCHAR_TO_UTF8(*Tmp);
92 ConfigFile.GetInt(S_CARLA_SERVER, TEXT("PrimaryPort"), Settings.PrimaryPort);
93 }
94 ConfigFile.GetBool(S_CARLA_SERVER, TEXT("SynchronousMode"), Settings.bSynchronousMode);
95 ConfigFile.GetBool(S_CARLA_SERVER, TEXT("DisableRendering"), Settings.bDisableRendering);
96 // 画质配置 QualitySettings.
97 FString sQualityLevel;
98 ConfigFile.GetString(S_CARLA_QUALITYSETTINGS, TEXT("QualityLevel"), sQualityLevel);
99 Settings.SetQualityLevel(QualityLevelFromString(sQualityLevel));
100}
101
102static bool GetSettingsFilePathFromCommandLine(FString &Value)
103{
104 if (FParse::Value(FCommandLine::Get(), TEXT("-carla-settings="), Value))
105 {
106 if (FPaths::IsRelative(Value))
107 {
108 Value = FPaths::ConvertRelativePathToFull(FPaths::LaunchDir(), Value);
109 }
110 return true;
111 }
112 return false;
113}
114
115// =============================================================================
116// -- UCarlaSettings -----------------------------------------------------------
117// =============================================================================
118
120{
121 CurrentFileName = TEXT("");
122 // 如果存在,则从项目配置文件夹加载设置。
123 LoadSettingsFromFile(FPaths::Combine(FPaths::ProjectConfigDir(), TEXT("CarlaSettings.ini")), false);
124 // 如果提供,则加载命令行参数给出的设置。
125 {
126 FString FilePath;
128 {
129 LoadSettingsFromFile(FilePath, true);
130 }
131 }
132 // 从命令行覆盖设置。
133 {
134 uint32 Value;
135 if (FParse::Value(FCommandLine::Get(), TEXT("-world-port="), Value) ||
136 FParse::Value(FCommandLine::Get(), TEXT("-carla-port="), Value) ||
137 FParse::Value(FCommandLine::Get(), TEXT("-carla-rpc-port="), Value) ||
138 FParse::Value(FCommandLine::Get(), TEXT("-carla-world-port="), Value))
139 {
140 // 默认情况下,流媒体服务的端口是RPC端口+1,辅助服务器端口是RPC端口+2
141 RPCPort = Value;
142 StreamingPort = Value + 1u;
143 SecondaryPort = Value + 2u;
144 }
145 if (FParse::Value(FCommandLine::Get(), TEXT("-carla-streaming-port="), Value))
146 {
147 StreamingPort = Value;
148 }
149 if (FParse::Value(FCommandLine::Get(), TEXT("-carla-secondary-port="), Value))
150 {
151 SecondaryPort = Value;
152 }
153 FString Tmp;
154 if (FParse::Value(FCommandLine::Get(), TEXT("-carla-primary-host="), Tmp))
155 {
156 PrimaryIP = TCHAR_TO_UTF8(*Tmp);
157 }
158 if (FParse::Value(FCommandLine::Get(), TEXT("-carla-primary-port="), Value))
159 {
160 PrimaryPort = Value;
161 }
162 FString StringQualityLevel;
163 if (FParse::Value(FCommandLine::Get(), TEXT("-quality-level="), StringQualityLevel))
164 {
166 }
167 if (FParse::Param(FCommandLine::Get(), TEXT("-no-rendering")))
168 {
169 bDisableRendering = true;
170 }
171 if (FParse::Param(FCommandLine::Get(), TEXT("-ros2")))
172 {
173 ROS2 = true;
174 }
175 }
176}
177
178// 从字符串加载CARLA设置的函数
179void UCarlaSettings::LoadSettingsFromString(const FString &INIFileContents)
180{
181 // 记录日志:从字符串加载CARLA设置
182 UE_LOG(LogCarla, Log, TEXT("Loading CARLA settings from string"));
183 // 创建配置文件对象
184 FIniFile ConfigFile;
185 // 处理输入文件内容
186 ConfigFile.ProcessInputFileContents(INIFileContents);
187 // 假设加载CARLAR服务器部分失败
188 constexpr bool bLoadCarlaServerSection = false;
189 // 从配置文件加载CARLA服务器部分
190 LoadSettingsFromConfig(ConfigFile, *this, bLoadCarlaServerSection);
191 // 当前文件名,这里使用了一个固定的字符串
192 CurrentFileName = TEXT("<string-provided-by-client>");
193}
194
196{
197 // 定义一个lambda表达式,根据布尔值返回"Enabled"或"Disabled"
198 auto EnabledDisabled = [](bool bValue) { return (bValue ? TEXT("Enabled") : TEXT("Disabled")); };
199 UE_LOG(LogCarla, Log,
200 TEXT("== CARLA Settings =============================================================="));
201 UE_LOG(LogCarla, Log, TEXT("Last settings file loaded: %s"), *CurrentFileName);
202 UE_LOG(LogCarla, Log, TEXT("[%s]"), S_CARLA_SERVER);
203 UE_LOG(LogCarla, Log, TEXT("RPC Port = %d"), RPCPort);
204 UE_LOG(LogCarla, Log, TEXT("Streaming Port = %d"), StreamingPort);
205 UE_LOG(LogCarla, Log, TEXT("Secondary Port = %d"), SecondaryPort);
206 UE_LOG(LogCarla, Log, TEXT("Synchronous Mode = %s"), EnabledDisabled(bSynchronousMode));
207 UE_LOG(LogCarla, Log, TEXT("Rendering = %s"), EnabledDisabled(!bDisableRendering));
208 UE_LOG(LogCarla, Log, TEXT("[%s]"), S_CARLA_QUALITYSETTINGS);
209 UE_LOG(LogCarla, Log, TEXT("Quality Level = %s"), *QualityLevelToString(QualityLevel));
210 UE_LOG(LogCarla, Log,
211 TEXT("================================================================================"));
212}
213
214#undef S_CARLA_QUALITYSETTINGS
215#undef S_CARLA_SERVER
216
217void UCarlaSettings::LoadSettingsFromFile(const FString &FilePath, const bool bLogOnFailure)
218{
219 if (FPaths::FileExists(FilePath))
220 {
221 // 记录日志:从文件路径加载CARLA设置
222 UE_LOG(LogCarla, Log, TEXT("Loading CARLA settings from \"%s\""), *FilePath);
223 // 创建配置文件对象
224 const FIniFile ConfigFile(FilePath);
225 // 设置加载CARLA服务器部分的标志为true
226 constexpr bool bLoadCarlaServerSection = true;
227 // 从配置文件加载设置
228 LoadSettingsFromConfig(ConfigFile, *this, bLoadCarlaServerSection);
229 // 设置当前文件名
230 CurrentFileName = FilePath;
231 }
232 else if (bLogOnFailure)
233 {
234 // 记录错误日志:无法找到设置文件
235 UE_LOG(LogCarla, Error, TEXT("Unable to find settings file \"%s\""), *FilePath);
236 }
237}
UE_LOG(LogCarla, Log, TEXT("UActorDispatcher::Destroying actor: '%s' %x"), *Id, Actor)
static bool GetSettingsFilePathFromCommandLine(FString &Value)
#define S_CARLA_QUALITYSETTINGS
#define S_CARLA_SERVER
static void LoadSettingsFromConfig(const FIniFile &ConfigFile, UCarlaSettings &Settings, const bool bLoadCarlaServerSection)
static EQualityLevel QualityLevelFromString(const FString &SQualitySettingsLevel, const EQualityLevel Default=EQualityLevel::INVALID)
FString QualityLevelToString(EQualityLevel QualitySettingsLevel)
EQualityLevel
void ProcessInputFileContents(const FString &INIFileContents)
Definition IniFile.h:70
void GetBool(const TCHAR *Section, const TCHAR *Key, bool &Target) const
Definition IniFile.h:145
void GetString(const TCHAR *Section, const TCHAR *Key, FString &Target) const
Definition IniFile.h:132
void GetInt(const TCHAR *Section, const TCHAR *Key, T &Target) const
Definition IniFile.h:118
Carla 的全局设置
uint32 StreamingPort
流媒体端口的设置。
void LoadSettings()
根据命令行参数和 INI 文件(如果提供)加载设置。
std::string PrimaryIP
设置要连接的主服务器的IP和端口。
bool bDisableRendering
启用或禁用世界的视窗渲染。默认情况下禁用。
uint32 RPCPort
用于监听客户端连接的世界端口。
static const FName CARLA_SKY_TAG
CARLA_SKY 名称用于标记场景中的天空球(sky sphere, BPS)参与者。
FString CurrentFileName
用于加载此设置的设置文件的文件名。如果没有使用则为空。
void SetQualityLevel(EQualityLevel InQualityLevel)
设置新的质量设置级别并在游戏中进行与之相关的更改。
void LoadSettingsFromFile(const FString &FilePath, bool bLogOnFailure)
bool bSynchronousMode
在同步模式下,CARLA 会等待每个节拍信号,直到收到来自客户端的控制。
void LogSettings() const
记录设置值。
static const FName CARLA_ROAD_TAG
CARLA_ROAD 名称用于标记道路网格参与者。
EQualityLevel QualityLevel
画质设置等级
uint32 SecondaryPort
辅助服务器端口的设置。
void LoadSettingsFromString(const FString &INIFileContents)
从给定的字符串(格式为 INI)加载设置。CarlaServer 部分被忽略。