CARLA
 
载入中...
搜索中...
未找到
GnssSensor.cpp
浏览该文件的文档.
1// Copyright (c) 2019 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"
13
15#include "carla/geom/Vector3D.h"
16#include "carla/ros2/ROS2.h"
18
19// GNSS传感器的构造函数,初始化随机数引擎和允许每帧调用Tick函数
20AGnssSensor::AGnssSensor(const FObjectInitializer &ObjectInitializer)
21 : Super(ObjectInitializer)
22{
23 PrimaryActorTick.bCanEverTick = true; // 启用每帧调用Tick
24 RandomEngine = CreateDefaultSubobject<URandomEngine>(TEXT("RandomEngine")); // 创建随机引擎对象
25}
26
27// 获取传感器的定义信息
32
33// 设置传感器属性
34void AGnssSensor::Set(const FActorDescription &ActorDescription)
35{
36 Super::Set(ActorDescription); // 调用父类的Set方法
37 UActorBlueprintFunctionLibrary::SetGnss(ActorDescription, this); // 使用蓝图函数库设置GNSS属性
38}
39
40// 在物理更新后调用,用于处理GNSS逻辑
41void AGnssSensor::PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaSeconds)
42{
43 TRACE_CPUPROFILER_EVENT_SCOPE(AGnssSensor::PostPhysTick);
44
45 FVector ActorLocation = GetActorLocation(); // 获取传感器的当前位置
47 if (LargeMap) // 如果有大地图管理器,则转换局部坐标到全局坐标
48 {
49 ActorLocation = LargeMap->LocalToGlobalLocation(ActorLocation);
50 }
51 carla::geom::Location Location = ActorLocation;
52 carla::geom::GeoLocation CurrentLocation = CurrentGeoReference.Transform(Location); // 转换为地理坐标
53
54 // 计算传感器噪声
55 const float LatError = RandomEngine->GetNormalDistribution(0.0f, LatitudeDeviation);
56 const float LonError = RandomEngine->GetNormalDistribution(0.0f, LongitudeDeviation);
57 const float AltError = RandomEngine->GetNormalDistribution(0.0f, AltitudeDeviation);
58
59 // 应用噪声和偏差
60 double Latitude = CurrentLocation.latitude + LatitudeBias + LatError;
61 double Longitude = CurrentLocation.longitude + LongitudeBias + LonError;
62 double Altitude = CurrentLocation.altitude + AltitudeBias + AltError;
63
64 auto Stream = GetDataStream(*this); // 获取数据流
65
66 // 如果启用了ROS2,将数据发送到ROS2系统
67 #if defined(WITH_ROS2)
69 if (ROS2->IsEnabled())
70 {
71 TRACE_CPUPROFILER_EVENT_SCOPE_STR("ROS2 Send");
73 AActor* ParentActor = GetAttachParentActor();
74 if (ParentActor) // 如果有父实体,计算相对变换并发送数据
75 {
76 FTransform LocalTransformRelativeToParent = GetActorTransform().GetRelativeTransform(ParentActor->GetActorTransform());
77 ROS2->ProcessDataFromGNSS(Stream.GetSensorType(), StreamId, LocalTransformRelativeToParent, carla::geom::GeoLocation{Latitude, Longitude, Altitude}, this);
78 }
79 else // 如果没有父实体,直接发送全局变换数据
80 {
81 ROS2->ProcessDataFromGNSS(Stream.GetSensorType(), StreamId, Stream.GetSensorTransform(), carla::geom::GeoLocation{Latitude, Longitude, Altitude}, this);
82 }
83 }
84 #endif
85 {
86 TRACE_CPUPROFILER_EVENT_SCOPE_STR("AGnssSensor Stream Send");
87 Stream.SerializeAndSend(*this, carla::geom::GeoLocation{Latitude, Longitude, Altitude}); // 发送数据流
88 }
89}
90
91// 设置纬度偏差
93{
94 LatitudeDeviation = Value;
95}
96
97// 设置经度偏差
99{
100 LongitudeDeviation = Value;
101}
102
103// 设置高度偏差
105{
106 AltitudeDeviation = Value;
107}
108
109// 设置纬度偏移量
111{
112 LatitudeBias = Value;
113}
114
115// 设置经度偏移量
117{
118 LongitudeBias = Value;
119}
120
121// 设置高度偏移量
123{
124 AltitudeBias = Value;
125}
126
127// 获取纬度偏差
129{
130 return LatitudeDeviation;
131}
132
133// 获取经度偏差
135{
136 return LongitudeDeviation;
137}
138
139// 获取高度偏差
141{
142 return AltitudeDeviation;
143}
144
145// 获取纬度偏移量
147{
148 return LatitudeBias;
149}
150
151// 获取经度偏移量
153{
154 return LongitudeBias;
155}
156
157// 获取高度偏移量
159{
160 return AltitudeBias;
161}
162
163// 游戏开始时调用,初始化传感器的地理参考
165{
166 Super::BeginPlay();
167
168 const UCarlaEpisode* episode = UCarlaStatics::GetCurrentEpisode(GetWorld()); // 获取当前场景
169 CurrentGeoReference = episode->GetGeoReference(); // 初始化地理参考
170}
171
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
float GetLongitudeDeviation() const
carla::geom::GeoLocation CurrentGeoReference
Definition GnssSensor.h:60
float GetAltitudeBias() const
float LongitudeBias
Definition GnssSensor.h:67
void SetLatitudeDeviation(float Value)
float GetAltitudeDeviation() const
void SetLongitudeBias(float Value)
virtual void PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaSeconds) override
float LatitudeBias
Definition GnssSensor.h:66
float LatitudeDeviation
Definition GnssSensor.h:62
void SetLongitudeDeviation(float Value)
void SetAltitudeDeviation(float Value)
float AltitudeBias
Definition GnssSensor.h:68
float GetLatitudeDeviation() const
float GetLongitudeBias() const
void Set(const FActorDescription &ActorDescription)
float GetLatitudeBias() const
void SetAltitudeBias(float Value)
float AltitudeDeviation
Definition GnssSensor.h:64
void SetLatitudeBias(float Value)
virtual void BeginPlay() override
float LongitudeDeviation
Definition GnssSensor.h:63
static FActorDefinition GetSensorDefinition()
AGnssSensor(const FObjectInitializer &ObjectInitializer)
FVector LocalToGlobalLocation(const FVector &InLocation) const
auto GetToken() const
Return the token that allows subscribing to this sensor's stream.
FAsyncDataStream GetDataStream(const SensorT &Self)
Return the FDataStream associated with this sensor.
URandomEngine * RandomEngine
Random Engine used to provide noise for sensor output.
uint64_t GetSensorType()
Definition DataStream.h:58
static FActorDefinition MakeGnssDefinition()
创建一个全球导航卫星系统传感器参与者定义。
static void SetGnss(const FActorDescription &Description, AGnssSensor *Gnss)
static ALargeMapManager * GetLargeMapManager(const UObject *WorldContextObject)
static UCarlaEpisode * GetCurrentEpisode(const UObject *WorldContextObject)
float GetNormalDistribution(float Mean, float StandardDeviation)
double altitude
经度,初始化为0.0。
Definition GeoLocation.h:27
GeoLocation Transform(const Location &location) const
使用此对象作为地理参考,将给定的 location 转换为 GeoLocation。
double latitude
定义 GeoLocation 类,它是一个公开的成员。
Definition GeoLocation.h:23
double longitude
纬度,初始化为0.0。
Definition GeoLocation.h:25
static std::shared_ptr< ROS2 > GetInstance()
Definition ROS2.h:51
静态断言,用于确保token_data结构体的大小与Token::data的大小相同。
const auto & get_stream_id() const
获取流ID的引用。