20#include "DrawDebugHelpers.h"
21#include "Engine/CollisionProfile.h"
22#include "Runtime/Engine/Classes/Kismet/KismetMathLibrary.h"
31 : Super(ObjectInitializer) {
33 RandomEngine = CreateDefaultSubobject<URandomEngine>(TEXT(
"RandomEngine"));
42 Set(LidarDescription);
64 auto SensorTransform = DataStream.GetSensorTransform();
67 TRACE_CPUPROFILER_EVENT_SCOPE_STR(
"Send Stream");
68 DataStream.SerializeAndSend(*
this, LidarData, DataStream.PopBufferFromPool());
71 #if defined(WITH_ROS2)
73 if (ROS2->IsEnabled())
75 TRACE_CPUPROFILER_EVENT_SCOPE_STR(
"ROS2 Send");
77 AActor* ParentActor = GetAttachParentActor();
80 FTransform LocalTransformRelativeToParent = GetActorTransform().GetRelativeTransform(ParentActor->GetActorTransform());
81 ROS2->ProcessDataFromLidar(DataStream.GetSensorType(), StreamId, LocalTransformRelativeToParent, LidarData,
this);
85 ROS2->ProcessDataFromLidar(DataStream.GetSensorType(), StreamId, SensorTransform, LidarData,
this);
96 const float Distance = HitPoint.
Length();
99 const float AbsAtm = exp(-AttenAtm * Distance);
101 const float IntRec = AbsAtm;
109 const FVector HitPoint = HitInfo.ImpactPoint;
110 Detection.point = SensorTransf.Inverse().TransformPosition(HitPoint);
112 const float Distance = Detection.point.Length();
115 const float AbsAtm = exp(-AttenAtm * Distance);
117 const float IntRec = AbsAtm;
119 Detection.intensity = IntRec;
125 Super::PreprocessRays(Channels, MaxPointsPerChannel);
127 for (
auto ch = 0u; ch < Channels; ch++) {
128 for (
auto p = 0u; p < MaxPointsPerChannel; p++) {
137 const auto ForwardVector = Detection.point.MakeUnitVector();
139 Detection.point += Noise;
142 const float Intensity = Detection.intensity;
159 LidarData.WritePointSync(Detection);
TSharedPtr< const FActorInfo > carla::rpc::ActorState UWorld * World
carla::sensor::data::LidarData FLidarData
static FActorDefinition GetSensorDefinition()
float ComputeIntensity(const FSemanticDetection &RawDetection) const
计算激光点的接收强度
bool PostprocessDetection(FDetection &Detection) const
void PreprocessRays(uint32_t Channels, uint32_t MaxPointsPerChannel) override
Method that allow to preprocess if the rays will be traced.
float DropOffAlpha
激光点强度的衰减斜率,通过衰减限制和零强度衰减来计算 点的强度保持概率为 alpha * 强度 + beta,其中 alpha = (1 - dropoff_zero_intensity) / drop...
virtual void Set(const FActorDescription &Description) override
bool DropOffGenActive
启用/禁用激光雷达点的掉落效果
ARayCastLidar(const FObjectInitializer &ObjectInitializer)
virtual void PostPhysTick(UWorld *World, ELevelTick TickType, float DeltaTime)
carla::sensor::data::LidarDetection FDetection
void ComputeAndSaveDetections(const FTransform &SensorTransform) override
This method uses all the saved FHitResults, compute the RawDetections and then send it to the LidarDa...
FDetection ComputeDetection(const FHitResult &HitInfo, const FTransform &SensorTransf) const
std::vector< uint32_t > PointsPerChannel
void SimulateLidar(const float DeltaTime)
Updates LidarMeasurement with the points read in DeltaTime.
void CreateLasers()
Creates a Laser for each channel.
std::vector< std::vector< bool > > RayPreprocessCondition
std::vector< std::vector< FHitResult > > RecordedHits
FLidarDescription Description
virtual void Set(const FActorDescription &Description)
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.
void SetSeed(int32 InSeed)
static void SetLidar(const FActorDescription &Description, FLidarDescription &Lidar)
static FActorDefinition MakeLidarDefinition(const FString &Id)
创建一个激光雷达参与者定义。
float GetNormalDistribution(float Mean, float StandardDeviation)
static std::shared_ptr< ROS2 > GetInstance()
Helper class to store and serialize the data generated by a RawLidar.
静态断言,用于确保token_data结构体的大小与Token::data的大小相同。
const auto & get_stream_id() const
获取流ID的引用。
float DropOffAtZeroIntensity
对于基于强度的下降,每个零强度点被下降的概率。
int RandomSeed
该传感器使用的噪声/丢弃的随机种子。
float DropOffGenRate
随机丢弃的点的一般比例。
float DropOffIntensityLimit
对于基于强度的下降,高于该阈值的强度值没有任何点被下降。
float AtmospAttenRate
大气中的衰减率(单位:m^-1)